aboutsummaryrefslogtreecommitdiff
path: root/resolv/tst-resolv-basic.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-05-11 11:32:16 +0200
committerFlorian Weimer <fweimer@redhat.com>2017-05-11 11:51:34 +0200
commit8ec69bb7ecf3ca5edde5b7d9d7d5d3a5f8b6c405 (patch)
tree7c8875439ed455ff72491a5f73c4099afe83272c /resolv/tst-resolv-basic.c
parent46ce8881ade788db56079622f47f648d4aaa003b (diff)
downloadglibc-8ec69bb7ecf3ca5edde5b7d9d7d5d3a5f8b6c405.tar
glibc-8ec69bb7ecf3ca5edde5b7d9d7d5d3a5f8b6c405.tar.gz
glibc-8ec69bb7ecf3ca5edde5b7d9d7d5d3a5f8b6c405.tar.bz2
glibc-8ec69bb7ecf3ca5edde5b7d9d7d5d3a5f8b6c405.zip
support_format_addrinfo: Fix flags and canonname formatting
The address family splitting via format_ai_family made unpredictable the place where the canonname field was printed. This commit adjusts the implementation so that the ai_flags is checked for consistency across the list, and ai_canonname must only be present on the first list element. Tests for AI_CANONNAME are added to resolv/tst-resolv-basic.
Diffstat (limited to 'resolv/tst-resolv-basic.c')
-rw-r--r--resolv/tst-resolv-basic.c71
1 files changed, 67 insertions, 4 deletions
diff --git a/resolv/tst-resolv-basic.c b/resolv/tst-resolv-basic.c
index f2b1fc7490..92f912beed 100644
--- a/resolv/tst-resolv-basic.c
+++ b/resolv/tst-resolv-basic.c
@@ -182,12 +182,12 @@ check_h (const char *name, int family, const char *expected)
}
static void
-check_ai (const char *name, const char *service,
- int family, const char *expected)
+check_ai_hints (const char *name, const char *service,
+ struct addrinfo hints, const char *expected)
{
- struct addrinfo hints = {.ai_family = family};
struct addrinfo *ai;
- char *query = xasprintf ("%s:%s [%d]", name, service, family);
+ char *query = xasprintf ("%s:%s [%d]/0x%x", name, service,
+ hints.ai_family, hints.ai_flags);
int ret = getaddrinfo (name, service, &hints, &ai);
check_addrinfo (query, ai, ret, expected);
if (ret == 0)
@@ -195,6 +195,15 @@ check_ai (const char *name, const char *service,
free (query);
}
+static void
+check_ai (const char *name, const char *service,
+ int family, const char *expected)
+{
+ return check_ai_hints (name, service,
+ (struct addrinfo) { .ai_family = family, },
+ expected);
+}
+
static int
do_test (void)
{
@@ -229,6 +238,17 @@ do_test (void)
"address: STREAM/TCP 2001:db8::1 80\n"
"address: DGRAM/UDP 2001:db8::1 80\n"
"address: RAW/IP 2001:db8::1 80\n");
+ check_ai_hints ("www.example", "80",
+ (struct addrinfo) { .ai_family = AF_UNSPEC,
+ .ai_flags = AI_CANONNAME, },
+ "flags: AI_CANONNAME\n"
+ "canonname: www.example\n"
+ "address: STREAM/TCP 192.0.2.17 80\n"
+ "address: DGRAM/UDP 192.0.2.17 80\n"
+ "address: RAW/IP 192.0.2.17 80\n"
+ "address: STREAM/TCP 2001:db8::1 80\n"
+ "address: DGRAM/UDP 2001:db8::1 80\n"
+ "address: RAW/IP 2001:db8::1 80\n");
check_ai ("alias.example", "80", AF_UNSPEC,
"address: STREAM/TCP 192.0.2.18 80\n"
"address: DGRAM/UDP 192.0.2.18 80\n"
@@ -236,6 +256,17 @@ do_test (void)
"address: STREAM/TCP 2001:db8::2 80\n"
"address: DGRAM/UDP 2001:db8::2 80\n"
"address: RAW/IP 2001:db8::2 80\n");
+ check_ai_hints ("alias.example", "80",
+ (struct addrinfo) { .ai_family = AF_UNSPEC,
+ .ai_flags = AI_CANONNAME, },
+ "flags: AI_CANONNAME\n"
+ "canonname: www.example\n"
+ "address: STREAM/TCP 192.0.2.18 80\n"
+ "address: DGRAM/UDP 192.0.2.18 80\n"
+ "address: RAW/IP 192.0.2.18 80\n"
+ "address: STREAM/TCP 2001:db8::2 80\n"
+ "address: DGRAM/UDP 2001:db8::2 80\n"
+ "address: RAW/IP 2001:db8::2 80\n");
check_ai (LONG_NAME, "80", AF_UNSPEC,
"address: STREAM/TCP 192.0.2.20 80\n"
"address: DGRAM/UDP 192.0.2.20 80\n"
@@ -247,10 +278,26 @@ do_test (void)
"address: STREAM/TCP 192.0.2.17 80\n"
"address: DGRAM/UDP 192.0.2.17 80\n"
"address: RAW/IP 192.0.2.17 80\n");
+ check_ai_hints ("www.example", "80",
+ (struct addrinfo) { .ai_family = AF_INET,
+ .ai_flags = AI_CANONNAME, },
+ "flags: AI_CANONNAME\n"
+ "canonname: www.example\n"
+ "address: STREAM/TCP 192.0.2.17 80\n"
+ "address: DGRAM/UDP 192.0.2.17 80\n"
+ "address: RAW/IP 192.0.2.17 80\n");
check_ai ("alias.example", "80", AF_INET,
"address: STREAM/TCP 192.0.2.18 80\n"
"address: DGRAM/UDP 192.0.2.18 80\n"
"address: RAW/IP 192.0.2.18 80\n");
+ check_ai_hints ("alias.example", "80",
+ (struct addrinfo) { .ai_family = AF_INET,
+ .ai_flags = AI_CANONNAME, },
+ "flags: AI_CANONNAME\n"
+ "canonname: www.example\n"
+ "address: STREAM/TCP 192.0.2.18 80\n"
+ "address: DGRAM/UDP 192.0.2.18 80\n"
+ "address: RAW/IP 192.0.2.18 80\n");
check_ai (LONG_NAME, "80", AF_INET,
"address: STREAM/TCP 192.0.2.20 80\n"
"address: DGRAM/UDP 192.0.2.20 80\n"
@@ -259,10 +306,26 @@ do_test (void)
"address: STREAM/TCP 2001:db8::1 80\n"
"address: DGRAM/UDP 2001:db8::1 80\n"
"address: RAW/IP 2001:db8::1 80\n");
+ check_ai_hints ("www.example", "80",
+ (struct addrinfo) { .ai_family = AF_INET6,
+ .ai_flags = AI_CANONNAME, },
+ "flags: AI_CANONNAME\n"
+ "canonname: www.example\n"
+ "address: STREAM/TCP 2001:db8::1 80\n"
+ "address: DGRAM/UDP 2001:db8::1 80\n"
+ "address: RAW/IP 2001:db8::1 80\n");
check_ai ("alias.example", "80", AF_INET6,
"address: STREAM/TCP 2001:db8::2 80\n"
"address: DGRAM/UDP 2001:db8::2 80\n"
"address: RAW/IP 2001:db8::2 80\n");
+ check_ai_hints ("alias.example", "80",
+ (struct addrinfo) { .ai_family = AF_INET6,
+ .ai_flags = AI_CANONNAME, },
+ "flags: AI_CANONNAME\n"
+ "canonname: www.example\n"
+ "address: STREAM/TCP 2001:db8::2 80\n"
+ "address: DGRAM/UDP 2001:db8::2 80\n"
+ "address: RAW/IP 2001:db8::2 80\n");
check_ai (LONG_NAME, "80", AF_INET6,
"address: STREAM/TCP 2001:db8::4 80\n"
"address: DGRAM/UDP 2001:db8::4 80\n"