This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] nss: getent: Print IPv6 scope ID for ahosts/ahostsv6 if available
- From: Florian Weimer <fweimer at redhat dot com>
- To: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- Cc: libc-alpha at sourceware dot org
- Date: Fri, 01 Feb 2019 17:38:20 +0100
- Subject: Re: [PATCH] nss: getent: Print IPv6 scope ID for ahosts/ahostsv6 if available
- References: <875zu4d7x0.fsf@oldenburg2.str.redhat.com> <8798d68d-412e-a9d8-28bd-3f7bfd675c8c@linaro.org>
* 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;
}