]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nss: getent: Print IPv6 scope ID for ahosts/ahostsv6 if available
authorFlorian Weimer <fweimer@redhat.com>
Tue, 12 Feb 2019 13:26:20 +0000 (14:26 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 12 Feb 2019 13:26:20 +0000 (14:26 +0100)
This information is sometimes useful and actually required for
link-local addresses.

ChangeLog
nss/getent.c

index 46c219839b20f5d3fc9bd9219b4bf9d436bf38f3..77b45871969a05ba9b466663c8e0677281515914 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]
index f25de8f1fccc0fc7d2382df05ab3eaa4eb7d36b6..07a7d09795c1c2e0bb138d6e097ba6604af64014 100644 (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;
            }