mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
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:
parent
b3fbfe8196
commit
0c6d82e979
@ -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]
|
||||||
|
36
nss/getent.c
36
nss/getent.c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user