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> 2019-02-12 Adhemerval Zanella <adhemerval.zanella@linaro.org>
[BZ #24122] [BZ #24122]

View File

@ -40,6 +40,7 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <scratch_buffer.h> #include <scratch_buffer.h>
#include <inttypes.h>
/* Get libc version number. */ /* Get libc version number. */
#include <version.h> #include <version.h>
@ -393,15 +394,34 @@ ahosts_keys_int (int af, int xflags, int number, char *key[])
sockstr = sockbuf; 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]; char buf[INET6_ADDRSTRLEN];
printf ("%-15s %-6s %s\n", if (inet_ntop (runp->ai_family,
inet_ntop (runp->ai_family, runp->ai_family == AF_INET
runp->ai_family == AF_INET ? (void *) &((struct sockaddr_in *) runp->ai_addr)->sin_addr
? (void *) &((struct sockaddr_in *) runp->ai_addr)->sin_addr : &addr6->sin6_addr,
: (void *) &((struct sockaddr_in6 *) runp->ai_addr)->sin6_addr, buf, sizeof (buf)) == NULL)
buf, sizeof (buf)), {
sockstr, strcpy (buf, "<invalid>");
runp->ai_canonname ?: ""); 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; runp = runp->ai_next;
} }