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
On 01/02/2019 14:38, Florian Weimer wrote:
> * 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];
I would prefer something more explicit as:
/* It requires to hold a uint32_t plus a '%'. */
cat scope[((CHAR_BIT * sizeof(uint32_t) / 3) + 3) + 1];
But I don't have a strong opinion here.
> + 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;
Not fun of the magic constant, but it came from original code anyway.
> +
> + printf ("%s%-*s %-6s %s\n",
> + buf, pad, scope, sockstr, runp->ai_canonname ?: "");
Do we need to print the scope for invalid address as well?
>
> runp = runp->ai_next;
> }
>