This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] nss: getent: Print IPv6 scope ID for ahosts/ahostsv6 if available


* Adhemerval Zanella:

> On 31/01/2019 16:00, Florian Weimer wrote:
>> 2019-01-31  Florian Weimer  <fweimer@redhat.com>
>> 
>> 	* nss/getent.c (ahosts_keys_int): Include IPv6 scope ID in output.
>> 
>> diff --git a/nss/getent.c b/nss/getent.c
>> index f25de8f1fc..1159ba2636 100644
>> --- a/nss/getent.c
>> +++ b/nss/getent.c
>> @@ -393,14 +393,24 @@ ahosts_keys_int (int af, int xflags, int number, char *key[])
>>  		  sockstr = sockbuf;
>>  		}
>>  
>> +	      char scope_buf[3 * sizeof (unsigned long long int) + 2];
>> +	      struct sockaddr_in6 *addr6
>> +		= (struct sockaddr_in6 *) runp->ai_addr;
>> +	      if (runp->ai_family != AF_INET6 || addr6->sin6_scope_id == 0)
>> +		/* No scope ID present.  */
>> +		scope_buf[0] = '\0';
>> +	      else
>> +		snprintf (scope_buf, sizeof (scope_buf), "%%%llu",
>> +			  (unsigned long long int) addr6->sin6_scope_id);
>
> sin6_scope_id is defines as uint32_t regardless, why not use PRIu32?

Fair enough.  I also had to change the way the padding is produced.

Thanks,
Florian

nss: getent: Print IPv6 scope ID for ahosts/ahostsv6 if available

2019-02-01  Florian Weimer  <fweimer@redhat.com>

	* nss/getent.c (ahosts_keys_int): Include IPv6 scope ID in output.

diff --git a/nss/getent.c b/nss/getent.c
index f25de8f1fc..892748656b 100644
--- a/nss/getent.c
+++ b/nss/getent.c
@@ -40,6 +40,7 @@
 #include <netinet/in.h>
 #include <sys/socket.h>
 #include <scratch_buffer.h>
+#include <inttypes.h>
 
 /* Get libc version number.  */
 #include <version.h>
@@ -393,15 +394,30 @@ ahosts_keys_int (int af, int xflags, int number, char *key[])
 		  sockstr = sockbuf;
 		}
 
+	      char scope[3 * sizeof (uint32_t) + 2];
+	      struct sockaddr_in6 *addr6
+		= (struct sockaddr_in6 *) runp->ai_addr;
+	      if (runp->ai_family != AF_INET6 || addr6->sin6_scope_id == 0)
+		/* No scope ID present.  */
+		scope[0] = '\0';
+	      else
+		snprintf (scope, sizeof (scope), "%%%" PRIu32,
+			  addr6->sin6_scope_id);
+
 	      char buf[INET6_ADDRSTRLEN];
-	      printf ("%-15s %-6s %s\n",
-		      inet_ntop (runp->ai_family,
-				 runp->ai_family == AF_INET
-				 ? (void *) &((struct sockaddr_in *) runp->ai_addr)->sin_addr
-				 : (void *) &((struct sockaddr_in6 *) runp->ai_addr)->sin6_addr,
-				 buf, sizeof (buf)),
-		      sockstr,
-		      runp->ai_canonname ?: "");
+	      if (inet_ntop (runp->ai_family,
+			     runp->ai_family == AF_INET
+			     ? (void *) &((struct sockaddr_in *) runp->ai_addr)->sin_addr
+			     : &addr6->sin6_addr,
+			     buf, sizeof (buf)) == NULL)
+		strcpy (buf, "<invalid>");
+
+	      int pad = 15 - strlen (buf) - strlen (scope);
+	      if (pad < 0)
+		pad = 0;
+
+	      printf ("%s%-*s %-6s %s\n",
+		      buf, pad, scope, sockstr, runp->ai_canonname ?: "");
 
 	      runp = runp->ai_next;
 	    }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]