diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-02-12 14:26:20 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-02-12 14:26:20 +0100 |
commit | 0c6d82e979d562147c9cfe0e6f65b42a904288bc (patch) | |
tree | 14051a133b67fdc235285627ae7818d95cffb762 | |
parent | b3fbfe81961a1d14d7b54d1c9757e1f487073bcb (diff) | |
download | glibc-0c6d82e979d562147c9cfe0e6f65b42a904288bc.tar glibc-0c6d82e979d562147c9cfe0e6f65b42a904288bc.tar.gz glibc-0c6d82e979d562147c9cfe0e6f65b42a904288bc.tar.bz2 glibc-0c6d82e979d562147c9cfe0e6f65b42a904288bc.zip |
nss: getent: Print IPv6 scope ID for ahosts/ahostsv6 if available
This information is sometimes useful and actually required for
link-local addresses.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | nss/getent.c | 36 |
2 files changed, 32 insertions, 8 deletions
@@ -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] diff --git a/nss/getent.c b/nss/getent.c index f25de8f1fc..07a7d09795 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,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; } |