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

This information is sometimes useful and actually required for
link-local addresses.
This commit is contained in:
Florian Weimer 2019-02-12 14:26:20 +01:00
parent b3fbfe8196
commit 0c6d82e979
2 changed files with 32 additions and 8 deletions

View File

@ -1,3 +1,7 @@
2019-02-12 Florian Weimer <fweimer@redhat.com>
* nss/getent.c (ahosts_keys_int): Include IPv6 scope ID in output.
2019-02-12 Adhemerval Zanella <adhemerval.zanella@linaro.org>
[BZ #24122]

View File

@ -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,34 @@ ahosts_keys_int (int af, int xflags, int number, char *key[])
sockstr = sockbuf;
}
/* Three digits per byte, plus '%' and null terminator. */
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>");
scope[0] = '\0';
}
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;
}