xref: /freebsd-src/lib/libc/tests/nss/gethostby_test.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
108ca345cSEnji Cooper /*-
208ca345cSEnji Cooper  * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org>
308ca345cSEnji Cooper  * All rights reserved.
408ca345cSEnji Cooper  *
508ca345cSEnji Cooper  * Redistribution and use in source and binary forms, with or without
608ca345cSEnji Cooper  * modification, are permitted provided that the following conditions
708ca345cSEnji Cooper  * are met:
808ca345cSEnji Cooper  * 1. Redistributions of source code must retain the above copyright
908ca345cSEnji Cooper  *    notice, this list of conditions and the following disclaimer.
1008ca345cSEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
1108ca345cSEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
1208ca345cSEnji Cooper  *    documentation and/or other materials provided with the distribution.
1308ca345cSEnji Cooper  *
1408ca345cSEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1508ca345cSEnji Cooper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1608ca345cSEnji Cooper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1708ca345cSEnji Cooper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1808ca345cSEnji Cooper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1908ca345cSEnji Cooper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2008ca345cSEnji Cooper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2108ca345cSEnji Cooper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2208ca345cSEnji Cooper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2308ca345cSEnji Cooper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2408ca345cSEnji Cooper  * SUCH DAMAGE.
2508ca345cSEnji Cooper  *
2608ca345cSEnji Cooper  */
2708ca345cSEnji Cooper 
2808ca345cSEnji Cooper #include <sys/param.h>
2908ca345cSEnji Cooper #include <sys/socket.h>
3008ca345cSEnji Cooper #include <arpa/inet.h>
3108ca345cSEnji Cooper #include <netinet/in.h>
3208ca345cSEnji Cooper #include <errno.h>
3308ca345cSEnji Cooper #include <netdb.h>
3408ca345cSEnji Cooper #include <resolv.h>
3508ca345cSEnji Cooper #include <stdio.h>
3608ca345cSEnji Cooper #include <stdlib.h>
3708ca345cSEnji Cooper #include <string.h>
3808ca345cSEnji Cooper #include <stringlist.h>
3908ca345cSEnji Cooper #include <unistd.h>
4008ca345cSEnji Cooper 
4108ca345cSEnji Cooper #include <atf-c.h>
4208ca345cSEnji Cooper 
4308ca345cSEnji Cooper #include "freebsd_test_suite/macros.h"
4408ca345cSEnji Cooper #include "testutil.h"
4508ca345cSEnji Cooper 
4608ca345cSEnji Cooper enum test_methods {
4708ca345cSEnji Cooper 	TEST_GETHOSTBYNAME2,
4808ca345cSEnji Cooper 	TEST_GETHOSTBYADDR,
4908ca345cSEnji Cooper 	TEST_GETHOSTBYNAME2_GETADDRINFO,
5008ca345cSEnji Cooper 	TEST_GETHOSTBYADDR_GETNAMEINFO,
5108ca345cSEnji Cooper 	TEST_BUILD_SNAPSHOT,
5208ca345cSEnji Cooper 	TEST_BUILD_ADDR_SNAPSHOT
5308ca345cSEnji Cooper };
5408ca345cSEnji Cooper 
5508ca345cSEnji Cooper static int ipnode_flags = 0;
5608ca345cSEnji Cooper static int af_type = AF_INET;
5708ca345cSEnji Cooper static bool use_ipnode_functions;
5808ca345cSEnji Cooper 
5908ca345cSEnji Cooper DECLARE_TEST_DATA(hostent)
6008ca345cSEnji Cooper DECLARE_TEST_FILE_SNAPSHOT(hostent)
6108ca345cSEnji Cooper DECLARE_1PASS_TEST(hostent)
6208ca345cSEnji Cooper DECLARE_2PASS_TEST(hostent)
6308ca345cSEnji Cooper 
6408ca345cSEnji Cooper /* These stubs will use gethostby***() or getipnodeby***() functions,
6508ca345cSEnji Cooper  * depending on the use_ipnode_functions global variable value */
6608ca345cSEnji Cooper static struct hostent *__gethostbyname2(const char *, int);
6708ca345cSEnji Cooper static struct hostent *__gethostbyaddr(const void *, socklen_t, int);
6808ca345cSEnji Cooper static void __freehostent(struct hostent *);
6908ca345cSEnji Cooper 
7008ca345cSEnji Cooper static void clone_hostent(struct hostent *, struct hostent const *);
7108ca345cSEnji Cooper static int compare_hostent(struct hostent *, struct hostent *, void *);
7208ca345cSEnji Cooper static void dump_hostent(struct hostent *);
7308ca345cSEnji Cooper static void free_hostent(struct hostent *);
7408ca345cSEnji Cooper 
7508ca345cSEnji Cooper static int is_hostent_equal(struct hostent *, struct addrinfo *);
7608ca345cSEnji Cooper 
7708ca345cSEnji Cooper static void sdump_hostent(struct hostent *, char *, size_t);
7808ca345cSEnji Cooper static int hostent_read_hostlist_func(struct hostent *, char *);
7908ca345cSEnji Cooper static int hostent_read_snapshot_addr(char *, unsigned char *, size_t);
8008ca345cSEnji Cooper static int hostent_read_snapshot_func(struct hostent *, char *);
8108ca345cSEnji Cooper 
8208ca345cSEnji Cooper static int hostent_test_correctness(struct hostent *, void *);
8308ca345cSEnji Cooper static int hostent_test_gethostbyaddr(struct hostent *, void *);
8408ca345cSEnji Cooper static int hostent_test_getaddrinfo_eq(struct hostent *, void *);
8508ca345cSEnji Cooper static int hostent_test_getnameinfo_eq(struct hostent *, void *);
8608ca345cSEnji Cooper 
8708ca345cSEnji Cooper IMPLEMENT_TEST_DATA(hostent)
IMPLEMENT_TEST_FILE_SNAPSHOT(hostent)8808ca345cSEnji Cooper IMPLEMENT_TEST_FILE_SNAPSHOT(hostent)
8908ca345cSEnji Cooper IMPLEMENT_1PASS_TEST(hostent)
9008ca345cSEnji Cooper IMPLEMENT_2PASS_TEST(hostent)
9108ca345cSEnji Cooper 
9208ca345cSEnji Cooper static struct hostent *
9308ca345cSEnji Cooper __gethostbyname2(const char *name, int af)
9408ca345cSEnji Cooper {
9508ca345cSEnji Cooper 	struct hostent *he;
9608ca345cSEnji Cooper 	int error;
9708ca345cSEnji Cooper 
9808ca345cSEnji Cooper 	if (use_ipnode_functions) {
9908ca345cSEnji Cooper 		error = 0;
10008ca345cSEnji Cooper 		he = getipnodebyname(name, af, ipnode_flags, &error);
10108ca345cSEnji Cooper 		if (he == NULL)
10208ca345cSEnji Cooper 			errno = error;
10308ca345cSEnji Cooper 	} else
10408ca345cSEnji Cooper 		he = gethostbyname2(name, af);
10508ca345cSEnji Cooper 
10608ca345cSEnji Cooper 	return (he);
10708ca345cSEnji Cooper }
10808ca345cSEnji Cooper 
10908ca345cSEnji Cooper static struct hostent *
__gethostbyaddr(const void * addr,socklen_t len,int af)11008ca345cSEnji Cooper __gethostbyaddr(const void *addr, socklen_t len, int af)
11108ca345cSEnji Cooper {
11208ca345cSEnji Cooper 	struct hostent *he;
11308ca345cSEnji Cooper 	int error;
11408ca345cSEnji Cooper 
11508ca345cSEnji Cooper 	if (use_ipnode_functions) {
11608ca345cSEnji Cooper 		error = 0;
11708ca345cSEnji Cooper 		he = getipnodebyaddr(addr, len, af, &error);
11808ca345cSEnji Cooper 		if (he == NULL)
11908ca345cSEnji Cooper 			errno = error;
12008ca345cSEnji Cooper 	} else
12108ca345cSEnji Cooper 		he = gethostbyaddr(addr, len, af);
12208ca345cSEnji Cooper 
12308ca345cSEnji Cooper 	return (he);
12408ca345cSEnji Cooper }
12508ca345cSEnji Cooper 
12608ca345cSEnji Cooper static void
__freehostent(struct hostent * he)12708ca345cSEnji Cooper __freehostent(struct hostent *he)
12808ca345cSEnji Cooper {
12908ca345cSEnji Cooper 
13008ca345cSEnji Cooper 	/* NOTE: checking for he != NULL - just in case */
13108ca345cSEnji Cooper 	if (use_ipnode_functions && he != NULL)
13208ca345cSEnji Cooper 		freehostent(he);
13308ca345cSEnji Cooper }
13408ca345cSEnji Cooper 
13508ca345cSEnji Cooper static void
clone_hostent(struct hostent * dest,struct hostent const * src)13608ca345cSEnji Cooper clone_hostent(struct hostent *dest, struct hostent const *src)
13708ca345cSEnji Cooper {
13808ca345cSEnji Cooper 	ATF_REQUIRE(dest != NULL);
13908ca345cSEnji Cooper 	ATF_REQUIRE(src != NULL);
14008ca345cSEnji Cooper 
14108ca345cSEnji Cooper 	char **cp;
14208ca345cSEnji Cooper 	int aliases_num;
14308ca345cSEnji Cooper 	int addrs_num;
14408ca345cSEnji Cooper 	size_t offset;
14508ca345cSEnji Cooper 
14608ca345cSEnji Cooper 	memset(dest, 0, sizeof(struct hostent));
14708ca345cSEnji Cooper 
14808ca345cSEnji Cooper 	if (src->h_name != NULL) {
14908ca345cSEnji Cooper 		dest->h_name = strdup(src->h_name);
15008ca345cSEnji Cooper 		ATF_REQUIRE(dest->h_name != NULL);
15108ca345cSEnji Cooper 	}
15208ca345cSEnji Cooper 
15308ca345cSEnji Cooper 	dest->h_addrtype = src->h_addrtype;
15408ca345cSEnji Cooper 	dest->h_length = src->h_length;
15508ca345cSEnji Cooper 
15608ca345cSEnji Cooper 	if (src->h_aliases != NULL) {
15708ca345cSEnji Cooper 		aliases_num = 0;
15808ca345cSEnji Cooper 		for (cp = src->h_aliases; *cp; ++cp)
15908ca345cSEnji Cooper 			++aliases_num;
16008ca345cSEnji Cooper 
1613bdd6cf0SEnji Cooper 		dest->h_aliases = calloc(aliases_num + 1, sizeof(char *));
16208ca345cSEnji Cooper 		ATF_REQUIRE(dest->h_aliases != NULL);
16308ca345cSEnji Cooper 
16408ca345cSEnji Cooper 		for (cp = src->h_aliases; *cp; ++cp) {
16508ca345cSEnji Cooper 			dest->h_aliases[cp - src->h_aliases] = strdup(*cp);
16608ca345cSEnji Cooper 			ATF_REQUIRE(dest->h_aliases[cp - src->h_aliases] != NULL);
16708ca345cSEnji Cooper 		}
16808ca345cSEnji Cooper 	}
16908ca345cSEnji Cooper 
17008ca345cSEnji Cooper 	if (src->h_addr_list != NULL) {
17108ca345cSEnji Cooper 		addrs_num = 0;
17208ca345cSEnji Cooper 		for (cp = src->h_addr_list; *cp; ++cp)
17308ca345cSEnji Cooper 			++addrs_num;
17408ca345cSEnji Cooper 
1753bdd6cf0SEnji Cooper 		dest->h_addr_list = calloc(addrs_num + 1, sizeof(char *));
17608ca345cSEnji Cooper 		ATF_REQUIRE(dest->h_addr_list != NULL);
17708ca345cSEnji Cooper 
17808ca345cSEnji Cooper 		for (cp = src->h_addr_list; *cp; ++cp) {
17908ca345cSEnji Cooper 			offset = cp - src->h_addr_list;
18008ca345cSEnji Cooper 			dest->h_addr_list[offset] = malloc(src->h_length);
18108ca345cSEnji Cooper 			ATF_REQUIRE(dest->h_addr_list[offset] != NULL);
18208ca345cSEnji Cooper 			memcpy(dest->h_addr_list[offset],
18308ca345cSEnji Cooper 			    src->h_addr_list[offset], src->h_length);
18408ca345cSEnji Cooper 		}
18508ca345cSEnji Cooper 	}
18608ca345cSEnji Cooper }
18708ca345cSEnji Cooper 
18808ca345cSEnji Cooper static void
free_hostent(struct hostent * ht)18908ca345cSEnji Cooper free_hostent(struct hostent *ht)
19008ca345cSEnji Cooper {
19108ca345cSEnji Cooper 	char **cp;
19208ca345cSEnji Cooper 
19308ca345cSEnji Cooper 	ATF_REQUIRE(ht != NULL);
19408ca345cSEnji Cooper 
19508ca345cSEnji Cooper 	free(ht->h_name);
19608ca345cSEnji Cooper 
19708ca345cSEnji Cooper 	if (ht->h_aliases != NULL) {
19808ca345cSEnji Cooper 		for (cp = ht->h_aliases; *cp; ++cp)
19908ca345cSEnji Cooper 			free(*cp);
20008ca345cSEnji Cooper 		free(ht->h_aliases);
20108ca345cSEnji Cooper 	}
20208ca345cSEnji Cooper 
20308ca345cSEnji Cooper 	if  (ht->h_addr_list != NULL) {
20408ca345cSEnji Cooper 		for (cp = ht->h_addr_list; *cp; ++cp)
20508ca345cSEnji Cooper 			free(*cp);
20608ca345cSEnji Cooper 		free(ht->h_addr_list);
20708ca345cSEnji Cooper 	}
20808ca345cSEnji Cooper }
20908ca345cSEnji Cooper 
21008ca345cSEnji Cooper static  int
compare_hostent(struct hostent * ht1,struct hostent * ht2,void * mdata)21108ca345cSEnji Cooper compare_hostent(struct hostent *ht1, struct hostent *ht2, void *mdata)
21208ca345cSEnji Cooper {
21308ca345cSEnji Cooper 	char **c1, **c2, **ct, **cb;
21408ca345cSEnji Cooper 	int b;
21508ca345cSEnji Cooper 
21608ca345cSEnji Cooper 	if (ht1 == ht2)
21708ca345cSEnji Cooper 		return 0;
21808ca345cSEnji Cooper 
21908ca345cSEnji Cooper 	if (ht1 == NULL || ht2 == NULL)
22008ca345cSEnji Cooper 		goto errfin;
22108ca345cSEnji Cooper 
22208ca345cSEnji Cooper 	if (ht1->h_name == NULL || ht2->h_name == NULL)
22308ca345cSEnji Cooper 		goto errfin;
22408ca345cSEnji Cooper 
22508ca345cSEnji Cooper 	if (ht1->h_addrtype != ht2->h_addrtype ||
22608ca345cSEnji Cooper 	    ht1->h_length != ht2->h_length ||
22708ca345cSEnji Cooper 	    strcmp(ht1->h_name, ht2->h_name) != 0)
22808ca345cSEnji Cooper 		goto errfin;
22908ca345cSEnji Cooper 
23008ca345cSEnji Cooper 	c1 = ht1->h_aliases;
23108ca345cSEnji Cooper 	c2 = ht2->h_aliases;
23208ca345cSEnji Cooper 
23308ca345cSEnji Cooper 	if ((ht1->h_aliases == NULL || ht2->h_aliases == NULL) &&
23408ca345cSEnji Cooper 	    ht1->h_aliases != ht2->h_aliases)
23508ca345cSEnji Cooper 		goto errfin;
23608ca345cSEnji Cooper 
23708ca345cSEnji Cooper 	if (c1 != NULL && c2 != NULL) {
23808ca345cSEnji Cooper 		cb = c1;
23908ca345cSEnji Cooper 		for (;*c1; ++c1) {
24008ca345cSEnji Cooper 			b = 0;
24108ca345cSEnji Cooper 			for (ct = c2; *ct; ++ct) {
24208ca345cSEnji Cooper 				if (strcmp(*c1, *ct) == 0) {
24308ca345cSEnji Cooper 					b = 1;
24408ca345cSEnji Cooper 					break;
24508ca345cSEnji Cooper 				}
24608ca345cSEnji Cooper 			}
24708ca345cSEnji Cooper 			if (b == 0) {
24808ca345cSEnji Cooper 				printf("h1 aliases item can't be found in h2 "
24908ca345cSEnji Cooper 				    "aliases\n");
25008ca345cSEnji Cooper 				goto errfin;
25108ca345cSEnji Cooper 			}
25208ca345cSEnji Cooper 		}
25308ca345cSEnji Cooper 
25408ca345cSEnji Cooper 		c1 = cb;
25508ca345cSEnji Cooper 		for (;*c2; ++c2) {
25608ca345cSEnji Cooper 			b = 0;
25708ca345cSEnji Cooper 			for (ct = c1; *ct; ++ct) {
25808ca345cSEnji Cooper 				if (strcmp(*c2, *ct) == 0) {
25908ca345cSEnji Cooper 					b = 1;
26008ca345cSEnji Cooper 					break;
26108ca345cSEnji Cooper 				}
26208ca345cSEnji Cooper 			}
26308ca345cSEnji Cooper 			if (b == 0) {
26408ca345cSEnji Cooper 				printf("h2 aliases item can't be found in h1 "
26508ca345cSEnji Cooper 				    "aliases\n");
26608ca345cSEnji Cooper 				goto errfin;
26708ca345cSEnji Cooper 			}
26808ca345cSEnji Cooper 		}
26908ca345cSEnji Cooper 	}
27008ca345cSEnji Cooper 
27108ca345cSEnji Cooper 	c1 = ht1->h_addr_list;
27208ca345cSEnji Cooper 	c2 = ht2->h_addr_list;
27308ca345cSEnji Cooper 
27408ca345cSEnji Cooper 	if ((ht1->h_addr_list == NULL || ht2->h_addr_list== NULL) &&
27508ca345cSEnji Cooper 	    ht1->h_addr_list != ht2->h_addr_list)
27608ca345cSEnji Cooper 		goto errfin;
27708ca345cSEnji Cooper 
27808ca345cSEnji Cooper 	if (c1 != NULL && c2 != NULL) {
27908ca345cSEnji Cooper 		cb = c1;
28008ca345cSEnji Cooper 		for (; *c1; ++c1) {
28108ca345cSEnji Cooper 			b = 0;
28208ca345cSEnji Cooper 			for (ct = c2; *ct; ++ct) {
28308ca345cSEnji Cooper 				if (memcmp(*c1, *ct, ht1->h_length) == 0) {
28408ca345cSEnji Cooper 					b = 1;
28508ca345cSEnji Cooper 					break;
28608ca345cSEnji Cooper 				}
28708ca345cSEnji Cooper 			}
28808ca345cSEnji Cooper 			if (b == 0) {
28908ca345cSEnji Cooper 				printf("h1 addresses item can't be found in "
29008ca345cSEnji Cooper 				    "h2 addresses\n");
29108ca345cSEnji Cooper 				goto errfin;
29208ca345cSEnji Cooper 			}
29308ca345cSEnji Cooper 		}
29408ca345cSEnji Cooper 
29508ca345cSEnji Cooper 		c1 = cb;
29608ca345cSEnji Cooper 		for (; *c2; ++c2) {
29708ca345cSEnji Cooper 			b = 0;
29808ca345cSEnji Cooper 			for (ct = c1; *ct; ++ct) {
29908ca345cSEnji Cooper 				if (memcmp(*c2, *ct, ht1->h_length) == 0) {
30008ca345cSEnji Cooper 					b = 1;
30108ca345cSEnji Cooper 					break;
30208ca345cSEnji Cooper 				}
30308ca345cSEnji Cooper 			}
30408ca345cSEnji Cooper 			if (b == 0) {
30508ca345cSEnji Cooper 				printf("h2 addresses item can't be found in "
30608ca345cSEnji Cooper 				    "h1 addresses\n");
30708ca345cSEnji Cooper 				goto errfin;
30808ca345cSEnji Cooper 			}
30908ca345cSEnji Cooper 		}
31008ca345cSEnji Cooper 	}
31108ca345cSEnji Cooper 
31208ca345cSEnji Cooper 	return 0;
31308ca345cSEnji Cooper 
31408ca345cSEnji Cooper errfin:
31508ca345cSEnji Cooper 	if (mdata == NULL) {
31608ca345cSEnji Cooper 		printf("following structures are not equal:\n");
31708ca345cSEnji Cooper 		dump_hostent(ht1);
31808ca345cSEnji Cooper 		dump_hostent(ht2);
31908ca345cSEnji Cooper 	}
32008ca345cSEnji Cooper 
32108ca345cSEnji Cooper 	return (-1);
32208ca345cSEnji Cooper }
32308ca345cSEnji Cooper 
32408ca345cSEnji Cooper static int
check_addrinfo_for_name(struct addrinfo * ai,char const * name)32508ca345cSEnji Cooper check_addrinfo_for_name(struct addrinfo *ai, char const *name)
32608ca345cSEnji Cooper {
32708ca345cSEnji Cooper 	struct addrinfo *ai2;
32808ca345cSEnji Cooper 
32908ca345cSEnji Cooper 	for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) {
33008ca345cSEnji Cooper 		if (strcmp(ai2->ai_canonname, name) == 0)
33108ca345cSEnji Cooper 			return (0);
33208ca345cSEnji Cooper 	}
33308ca345cSEnji Cooper 
33408ca345cSEnji Cooper 	return (-1);
33508ca345cSEnji Cooper }
33608ca345cSEnji Cooper 
33708ca345cSEnji Cooper static int
check_addrinfo_for_addr(struct addrinfo * ai,char const * addr,socklen_t addrlen,int af)33808ca345cSEnji Cooper check_addrinfo_for_addr(struct addrinfo *ai, char const *addr,
33908ca345cSEnji Cooper 	socklen_t addrlen, int af)
34008ca345cSEnji Cooper {
34108ca345cSEnji Cooper 	struct addrinfo *ai2;
34208ca345cSEnji Cooper 
34308ca345cSEnji Cooper 	for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) {
34408ca345cSEnji Cooper 		if (af != ai2->ai_family)
34508ca345cSEnji Cooper 			continue;
34608ca345cSEnji Cooper 
34708ca345cSEnji Cooper 		switch (af) {
34808ca345cSEnji Cooper 		case AF_INET:
34908ca345cSEnji Cooper 			if (memcmp(addr,
35008ca345cSEnji Cooper 			    (void *)&((struct sockaddr_in *)ai2->ai_addr)->sin_addr,
35108ca345cSEnji Cooper 			    MIN(addrlen, ai2->ai_addrlen)) == 0)
35208ca345cSEnji Cooper 				return (0);
35308ca345cSEnji Cooper 			break;
35408ca345cSEnji Cooper 		case AF_INET6:
35508ca345cSEnji Cooper 			if (memcmp(addr,
35608ca345cSEnji Cooper 			    (void *)&((struct sockaddr_in6 *)ai2->ai_addr)->sin6_addr,
35708ca345cSEnji Cooper 			    MIN(addrlen, ai2->ai_addrlen)) == 0)
35808ca345cSEnji Cooper 				return (0);
35908ca345cSEnji Cooper 			break;
36008ca345cSEnji Cooper 		default:
36108ca345cSEnji Cooper 			break;
36208ca345cSEnji Cooper 		}
36308ca345cSEnji Cooper 	}
36408ca345cSEnji Cooper 
36508ca345cSEnji Cooper 	return (-1);
36608ca345cSEnji Cooper }
36708ca345cSEnji Cooper 
36808ca345cSEnji Cooper static int
is_hostent_equal(struct hostent * he,struct addrinfo * ai)36908ca345cSEnji Cooper is_hostent_equal(struct hostent *he, struct addrinfo *ai)
37008ca345cSEnji Cooper {
37108ca345cSEnji Cooper 	char **cp;
37208ca345cSEnji Cooper 	int rv;
37308ca345cSEnji Cooper 
37408ca345cSEnji Cooper #ifdef DEBUG
37508ca345cSEnji Cooper 	printf("checking equality of he and ai\n");
37608ca345cSEnji Cooper #endif
37708ca345cSEnji Cooper 
37808ca345cSEnji Cooper 	rv = check_addrinfo_for_name(ai, he->h_name);
37908ca345cSEnji Cooper 	if (rv != 0) {
38008ca345cSEnji Cooper 		printf("not equal - he->h_name couldn't be found\n");
38108ca345cSEnji Cooper 		return (rv);
38208ca345cSEnji Cooper 	}
38308ca345cSEnji Cooper 
38408ca345cSEnji Cooper 	for (cp = he->h_addr_list; *cp; ++cp) {
38508ca345cSEnji Cooper 		rv = check_addrinfo_for_addr(ai, *cp, he->h_length,
38608ca345cSEnji Cooper 			he->h_addrtype);
38708ca345cSEnji Cooper 		if (rv != 0) {
38808ca345cSEnji Cooper 			printf("not equal - one of he->h_addr_list couldn't be found\n");
38908ca345cSEnji Cooper 			return (rv);
39008ca345cSEnji Cooper 		}
39108ca345cSEnji Cooper 	}
39208ca345cSEnji Cooper 
39308ca345cSEnji Cooper #ifdef DEBUG
39408ca345cSEnji Cooper 	printf("equal\n");
39508ca345cSEnji Cooper #endif
39608ca345cSEnji Cooper 
39708ca345cSEnji Cooper 	return (0);
39808ca345cSEnji Cooper }
39908ca345cSEnji Cooper 
40008ca345cSEnji Cooper static void
sdump_hostent(struct hostent * ht,char * buffer,size_t buflen)40108ca345cSEnji Cooper sdump_hostent(struct hostent *ht, char *buffer, size_t buflen)
40208ca345cSEnji Cooper {
40308ca345cSEnji Cooper 	char **cp;
40408ca345cSEnji Cooper 	size_t i;
40508ca345cSEnji Cooper 	int written;
40608ca345cSEnji Cooper 
40708ca345cSEnji Cooper 	written = snprintf(buffer, buflen, "%s %d %d",
40808ca345cSEnji Cooper 		ht->h_name, ht->h_addrtype, ht->h_length);
40908ca345cSEnji Cooper 	buffer += written;
41058c03e4eSEnji Cooper 	if (written > (int)buflen)
41108ca345cSEnji Cooper 		return;
41208ca345cSEnji Cooper 	buflen -= written;
41308ca345cSEnji Cooper 
41408ca345cSEnji Cooper 	if (ht->h_aliases != NULL) {
41508ca345cSEnji Cooper 		if (*(ht->h_aliases) != NULL) {
41608ca345cSEnji Cooper 			for (cp = ht->h_aliases; *cp; ++cp) {
41708ca345cSEnji Cooper 				written = snprintf(buffer, buflen, " %s",*cp);
41808ca345cSEnji Cooper 				buffer += written;
41958c03e4eSEnji Cooper 				if (written > (int)buflen)
42008ca345cSEnji Cooper 					return;
42108ca345cSEnji Cooper 				buflen -= written;
42208ca345cSEnji Cooper 
42308ca345cSEnji Cooper 				if (buflen == 0)
42408ca345cSEnji Cooper 					return;
42508ca345cSEnji Cooper 			}
42608ca345cSEnji Cooper 		} else {
42708ca345cSEnji Cooper 			written = snprintf(buffer, buflen, " noaliases");
42808ca345cSEnji Cooper 			buffer += written;
42958c03e4eSEnji Cooper 			if (written > (int)buflen)
43008ca345cSEnji Cooper 				return;
43108ca345cSEnji Cooper 			buflen -= written;
43208ca345cSEnji Cooper 		}
43308ca345cSEnji Cooper 	} else {
43408ca345cSEnji Cooper 		written = snprintf(buffer, buflen, " (null)");
43508ca345cSEnji Cooper 		buffer += written;
43658c03e4eSEnji Cooper 		if (written > (int)buflen)
43708ca345cSEnji Cooper 			return;
43808ca345cSEnji Cooper 		buflen -= written;
43908ca345cSEnji Cooper 	}
44008ca345cSEnji Cooper 
44108ca345cSEnji Cooper 	written = snprintf(buffer, buflen, " : ");
44208ca345cSEnji Cooper 	buffer += written;
44358c03e4eSEnji Cooper 	if (written > (int)buflen)
44408ca345cSEnji Cooper 		return;
44508ca345cSEnji Cooper 	buflen -= written;
44608ca345cSEnji Cooper 
44708ca345cSEnji Cooper 	if (ht->h_addr_list != NULL) {
44808ca345cSEnji Cooper 		if (*(ht->h_addr_list) != NULL) {
44908ca345cSEnji Cooper 			for (cp = ht->h_addr_list; *cp; ++cp) {
45058c03e4eSEnji Cooper 				for (i = 0; i < (size_t)ht->h_length; ++i) {
45108ca345cSEnji Cooper 					written = snprintf(buffer, buflen,
45258c03e4eSEnji Cooper 					    i + 1 != (size_t)ht->h_length ?
45358c03e4eSEnji Cooper 					        "%d." : "%d",
45408ca345cSEnji Cooper 					    (unsigned char)(*cp)[i]);
45508ca345cSEnji Cooper 					buffer += written;
45658c03e4eSEnji Cooper 					if (written > (int)buflen)
45708ca345cSEnji Cooper 						return;
45808ca345cSEnji Cooper 					buflen -= written;
45908ca345cSEnji Cooper 
46008ca345cSEnji Cooper 					if (buflen == 0)
46108ca345cSEnji Cooper 						return;
46208ca345cSEnji Cooper 				}
46308ca345cSEnji Cooper 
46408ca345cSEnji Cooper 				if (*(cp + 1)) {
46558c03e4eSEnji Cooper 					written = snprintf(buffer, buflen,
46658c03e4eSEnji Cooper 					    " ");
46708ca345cSEnji Cooper 					buffer += written;
46858c03e4eSEnji Cooper 					if (written > (int)buflen)
46908ca345cSEnji Cooper 						return;
47008ca345cSEnji Cooper 					buflen -= written;
47108ca345cSEnji Cooper 				}
47208ca345cSEnji Cooper 			}
47308ca345cSEnji Cooper 		} else {
47408ca345cSEnji Cooper 			written = snprintf(buffer, buflen, " noaddrs");
47508ca345cSEnji Cooper 			buffer += written;
47658c03e4eSEnji Cooper 			if (written > (int)buflen)
47708ca345cSEnji Cooper 				return;
47808ca345cSEnji Cooper 			buflen -= written;
47908ca345cSEnji Cooper 		}
48008ca345cSEnji Cooper 	} else {
48108ca345cSEnji Cooper 		written = snprintf(buffer, buflen, " (null)");
48208ca345cSEnji Cooper 		buffer += written;
48358c03e4eSEnji Cooper 		if (written > (int)buflen)
48408ca345cSEnji Cooper 			return;
48508ca345cSEnji Cooper 		buflen -= written;
48608ca345cSEnji Cooper 	}
48708ca345cSEnji Cooper }
48808ca345cSEnji Cooper 
48908ca345cSEnji Cooper static int
hostent_read_hostlist_func(struct hostent * he,char * line)49008ca345cSEnji Cooper hostent_read_hostlist_func(struct hostent *he, char *line)
49108ca345cSEnji Cooper {
49208ca345cSEnji Cooper 	struct hostent *result;
49308ca345cSEnji Cooper 	int rv;
49408ca345cSEnji Cooper 
49508ca345cSEnji Cooper #ifdef DEBUG
49608ca345cSEnji Cooper 	printf("resolving %s: ", line);
49708ca345cSEnji Cooper #endif
49808ca345cSEnji Cooper 	result = __gethostbyname2(line, af_type);
49908ca345cSEnji Cooper 	if (result != NULL) {
50008ca345cSEnji Cooper #ifdef DEBUG
50108ca345cSEnji Cooper 		printf("found\n");
50208ca345cSEnji Cooper #endif
50308ca345cSEnji Cooper 
50408ca345cSEnji Cooper 		rv = hostent_test_correctness(result, NULL);
50508ca345cSEnji Cooper 		if (rv != 0) {
50608ca345cSEnji Cooper 			__freehostent(result);
50708ca345cSEnji Cooper 			return (rv);
50808ca345cSEnji Cooper 		}
50908ca345cSEnji Cooper 
51008ca345cSEnji Cooper 		clone_hostent(he, result);
51108ca345cSEnji Cooper 		__freehostent(result);
51208ca345cSEnji Cooper 	} else {
51308ca345cSEnji Cooper #ifdef DEBUG
51408ca345cSEnji Cooper 		printf("not found\n");
51508ca345cSEnji Cooper #endif
51608ca345cSEnji Cooper  		memset(he, 0, sizeof(struct hostent));
51708ca345cSEnji Cooper 		he->h_name = strdup(line);
51808ca345cSEnji Cooper 		ATF_REQUIRE(he->h_name != NULL);
51908ca345cSEnji Cooper 	}
52008ca345cSEnji Cooper 	return (0);
52108ca345cSEnji Cooper }
52208ca345cSEnji Cooper 
52308ca345cSEnji Cooper static int
hostent_read_snapshot_addr(char * addr,unsigned char * result,size_t len)52408ca345cSEnji Cooper hostent_read_snapshot_addr(char *addr, unsigned char *result, size_t len)
52508ca345cSEnji Cooper {
52608ca345cSEnji Cooper 	char *s, *ps, *ts;
52708ca345cSEnji Cooper 
52808ca345cSEnji Cooper 	ps = addr;
52908ca345cSEnji Cooper 	while ( (s = strsep(&ps, ".")) != NULL) {
53008ca345cSEnji Cooper 		if (len == 0)
53108ca345cSEnji Cooper 			return (-1);
53208ca345cSEnji Cooper 
53308ca345cSEnji Cooper 		*result = (unsigned char)strtol(s, &ts, 10);
53408ca345cSEnji Cooper 		++result;
53508ca345cSEnji Cooper 		if (*ts != '\0')
53608ca345cSEnji Cooper 			return (-1);
53708ca345cSEnji Cooper 
53808ca345cSEnji Cooper 		--len;
53908ca345cSEnji Cooper 	}
54008ca345cSEnji Cooper 	if (len != 0)
54108ca345cSEnji Cooper 		return (-1);
54208ca345cSEnji Cooper 	else
54308ca345cSEnji Cooper 		return (0);
54408ca345cSEnji Cooper }
54508ca345cSEnji Cooper 
54608ca345cSEnji Cooper static int
hostent_read_snapshot_func(struct hostent * ht,char * line)54708ca345cSEnji Cooper hostent_read_snapshot_func(struct hostent *ht, char *line)
54808ca345cSEnji Cooper {
54908ca345cSEnji Cooper 	StringList *sl1, *sl2;
55008ca345cSEnji Cooper 	char *s, *ps, *ts;
55108ca345cSEnji Cooper 	int i, rv;
55208ca345cSEnji Cooper 
55308ca345cSEnji Cooper #ifdef DEBUG
55408ca345cSEnji Cooper 	printf("1 line read from snapshot:\n%s\n", line);
55508ca345cSEnji Cooper #endif
55608ca345cSEnji Cooper 
55708ca345cSEnji Cooper 	rv = 0;
55808ca345cSEnji Cooper 	i = 0;
55908ca345cSEnji Cooper 	sl1 = sl2 = NULL;
56008ca345cSEnji Cooper 	ps = line;
56108ca345cSEnji Cooper 	memset(ht, 0, sizeof(struct hostent));
56208ca345cSEnji Cooper 	while ((s = strsep(&ps, " ")) != NULL) {
56308ca345cSEnji Cooper 		switch (i) {
56408ca345cSEnji Cooper 		case 0:
56508ca345cSEnji Cooper 			ht->h_name = strdup(s);
56608ca345cSEnji Cooper 			ATF_REQUIRE(ht->h_name != NULL);
56708ca345cSEnji Cooper 			break;
56808ca345cSEnji Cooper 
56908ca345cSEnji Cooper 		case 1:
57008ca345cSEnji Cooper 			ht->h_addrtype = (int)strtol(s, &ts, 10);
57108ca345cSEnji Cooper 			if (*ts != '\0')
57208ca345cSEnji Cooper 				goto fin;
57308ca345cSEnji Cooper 			break;
57408ca345cSEnji Cooper 
57508ca345cSEnji Cooper 		case 2:
57608ca345cSEnji Cooper 			ht->h_length = (int)strtol(s, &ts, 10);
57708ca345cSEnji Cooper 			if (*ts != '\0')
57808ca345cSEnji Cooper 				goto fin;
57908ca345cSEnji Cooper 			break;
58008ca345cSEnji Cooper 
58108ca345cSEnji Cooper 		case 3:
58208ca345cSEnji Cooper 			if (sl1 == NULL) {
58308ca345cSEnji Cooper 				if (strcmp(s, "(null)") == 0)
58408ca345cSEnji Cooper 					return (0);
58508ca345cSEnji Cooper 
58608ca345cSEnji Cooper 				sl1 = sl_init();
58708ca345cSEnji Cooper 				ATF_REQUIRE(sl1 != NULL);
58808ca345cSEnji Cooper 
58908ca345cSEnji Cooper 				if (strcmp(s, "noaliases") != 0) {
59008ca345cSEnji Cooper 					ts = strdup(s);
59108ca345cSEnji Cooper 					ATF_REQUIRE(ts != NULL);
59208ca345cSEnji Cooper 					sl_add(sl1, ts);
59308ca345cSEnji Cooper 				}
59408ca345cSEnji Cooper 			} else {
59508ca345cSEnji Cooper 				if (strcmp(s, ":") == 0)
59608ca345cSEnji Cooper 					++i;
59708ca345cSEnji Cooper 				else {
59808ca345cSEnji Cooper 					ts = strdup(s);
59908ca345cSEnji Cooper 					ATF_REQUIRE(ts != NULL);
60008ca345cSEnji Cooper 					sl_add(sl1, ts);
60108ca345cSEnji Cooper 				}
60208ca345cSEnji Cooper 			}
60308ca345cSEnji Cooper 			break;
60408ca345cSEnji Cooper 
60508ca345cSEnji Cooper 		case 4:
60608ca345cSEnji Cooper 			if (sl2 == NULL) {
60708ca345cSEnji Cooper 				if (strcmp(s, "(null)") == 0)
60808ca345cSEnji Cooper 					return (0);
60908ca345cSEnji Cooper 
61008ca345cSEnji Cooper 				sl2 = sl_init();
61108ca345cSEnji Cooper 				ATF_REQUIRE(sl2 != NULL);
61208ca345cSEnji Cooper 
61308ca345cSEnji Cooper 				if (strcmp(s, "noaddrs") != 0) {
61408ca345cSEnji Cooper 					ts = calloc(1, ht->h_length);
61508ca345cSEnji Cooper 					ATF_REQUIRE(ts != NULL);
61608ca345cSEnji Cooper 					rv = hostent_read_snapshot_addr(s,
61708ca345cSEnji Cooper 					    (unsigned char *)ts,
61808ca345cSEnji Cooper 					    ht->h_length);
61908ca345cSEnji Cooper 					sl_add(sl2, ts);
62008ca345cSEnji Cooper 					if (rv != 0)
62108ca345cSEnji Cooper 						goto fin;
62208ca345cSEnji Cooper 				}
62308ca345cSEnji Cooper 			} else {
62408ca345cSEnji Cooper 				ts = calloc(1, ht->h_length);
62508ca345cSEnji Cooper 				ATF_REQUIRE(ts != NULL);
62608ca345cSEnji Cooper 				rv = hostent_read_snapshot_addr(s,
62708ca345cSEnji Cooper 				    (unsigned char *)ts, ht->h_length);
62808ca345cSEnji Cooper 				sl_add(sl2, ts);
62908ca345cSEnji Cooper 				if (rv != 0)
63008ca345cSEnji Cooper 					goto fin;
63108ca345cSEnji Cooper 			}
63208ca345cSEnji Cooper 			break;
63308ca345cSEnji Cooper 		default:
63408ca345cSEnji Cooper 			break;
63508ca345cSEnji Cooper 		}
63608ca345cSEnji Cooper 
63708ca345cSEnji Cooper 		if (i != 3 && i != 4)
63808ca345cSEnji Cooper 			++i;
63908ca345cSEnji Cooper 	}
64008ca345cSEnji Cooper 
64108ca345cSEnji Cooper fin:
64208ca345cSEnji Cooper 	if (sl1 != NULL) {
64308ca345cSEnji Cooper 		sl_add(sl1, NULL);
64408ca345cSEnji Cooper 		ht->h_aliases = sl1->sl_str;
64508ca345cSEnji Cooper 	}
64608ca345cSEnji Cooper 	if (sl2 != NULL) {
64708ca345cSEnji Cooper 		sl_add(sl2, NULL);
64808ca345cSEnji Cooper 		ht->h_addr_list = sl2->sl_str;
64908ca345cSEnji Cooper 	}
65008ca345cSEnji Cooper 
65108ca345cSEnji Cooper 	if ((i != 4) || (rv != 0)) {
65208ca345cSEnji Cooper 		free_hostent(ht);
65308ca345cSEnji Cooper 		memset(ht, 0, sizeof(struct hostent));
65408ca345cSEnji Cooper 		return (-1);
65508ca345cSEnji Cooper 	}
65608ca345cSEnji Cooper 
65708ca345cSEnji Cooper 	/* NOTE: is it a dirty hack or not? */
65808ca345cSEnji Cooper 	free(sl1);
65908ca345cSEnji Cooper 	free(sl2);
66008ca345cSEnji Cooper 	return (0);
66108ca345cSEnji Cooper }
66208ca345cSEnji Cooper 
66308ca345cSEnji Cooper static void
dump_hostent(struct hostent * result)66408ca345cSEnji Cooper dump_hostent(struct hostent *result)
66508ca345cSEnji Cooper {
66608ca345cSEnji Cooper 	if (result != NULL) {
66708ca345cSEnji Cooper 		char buffer[1024];
66808ca345cSEnji Cooper 		sdump_hostent(result, buffer, sizeof(buffer));
66908ca345cSEnji Cooper 		printf("%s\n", buffer);
67008ca345cSEnji Cooper 	} else
67108ca345cSEnji Cooper 		printf("(null)\n");
67208ca345cSEnji Cooper }
67308ca345cSEnji Cooper 
67408ca345cSEnji Cooper static int
hostent_test_correctness(struct hostent * ht,void * mdata __unused)675981aa50fSEnji Cooper hostent_test_correctness(struct hostent *ht, void *mdata __unused)
67608ca345cSEnji Cooper {
67708ca345cSEnji Cooper 
67808ca345cSEnji Cooper #ifdef DEBUG
67908ca345cSEnji Cooper 	printf("testing correctness with the following data:\n");
68008ca345cSEnji Cooper 	dump_hostent(ht);
68108ca345cSEnji Cooper #endif
68208ca345cSEnji Cooper 
68308ca345cSEnji Cooper 	if (ht == NULL)
68408ca345cSEnji Cooper 		goto errfin;
68508ca345cSEnji Cooper 
68608ca345cSEnji Cooper 	if (ht->h_name == NULL)
68708ca345cSEnji Cooper 		goto errfin;
68808ca345cSEnji Cooper 
68908ca345cSEnji Cooper 	if (!((ht->h_addrtype >= 0) && (ht->h_addrtype < AF_MAX)))
69008ca345cSEnji Cooper 		goto errfin;
69108ca345cSEnji Cooper 
69208ca345cSEnji Cooper 	if ((ht->h_length != sizeof(struct in_addr)) &&
69308ca345cSEnji Cooper 		(ht->h_length != sizeof(struct in6_addr)))
69408ca345cSEnji Cooper 		goto errfin;
69508ca345cSEnji Cooper 
69608ca345cSEnji Cooper 	if (ht->h_aliases == NULL)
69708ca345cSEnji Cooper 		goto errfin;
69808ca345cSEnji Cooper 
69908ca345cSEnji Cooper 	if (ht->h_addr_list == NULL)
70008ca345cSEnji Cooper 		goto errfin;
70108ca345cSEnji Cooper 
70208ca345cSEnji Cooper #ifdef DEBUG
70308ca345cSEnji Cooper 	printf("correct\n");
70408ca345cSEnji Cooper #endif
70508ca345cSEnji Cooper 
70608ca345cSEnji Cooper 	return (0);
70708ca345cSEnji Cooper errfin:
70808ca345cSEnji Cooper 	printf("incorrect\n");
70908ca345cSEnji Cooper 
71008ca345cSEnji Cooper 	return (-1);
71108ca345cSEnji Cooper }
71208ca345cSEnji Cooper 
71308ca345cSEnji Cooper static int
hostent_test_gethostbyaddr(struct hostent * he,void * mdata)71408ca345cSEnji Cooper hostent_test_gethostbyaddr(struct hostent *he, void *mdata)
71508ca345cSEnji Cooper {
71608ca345cSEnji Cooper 	struct hostent *result;
71708ca345cSEnji Cooper 	struct hostent_test_data *addr_test_data;
71808ca345cSEnji Cooper 	int rv;
71908ca345cSEnji Cooper 
72008ca345cSEnji Cooper 	addr_test_data = (struct hostent_test_data *)mdata;
72108ca345cSEnji Cooper 
72208ca345cSEnji Cooper 	/* We should omit unresolved hostents */
72308ca345cSEnji Cooper 	if (he->h_addr_list != NULL) {
72408ca345cSEnji Cooper 		char **cp;
72508ca345cSEnji Cooper 		for (cp = he->h_addr_list; *cp; ++cp) {
72608ca345cSEnji Cooper #ifdef DEBUG
72708ca345cSEnji Cooper 			printf("doing reverse lookup for %s\n", he->h_name);
72808ca345cSEnji Cooper #endif
72908ca345cSEnji Cooper 
73008ca345cSEnji Cooper 			result = __gethostbyaddr(*cp, he->h_length,
73108ca345cSEnji Cooper 			    he->h_addrtype);
73208ca345cSEnji Cooper 			if (result == NULL) {
73308ca345cSEnji Cooper #ifdef DEBUG
73408ca345cSEnji Cooper 				printf("%s: warning: reverse lookup failed "
73508ca345cSEnji Cooper 				    "for %s: %s\n", __func__, he->h_name,
73608ca345cSEnji Cooper 				    strerror(errno));
73708ca345cSEnji Cooper #endif
73808ca345cSEnji Cooper 				continue;
73908ca345cSEnji Cooper 			}
74008ca345cSEnji Cooper 			rv = hostent_test_correctness(result, NULL);
74108ca345cSEnji Cooper 			if (rv != 0) {
74208ca345cSEnji Cooper 				__freehostent(result);
74308ca345cSEnji Cooper 				return (rv);
74408ca345cSEnji Cooper 			}
74508ca345cSEnji Cooper 
74608ca345cSEnji Cooper 			if (addr_test_data != NULL)
74708ca345cSEnji Cooper 				TEST_DATA_APPEND(hostent, addr_test_data,
74808ca345cSEnji Cooper 				    result);
74908ca345cSEnji Cooper 
75008ca345cSEnji Cooper 			__freehostent(result);
75108ca345cSEnji Cooper 		}
75208ca345cSEnji Cooper 	}
75308ca345cSEnji Cooper 
75408ca345cSEnji Cooper 	return (0);
75508ca345cSEnji Cooper }
75608ca345cSEnji Cooper 
75708ca345cSEnji Cooper static int
hostent_test_getaddrinfo_eq(struct hostent * he,void * mdata __unused)758981aa50fSEnji Cooper hostent_test_getaddrinfo_eq(struct hostent *he, void *mdata __unused)
75908ca345cSEnji Cooper {
76008ca345cSEnji Cooper 	struct addrinfo *ai, hints;
76108ca345cSEnji Cooper 	int rv;
76208ca345cSEnji Cooper 
76308ca345cSEnji Cooper 	ai = NULL;
76408ca345cSEnji Cooper 	memset(&hints, 0, sizeof(struct addrinfo));
76508ca345cSEnji Cooper 	hints.ai_family = af_type;
76608ca345cSEnji Cooper 	hints.ai_flags = AI_CANONNAME;
76708ca345cSEnji Cooper 
76808ca345cSEnji Cooper 	printf("using getaddrinfo() to resolve %s\n", he->h_name);
76908ca345cSEnji Cooper 
77008ca345cSEnji Cooper 	/* struct hostent *he was not resolved */
77108ca345cSEnji Cooper 	if (he->h_addr_list == NULL) {
77208ca345cSEnji Cooper 		/* We can be sure that he->h_name is not NULL */
77308ca345cSEnji Cooper 		rv = getaddrinfo(he->h_name, NULL, &hints, &ai);
77408ca345cSEnji Cooper 		if (rv == 0) {
77508ca345cSEnji Cooper 			printf("not ok - shouldn't have been resolved\n");
776*ae442ee6SEnji Cooper 			rv = -1;
777*ae442ee6SEnji Cooper 		} else
778*ae442ee6SEnji Cooper 			rv = 0;
77908ca345cSEnji Cooper 	} else {
78008ca345cSEnji Cooper 		rv = getaddrinfo(he->h_name, NULL, &hints, &ai);
78108ca345cSEnji Cooper 		if (rv != 0) {
78208ca345cSEnji Cooper 			printf("not ok - should have been resolved\n");
783*ae442ee6SEnji Cooper 			rv = -1;
784*ae442ee6SEnji Cooper 			goto done;
78508ca345cSEnji Cooper 		}
78608ca345cSEnji Cooper 		rv = is_hostent_equal(he, ai);
78708ca345cSEnji Cooper 		if (rv != 0) {
78808ca345cSEnji Cooper 			printf("not ok - addrinfo and hostent are not equal\n");
789*ae442ee6SEnji Cooper 			rv = -1;
79008ca345cSEnji Cooper 		}
79108ca345cSEnji Cooper 	}
792*ae442ee6SEnji Cooper done:
793*ae442ee6SEnji Cooper 	if (ai != NULL)
794*ae442ee6SEnji Cooper 		freeaddrinfo(ai);
795*ae442ee6SEnji Cooper 	return (rv);
79608ca345cSEnji Cooper }
79708ca345cSEnji Cooper 
79808ca345cSEnji Cooper static int
hostent_test_getnameinfo_eq(struct hostent * he,void * mdata __unused)799981aa50fSEnji Cooper hostent_test_getnameinfo_eq(struct hostent *he, void *mdata __unused)
80008ca345cSEnji Cooper {
80108ca345cSEnji Cooper 	char **cp;
80208ca345cSEnji Cooper 	char buffer[NI_MAXHOST];
80308ca345cSEnji Cooper 	struct sockaddr_in sin;
80408ca345cSEnji Cooper 	struct sockaddr_in6 sin6;
80508ca345cSEnji Cooper 	struct sockaddr *saddr;
80608ca345cSEnji Cooper 	struct hostent *result;
80708ca345cSEnji Cooper 	int i, rv;
80808ca345cSEnji Cooper 
80908ca345cSEnji Cooper 	if (he->h_addr_list == NULL)
81008ca345cSEnji Cooper 		return (0);
81108ca345cSEnji Cooper 
81208ca345cSEnji Cooper 	for (cp = he->h_addr_list; *cp; ++cp) {
81308ca345cSEnji Cooper #ifdef DEBUG
81408ca345cSEnji Cooper 		printf("doing reverse lookup for %s\n", he->h_name);
81508ca345cSEnji Cooper #endif
81608ca345cSEnji Cooper 		result = __gethostbyaddr(*cp, he->h_length,
81708ca345cSEnji Cooper 		    he->h_addrtype);
81808ca345cSEnji Cooper 		if (result != NULL) {
81908ca345cSEnji Cooper 			rv = hostent_test_correctness(result, NULL);
82008ca345cSEnji Cooper 			if (rv != 0) {
82108ca345cSEnji Cooper 				__freehostent(result);
82208ca345cSEnji Cooper 				return (rv);
82308ca345cSEnji Cooper 			}
82408ca345cSEnji Cooper 		} else
82508ca345cSEnji Cooper 			printf("%s: warning: reverse lookup failed "
82608ca345cSEnji Cooper 			    "for %s: %s\n", __func__, he->h_name,
82708ca345cSEnji Cooper 			    strerror(errno));
82808ca345cSEnji Cooper 
82908ca345cSEnji Cooper 		switch (he->h_addrtype) {
83008ca345cSEnji Cooper 		case AF_INET:
83108ca345cSEnji Cooper 			memset(&sin, 0, sizeof(struct sockaddr_in));
83208ca345cSEnji Cooper 			sin.sin_len = sizeof(struct sockaddr_in);
83308ca345cSEnji Cooper 			sin.sin_family = AF_INET;
83408ca345cSEnji Cooper 			memcpy(&sin.sin_addr, *cp, he->h_length);
83508ca345cSEnji Cooper 
83608ca345cSEnji Cooper 			saddr = (struct sockaddr *)&sin;
83708ca345cSEnji Cooper 			break;
83808ca345cSEnji Cooper 		case AF_INET6:
83908ca345cSEnji Cooper 			memset(&sin6, 0, sizeof(struct sockaddr_in6));
84008ca345cSEnji Cooper 			sin6.sin6_len = sizeof(struct sockaddr_in6);
84108ca345cSEnji Cooper 			sin6.sin6_family = AF_INET6;
84208ca345cSEnji Cooper 			memcpy(&sin6.sin6_addr, *cp, he->h_length);
84308ca345cSEnji Cooper 
84408ca345cSEnji Cooper 			saddr = (struct sockaddr *)&sin6;
84508ca345cSEnji Cooper 			break;
84608ca345cSEnji Cooper 		default:
84708ca345cSEnji Cooper 			printf("warning: %d family is unsupported\n",
84808ca345cSEnji Cooper 			    he->h_addrtype);
84908ca345cSEnji Cooper 			continue;
85008ca345cSEnji Cooper 		}
85108ca345cSEnji Cooper 
85208ca345cSEnji Cooper 		ATF_REQUIRE(saddr != NULL);
85308ca345cSEnji Cooper 		rv = getnameinfo(saddr, saddr->sa_len, buffer,
85408ca345cSEnji Cooper 			sizeof(buffer), NULL, 0, NI_NAMEREQD);
85508ca345cSEnji Cooper 
85608ca345cSEnji Cooper 		if (rv != 0 && result != NULL) {
85708ca345cSEnji Cooper 			printf("getnameinfo() didn't make the reverse "
85808ca345cSEnji Cooper 			    "lookup, when it should have (%s)\n",
85908ca345cSEnji Cooper 			    gai_strerror(rv));
86008ca345cSEnji Cooper 			return (rv);
86108ca345cSEnji Cooper 		}
86208ca345cSEnji Cooper 
86308ca345cSEnji Cooper 		if (rv == 0 && result == NULL) {
86408ca345cSEnji Cooper 			printf("getnameinfo() made the "
86508ca345cSEnji Cooper 			    "reverse lookup, when it shouldn't have\n");
86608ca345cSEnji Cooper 			return (rv);
86708ca345cSEnji Cooper 		}
86808ca345cSEnji Cooper 
86908ca345cSEnji Cooper 		if (rv != 0 && result == NULL) {
87008ca345cSEnji Cooper #ifdef DEBUG
87108ca345cSEnji Cooper 			printf("both getnameinfo() and ***byaddr() failed as "
87208ca345cSEnji Cooper 			    "expected\n");
87308ca345cSEnji Cooper #endif
87408ca345cSEnji Cooper 			continue;
87508ca345cSEnji Cooper 		}
87608ca345cSEnji Cooper 
87708ca345cSEnji Cooper #ifdef DEBUG
87808ca345cSEnji Cooper 		printf("comparing %s with %s\n", result->h_name,
87908ca345cSEnji Cooper 		    buffer);
88008ca345cSEnji Cooper #endif
88108ca345cSEnji Cooper 
88208ca345cSEnji Cooper 		/*
88308ca345cSEnji Cooper 		 * An address might reverse resolve to hostname alias or the
88408ca345cSEnji Cooper 		 * official hostname, e.g. moon.vub.ac.be.
88508ca345cSEnji Cooper 		 */
886dedafe64SEnji Cooper 		bool found_a_match = false;
88708ca345cSEnji Cooper 
88808ca345cSEnji Cooper 		if (strcmp(result->h_name, buffer) == 0) {
88908ca345cSEnji Cooper 			found_a_match = true;
89008ca345cSEnji Cooper #ifdef DEBUG
89108ca345cSEnji Cooper 			printf("matched official hostname\n");
89208ca345cSEnji Cooper #endif
89308ca345cSEnji Cooper 		} else {
894a03cc61dSConrad Meyer 			for (i = 0; result->h_aliases[i] != NULL; i++) {
89508ca345cSEnji Cooper 				printf("[%d] resolved: %s\n", i,
89608ca345cSEnji Cooper 				    result->h_aliases[i]);
89708ca345cSEnji Cooper 				if (strcmp(result->h_aliases[i],
89808ca345cSEnji Cooper 				    buffer) == 0) {
89908ca345cSEnji Cooper 					printf("matched hostname alias\n");
90008ca345cSEnji Cooper 					found_a_match = true;
90108ca345cSEnji Cooper 					break;
90208ca345cSEnji Cooper 				}
90308ca345cSEnji Cooper 			}
90408ca345cSEnji Cooper 		}
90508ca345cSEnji Cooper 		__freehostent(result);
90608ca345cSEnji Cooper 
90708ca345cSEnji Cooper 		if (found_a_match) {
90808ca345cSEnji Cooper #ifdef DEBUG
90908ca345cSEnji Cooper 			printf("getnameinfo() and ***byaddr() results are "
91008ca345cSEnji Cooper 			    "equal\n");
91108ca345cSEnji Cooper #endif
91208ca345cSEnji Cooper 		} else {
91308ca345cSEnji Cooper 			printf("getnameinfo() and ***byaddr() results are not "
91408ca345cSEnji Cooper 			    "equal for %s\n", he->h_name);
91508ca345cSEnji Cooper 			return (-1);
91608ca345cSEnji Cooper 		}
91708ca345cSEnji Cooper 	}
91808ca345cSEnji Cooper 
91908ca345cSEnji Cooper 	return (0);
92008ca345cSEnji Cooper }
92108ca345cSEnji Cooper 
92258c03e4eSEnji Cooper static int
run_tests(const char * hostlist_file,const char * snapshot_file,int _af_type,enum test_methods method,bool use_ipv6_mapping)923981aa50fSEnji Cooper run_tests(const char *hostlist_file, const char *snapshot_file, int _af_type,
92408ca345cSEnji Cooper     enum test_methods method, bool use_ipv6_mapping)
92508ca345cSEnji Cooper {
9268eb23675SEnji Cooper 	char *snapshot_file_copy;
92708ca345cSEnji Cooper 	struct hostent_test_data td, td_addr, td_snap;
92808ca345cSEnji Cooper 	res_state statp;
92908ca345cSEnji Cooper 	int rv = -2;
93008ca345cSEnji Cooper 
9318eb23675SEnji Cooper 	if (snapshot_file == NULL)
9328eb23675SEnji Cooper 		snapshot_file_copy = NULL;
9338eb23675SEnji Cooper 	else {
9348eb23675SEnji Cooper 		snapshot_file_copy = strdup(snapshot_file);
9358eb23675SEnji Cooper 		ATF_REQUIRE(snapshot_file_copy != NULL);
9368eb23675SEnji Cooper 	}
9378eb23675SEnji Cooper 	snapshot_file = snapshot_file_copy;
9388eb23675SEnji Cooper 
939981aa50fSEnji Cooper 	switch (_af_type) {
94008ca345cSEnji Cooper 	case AF_INET:
94108ca345cSEnji Cooper 		ATF_REQUIRE_FEATURE("inet");
94208ca345cSEnji Cooper 		ATF_REQUIRE(!use_ipv6_mapping);
94308ca345cSEnji Cooper 		break;
94408ca345cSEnji Cooper 	case AF_INET6:
94508ca345cSEnji Cooper 		ATF_REQUIRE_FEATURE("inet6");
94608ca345cSEnji Cooper 		break;
94708ca345cSEnji Cooper 	default:
948981aa50fSEnji Cooper 		atf_tc_fail("unhandled address family: %d", _af_type);
94908ca345cSEnji Cooper 		break;
95008ca345cSEnji Cooper 	}
95108ca345cSEnji Cooper 
95208ca345cSEnji Cooper 	if (!use_ipnode_functions) {
95308ca345cSEnji Cooper 		statp = __res_state();
95408ca345cSEnji Cooper 		if (statp == NULL || ((statp->options & RES_INIT) == 0 &&
95508ca345cSEnji Cooper 		    res_ninit(statp) == -1)) {
95608ca345cSEnji Cooper 			printf("error: can't init res_state\n");
9578eb23675SEnji Cooper 			rv = -1;
9588eb23675SEnji Cooper 			goto fin2;
95908ca345cSEnji Cooper 		}
96008ca345cSEnji Cooper 
96108ca345cSEnji Cooper 		if (use_ipv6_mapping)
96208ca345cSEnji Cooper 			statp->options |= RES_USE_INET6;
96308ca345cSEnji Cooper 		else
96408ca345cSEnji Cooper 			statp->options &= ~RES_USE_INET6;
96508ca345cSEnji Cooper 	}
96608ca345cSEnji Cooper 
96708ca345cSEnji Cooper 	TEST_DATA_INIT(hostent, &td, clone_hostent, free_hostent);
96808ca345cSEnji Cooper 	TEST_DATA_INIT(hostent, &td_addr, clone_hostent, free_hostent);
96908ca345cSEnji Cooper 	TEST_DATA_INIT(hostent, &td_snap, clone_hostent, free_hostent);
97008ca345cSEnji Cooper 
97108ca345cSEnji Cooper 	if (access(hostlist_file, R_OK) != 0) {
97208ca345cSEnji Cooper 		printf("can't access the hostlist file %s\n", hostlist_file);
97308ca345cSEnji Cooper 		rv = -1;
97408ca345cSEnji Cooper 		goto fin;
97508ca345cSEnji Cooper 	}
97608ca345cSEnji Cooper 
97708ca345cSEnji Cooper #ifdef DEBUG
97808ca345cSEnji Cooper 	printf("building host lists from %s\n", hostlist_file);
97908ca345cSEnji Cooper #endif
98008ca345cSEnji Cooper 
98108ca345cSEnji Cooper 	rv = TEST_SNAPSHOT_FILE_READ(hostent, hostlist_file, &td,
98208ca345cSEnji Cooper 		hostent_read_hostlist_func);
98308ca345cSEnji Cooper 	if (rv != 0) {
98408ca345cSEnji Cooper 		printf("failed to read the host list file: %s\n",
98508ca345cSEnji Cooper 		    hostlist_file);
98608ca345cSEnji Cooper 		goto fin;
98708ca345cSEnji Cooper 	}
98808ca345cSEnji Cooper 
98908ca345cSEnji Cooper 	if (snapshot_file != NULL) {
99008ca345cSEnji Cooper 		if (access(snapshot_file, W_OK | R_OK) != 0) {
99108ca345cSEnji Cooper 			if (errno == ENOENT) {
99208ca345cSEnji Cooper 				if (method != TEST_GETHOSTBYADDR)
99308ca345cSEnji Cooper 					method = TEST_BUILD_SNAPSHOT;
99408ca345cSEnji Cooper 				else
99508ca345cSEnji Cooper 					method = TEST_BUILD_ADDR_SNAPSHOT;
99608ca345cSEnji Cooper 			} else {
99708ca345cSEnji Cooper 				printf("can't access the snapshot file %s\n",
99808ca345cSEnji Cooper 				    snapshot_file);
99908ca345cSEnji Cooper 				rv = -1;
100008ca345cSEnji Cooper 				goto fin;
100108ca345cSEnji Cooper 			}
100208ca345cSEnji Cooper 		} else {
100308ca345cSEnji Cooper 			rv = TEST_SNAPSHOT_FILE_READ(hostent, snapshot_file,
100408ca345cSEnji Cooper 				&td_snap, hostent_read_snapshot_func);
100508ca345cSEnji Cooper 			if (rv != 0) {
100608ca345cSEnji Cooper 				printf("error reading snapshot file\n");
100708ca345cSEnji Cooper 				goto fin;
100808ca345cSEnji Cooper 			}
100908ca345cSEnji Cooper 		}
101008ca345cSEnji Cooper 	}
101108ca345cSEnji Cooper 
101208ca345cSEnji Cooper 	switch (method) {
101308ca345cSEnji Cooper 	case TEST_GETHOSTBYNAME2:
101408ca345cSEnji Cooper 		if (snapshot_file != NULL)
101508ca345cSEnji Cooper 			rv = DO_2PASS_TEST(hostent, &td, &td_snap,
101608ca345cSEnji Cooper 			    compare_hostent, NULL);
101708ca345cSEnji Cooper 		break;
101808ca345cSEnji Cooper 	case TEST_GETHOSTBYADDR:
101908ca345cSEnji Cooper 		rv = DO_1PASS_TEST(hostent, &td,
102008ca345cSEnji Cooper 			hostent_test_gethostbyaddr, (void *)&td_addr);
102108ca345cSEnji Cooper 		if (rv != 0)
102208ca345cSEnji Cooper 			goto fin;
102308ca345cSEnji Cooper 
102408ca345cSEnji Cooper 		if (snapshot_file != NULL)
102508ca345cSEnji Cooper 			rv = DO_2PASS_TEST(hostent, &td_addr, &td_snap,
102608ca345cSEnji Cooper 			    compare_hostent, NULL);
102708ca345cSEnji Cooper 		break;
102808ca345cSEnji Cooper 	case TEST_GETHOSTBYNAME2_GETADDRINFO:
102908ca345cSEnji Cooper 		rv = DO_1PASS_TEST(hostent, &td,
103008ca345cSEnji Cooper 			hostent_test_getaddrinfo_eq, NULL);
103108ca345cSEnji Cooper 		break;
103208ca345cSEnji Cooper 	case TEST_GETHOSTBYADDR_GETNAMEINFO:
103308ca345cSEnji Cooper 		rv = DO_1PASS_TEST(hostent, &td,
103408ca345cSEnji Cooper 			hostent_test_getnameinfo_eq, NULL);
103508ca345cSEnji Cooper 		break;
103608ca345cSEnji Cooper 	case TEST_BUILD_SNAPSHOT:
103708ca345cSEnji Cooper 		if (snapshot_file != NULL) {
103808ca345cSEnji Cooper 			rv = TEST_SNAPSHOT_FILE_WRITE(hostent, snapshot_file,
103908ca345cSEnji Cooper 			    &td, sdump_hostent);
104008ca345cSEnji Cooper 		}
104108ca345cSEnji Cooper 		break;
104208ca345cSEnji Cooper 	case TEST_BUILD_ADDR_SNAPSHOT:
104308ca345cSEnji Cooper 		if (snapshot_file != NULL) {
104408ca345cSEnji Cooper 			rv = DO_1PASS_TEST(hostent, &td,
104508ca345cSEnji Cooper 			    hostent_test_gethostbyaddr, (void *)&td_addr);
104608ca345cSEnji Cooper 			if (rv != 0)
104708ca345cSEnji Cooper 				goto fin;
104808ca345cSEnji Cooper 			rv = TEST_SNAPSHOT_FILE_WRITE(hostent, snapshot_file,
104908ca345cSEnji Cooper 			    &td_addr, sdump_hostent);
105008ca345cSEnji Cooper 		}
105108ca345cSEnji Cooper 		break;
105208ca345cSEnji Cooper 	default:
105308ca345cSEnji Cooper 		rv = 0;
105408ca345cSEnji Cooper 		break;
105508ca345cSEnji Cooper 	}
105608ca345cSEnji Cooper 
105708ca345cSEnji Cooper fin:
105808ca345cSEnji Cooper 	TEST_DATA_DESTROY(hostent, &td_snap);
105908ca345cSEnji Cooper 	TEST_DATA_DESTROY(hostent, &td_addr);
106008ca345cSEnji Cooper 	TEST_DATA_DESTROY(hostent, &td);
106108ca345cSEnji Cooper 
10628eb23675SEnji Cooper fin2:
10638eb23675SEnji Cooper 	free(snapshot_file_copy);
10648eb23675SEnji Cooper 
106508ca345cSEnji Cooper 	return (rv);
106608ca345cSEnji Cooper }
106708ca345cSEnji Cooper 
106808ca345cSEnji Cooper #define	HOSTLIST_FILE	"mach"
106908ca345cSEnji Cooper 
107008ca345cSEnji Cooper #define	_RUN_TESTS(tc, snapshot_file, af_type, method, use_ipv6_mapping) \
107108ca345cSEnji Cooper do {									\
107208ca345cSEnji Cooper 	char *_hostlist_file;						\
107308ca345cSEnji Cooper 	ATF_REQUIRE(0 < asprintf(&_hostlist_file, "%s/%s",		\
107408ca345cSEnji Cooper 	    atf_tc_get_config_var(tc, "srcdir"), HOSTLIST_FILE));	\
10758eb23675SEnji Cooper 	ATF_REQUIRE(run_tests(_hostlist_file, snapshot_file, af_type,	\
107608ca345cSEnji Cooper 	    method, use_ipv6_mapping) == 0);				\
10778eb23675SEnji Cooper 	free(_hostlist_file);						\
107808ca345cSEnji Cooper } while (0)
107908ca345cSEnji Cooper 
108008ca345cSEnji Cooper #define	RUN_HOST_TESTS(tc, snapshot_file, af_type, method, use_ipv6_mapping) \
108108ca345cSEnji Cooper do {									\
108208ca345cSEnji Cooper 	use_ipnode_functions = false; 					\
108308ca345cSEnji Cooper 	_RUN_TESTS(tc, snapshot_file, af_type, method, use_ipv6_mapping); \
108408ca345cSEnji Cooper } while (0)
108508ca345cSEnji Cooper 
108608ca345cSEnji Cooper #define	RUN_IPNODE_TESTS(tc, snapshot_file, af_type, method, use_ipv6_mapping) \
108708ca345cSEnji Cooper do {									\
108808ca345cSEnji Cooper 	use_ipnode_functions = true; 					\
108908ca345cSEnji Cooper 	_RUN_TESTS(tc, snapshot_file, af_type, method, use_ipv6_mapping); \
109008ca345cSEnji Cooper } while (0)
109108ca345cSEnji Cooper 
109208ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_ipv4);
ATF_TC_BODY(gethostbyaddr_ipv4,tc)109308ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_ipv4, tc)
109408ca345cSEnji Cooper {
109508ca345cSEnji Cooper 
109608ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYADDR, false);
109708ca345cSEnji Cooper }
109808ca345cSEnji Cooper 
109908ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_ipv4_with_snapshot);
ATF_TC_BODY(gethostbyaddr_ipv4_with_snapshot,tc)110008ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_ipv4_with_snapshot, tc)
110108ca345cSEnji Cooper {
110208ca345cSEnji Cooper 
110308ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, "snapshot_htaddr4", AF_INET, TEST_GETHOSTBYADDR, false);
110408ca345cSEnji Cooper }
110508ca345cSEnji Cooper 
110608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_ipv6);
ATF_TC_BODY(gethostbyaddr_ipv6,tc)110708ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_ipv6, tc)
110808ca345cSEnji Cooper {
110908ca345cSEnji Cooper 
111008ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR, false);
111108ca345cSEnji Cooper }
111208ca345cSEnji Cooper 
111308ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_ipv6_AI_V4MAPPED);
ATF_TC_BODY(gethostbyaddr_ipv6_AI_V4MAPPED,tc)111408ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_ipv6_AI_V4MAPPED, tc)
111508ca345cSEnji Cooper {
111608ca345cSEnji Cooper 
111708ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
111808ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR, true);
111908ca345cSEnji Cooper }
112008ca345cSEnji Cooper 
112108ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_ipv6_with_snapshot);
ATF_TC_BODY(gethostbyaddr_ipv6_with_snapshot,tc)112208ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_ipv6_with_snapshot, tc)
112308ca345cSEnji Cooper {
112408ca345cSEnji Cooper 
112508ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, "snapshot_htaddr6", AF_INET6, TEST_GETHOSTBYADDR, false);
112608ca345cSEnji Cooper }
112708ca345cSEnji Cooper 
112808ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_ipv6_with_snapshot_AI_V4MAPPED);
ATF_TC_BODY(gethostbyaddr_ipv6_with_snapshot_AI_V4MAPPED,tc)112908ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_ipv6_with_snapshot_AI_V4MAPPED, tc)
113008ca345cSEnji Cooper {
113108ca345cSEnji Cooper 
113208ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
113308ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, "snapshot_htaddr6map", AF_INET6, TEST_GETHOSTBYADDR, true);
113408ca345cSEnji Cooper }
113508ca345cSEnji Cooper 
113608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_getaddrinfo_ipv4);
ATF_TC_BODY(gethostbyname2_getaddrinfo_ipv4,tc)113708ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_getaddrinfo_ipv4, tc)
113808ca345cSEnji Cooper {
113908ca345cSEnji Cooper 
114008ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYNAME2_GETADDRINFO, false);
114108ca345cSEnji Cooper }
114208ca345cSEnji Cooper 
114308ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_getaddrinfo_ipv6);
ATF_TC_BODY(gethostbyname2_getaddrinfo_ipv6,tc)114408ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_getaddrinfo_ipv6, tc)
114508ca345cSEnji Cooper {
114608ca345cSEnji Cooper 
114708ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2_GETADDRINFO, false);
114808ca345cSEnji Cooper }
114908ca345cSEnji Cooper 
115008ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_getnameinfo_ipv4);
ATF_TC_BODY(gethostbyaddr_getnameinfo_ipv4,tc)115108ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_getnameinfo_ipv4, tc)
115208ca345cSEnji Cooper {
115308ca345cSEnji Cooper 
115408ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYADDR_GETNAMEINFO, false);
115508ca345cSEnji Cooper }
115608ca345cSEnji Cooper 
115708ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyaddr_getnameinfo_ipv6);
ATF_TC_BODY(gethostbyaddr_getnameinfo_ipv6,tc)115808ca345cSEnji Cooper ATF_TC_BODY(gethostbyaddr_getnameinfo_ipv6, tc)
115908ca345cSEnji Cooper {
116008ca345cSEnji Cooper 
116108ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR_GETNAMEINFO, false);
116208ca345cSEnji Cooper }
116308ca345cSEnji Cooper 
116408ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_ipv4);
ATF_TC_BODY(gethostbyname2_ipv4,tc)116508ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_ipv4, tc)
116608ca345cSEnji Cooper {
116708ca345cSEnji Cooper 
116808ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYNAME2, false);
116908ca345cSEnji Cooper }
117008ca345cSEnji Cooper 
117108ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_ipv4_with_snapshot);
ATF_TC_BODY(gethostbyname2_ipv4_with_snapshot,tc)117208ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_ipv4_with_snapshot, tc)
117308ca345cSEnji Cooper {
117408ca345cSEnji Cooper 
117508ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, "snapshot_htname4", AF_INET, TEST_GETHOSTBYNAME2, false);
117608ca345cSEnji Cooper }
117708ca345cSEnji Cooper 
117808ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_ipv6);
ATF_TC_BODY(gethostbyname2_ipv6,tc)117908ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_ipv6, tc)
118008ca345cSEnji Cooper {
118108ca345cSEnji Cooper 
118208ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, false);
118308ca345cSEnji Cooper }
118408ca345cSEnji Cooper 
118508ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_ipv6_AI_V4MAPPED);
ATF_TC_BODY(gethostbyname2_ipv6_AI_V4MAPPED,tc)118608ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_ipv6_AI_V4MAPPED, tc)
118708ca345cSEnji Cooper {
118808ca345cSEnji Cooper 
118908ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
119008ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, true);
119108ca345cSEnji Cooper }
119208ca345cSEnji Cooper 
119308ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_ipv6_with_snapshot);
ATF_TC_BODY(gethostbyname2_ipv6_with_snapshot,tc)119408ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_ipv6_with_snapshot, tc)
119508ca345cSEnji Cooper {
119608ca345cSEnji Cooper 
119708ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, "snapshot_htname6", AF_INET6, TEST_GETHOSTBYNAME2, false);
119808ca345cSEnji Cooper }
119908ca345cSEnji Cooper 
120008ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(gethostbyname2_ipv6_with_snapshot_AI_V4MAPPED);
ATF_TC_BODY(gethostbyname2_ipv6_with_snapshot_AI_V4MAPPED,tc)120108ca345cSEnji Cooper ATF_TC_BODY(gethostbyname2_ipv6_with_snapshot_AI_V4MAPPED, tc)
120208ca345cSEnji Cooper {
120308ca345cSEnji Cooper 
120408ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
120508ca345cSEnji Cooper 	RUN_HOST_TESTS(tc, "snapshot_htname6map", AF_INET6, TEST_GETHOSTBYNAME2, true);
120608ca345cSEnji Cooper }
120708ca345cSEnji Cooper 
120808ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv4);
ATF_TC_BODY(getipnodebyaddr_ipv4,tc)120908ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv4, tc)
121008ca345cSEnji Cooper {
121108ca345cSEnji Cooper 
121208ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYADDR, false);
121308ca345cSEnji Cooper }
121408ca345cSEnji Cooper 
121508ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv4_with_snapshot);
ATF_TC_BODY(getipnodebyaddr_ipv4_with_snapshot,tc)121608ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv4_with_snapshot, tc)
121708ca345cSEnji Cooper {
121808ca345cSEnji Cooper 
121908ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, "snapshot_ipnodeaddr4", AF_INET, TEST_GETHOSTBYADDR, false);
122008ca345cSEnji Cooper }
122108ca345cSEnji Cooper 
122208ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_getnameinfo_ipv4);
ATF_TC_BODY(getipnodebyaddr_getnameinfo_ipv4,tc)122308ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_getnameinfo_ipv4, tc)
122408ca345cSEnji Cooper {
122508ca345cSEnji Cooper 
122608ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYADDR_GETNAMEINFO, false);
122708ca345cSEnji Cooper }
122808ca345cSEnji Cooper 
122908ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6);
ATF_TC_BODY(getipnodebyaddr_ipv6,tc)123008ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6, tc)
123108ca345cSEnji Cooper {
123208ca345cSEnji Cooper 
123308ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR, false);
123408ca345cSEnji Cooper }
123508ca345cSEnji Cooper 
123608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6_AI_V4MAPPED);
ATF_TC_BODY(getipnodebyaddr_ipv6_AI_V4MAPPED,tc)123708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6_AI_V4MAPPED, tc)
123808ca345cSEnji Cooper {
123908ca345cSEnji Cooper 
124008ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
124108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR, true);
124208ca345cSEnji Cooper }
124308ca345cSEnji Cooper 
124408ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6_AI_V4MAPPED_CFG);
ATF_TC_BODY(getipnodebyaddr_ipv6_AI_V4MAPPED_CFG,tc)124508ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6_AI_V4MAPPED_CFG, tc)
124608ca345cSEnji Cooper {
124708ca345cSEnji Cooper 
124808ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG;
124908ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR, true);
125008ca345cSEnji Cooper }
125108ca345cSEnji Cooper 
125208ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6_AI_V4MAPPED_CFG_AI_ALL);
ATF_TC_BODY(getipnodebyaddr_ipv6_AI_V4MAPPED_CFG_AI_ALL,tc)125308ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6_AI_V4MAPPED_CFG_AI_ALL, tc)
125408ca345cSEnji Cooper {
125508ca345cSEnji Cooper 
125608ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG | AI_ALL;
125708ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR, true);
125808ca345cSEnji Cooper }
125908ca345cSEnji Cooper 
126008ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6_with_snapshot);
ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot,tc)126108ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot, tc)
126208ca345cSEnji Cooper {
126308ca345cSEnji Cooper 
126408ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, "snapshot_ipnodeaddr6", AF_INET6, TEST_GETHOSTBYADDR, false);
126508ca345cSEnji Cooper }
126608ca345cSEnji Cooper 
126708ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED);
ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED,tc)126808ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED, tc)
126908ca345cSEnji Cooper {
127008ca345cSEnji Cooper 
127108ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
127208ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc,
127308ca345cSEnji Cooper 	    "snapshot_ipnodeaddr6_AI_V4MAPPED", AF_INET6,
127408ca345cSEnji Cooper 	    TEST_GETHOSTBYADDR, true);
127508ca345cSEnji Cooper }
127608ca345cSEnji Cooper 
127708ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG);
ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG,tc)127808ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG, tc)
127908ca345cSEnji Cooper {
128008ca345cSEnji Cooper 
128108ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG;
128208ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc,
128308ca345cSEnji Cooper 	    "snapshot_ipnodeaddr6_AI_V4MAPPED_CFG", AF_INET6,
128408ca345cSEnji Cooper 	    TEST_GETHOSTBYADDR, true);
128508ca345cSEnji Cooper }
128608ca345cSEnji Cooper 
128708ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL);
ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL,tc)128808ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL, tc)
128908ca345cSEnji Cooper {
129008ca345cSEnji Cooper 
129108ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG | AI_ALL;
129208ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc,
129308ca345cSEnji Cooper 	    "snapshot_ipnodeaddr6_AI_V4MAPPED_CFG_AI_ALL", AF_INET6,
129408ca345cSEnji Cooper 	    TEST_GETHOSTBYADDR, true);
129508ca345cSEnji Cooper }
129608ca345cSEnji Cooper 
129708ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyaddr_getnameinfo_ipv6);
ATF_TC_BODY(getipnodebyaddr_getnameinfo_ipv6,tc)129808ca345cSEnji Cooper ATF_TC_BODY(getipnodebyaddr_getnameinfo_ipv6, tc)
129908ca345cSEnji Cooper {
130008ca345cSEnji Cooper 
130108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYADDR_GETNAMEINFO, false);
130208ca345cSEnji Cooper }
130308ca345cSEnji Cooper 
130408ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv4);
ATF_TC_BODY(getipnodebyname_ipv4,tc)130508ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv4, tc)
130608ca345cSEnji Cooper {
130708ca345cSEnji Cooper 
130808ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYNAME2, false);
130908ca345cSEnji Cooper }
131008ca345cSEnji Cooper 
131108ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv4_with_snapshot);
ATF_TC_BODY(getipnodebyname_ipv4_with_snapshot,tc)131208ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv4_with_snapshot, tc)
131308ca345cSEnji Cooper {
131408ca345cSEnji Cooper 
131508ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, "snapshot_ipnodename4", AF_INET, TEST_GETHOSTBYNAME2, false);
131608ca345cSEnji Cooper }
131708ca345cSEnji Cooper 
131808ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv4_AI_ADDRCONFIG);
ATF_TC_BODY(getipnodebyname_ipv4_AI_ADDRCONFIG,tc)131908ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv4_AI_ADDRCONFIG, tc)
132008ca345cSEnji Cooper {
132108ca345cSEnji Cooper 
132208ca345cSEnji Cooper 	ipnode_flags = AI_ADDRCONFIG;
132308ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYNAME2, false);
132408ca345cSEnji Cooper }
132508ca345cSEnji Cooper 
132608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv4_with_snapshot_AI_ADDRCONFIG);
ATF_TC_BODY(getipnodebyname_ipv4_with_snapshot_AI_ADDRCONFIG,tc)132708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv4_with_snapshot_AI_ADDRCONFIG, tc)
132808ca345cSEnji Cooper {
132908ca345cSEnji Cooper 
133008ca345cSEnji Cooper 	ipnode_flags = AI_ADDRCONFIG;
133108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, "snapshot_ipnodename4_AI_ADDRCONFIG", AF_INET,
133208ca345cSEnji Cooper 	    TEST_GETHOSTBYNAME2, false);
133308ca345cSEnji Cooper }
133408ca345cSEnji Cooper 
133508ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_getaddrinfo_ipv4);
ATF_TC_BODY(getipnodebyname_getaddrinfo_ipv4,tc)133608ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_getaddrinfo_ipv4, tc)
133708ca345cSEnji Cooper {
133808ca345cSEnji Cooper 
133908ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET, TEST_GETHOSTBYNAME2_GETADDRINFO, false);
134008ca345cSEnji Cooper }
134108ca345cSEnji Cooper 
134208ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6);
ATF_TC_BODY(getipnodebyname_ipv6,tc)134308ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6, tc)
134408ca345cSEnji Cooper {
134508ca345cSEnji Cooper 
134608ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, false);
134708ca345cSEnji Cooper }
134808ca345cSEnji Cooper 
134908ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_with_snapshot);
ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot,tc)135008ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot, tc)
135108ca345cSEnji Cooper {
135208ca345cSEnji Cooper 
135308ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, "snapshot_ipnodename6", AF_INET6, TEST_GETHOSTBYNAME2, false);
135408ca345cSEnji Cooper }
135508ca345cSEnji Cooper 
135608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_AI_ADDRCONFIG);
ATF_TC_BODY(getipnodebyname_ipv6_AI_ADDRCONFIG,tc)135708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_AI_ADDRCONFIG, tc)
135808ca345cSEnji Cooper {
135908ca345cSEnji Cooper 
136008ca345cSEnji Cooper 	ipnode_flags = AI_ADDRCONFIG;
136108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, false);
136208ca345cSEnji Cooper }
136308ca345cSEnji Cooper 
136408ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_AI_V4MAPPED);
ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED,tc)136508ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED, tc)
136608ca345cSEnji Cooper {
136708ca345cSEnji Cooper 
136808ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
136908ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, true);
137008ca345cSEnji Cooper }
137108ca345cSEnji Cooper 
137208ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_AI_V4MAPPED_CFG);
ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED_CFG,tc)137308ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED_CFG, tc)
137408ca345cSEnji Cooper {
137508ca345cSEnji Cooper 
137608ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG;
137708ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, true);
137808ca345cSEnji Cooper }
137908ca345cSEnji Cooper 
138008ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ADDRCONFIG);
ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ADDRCONFIG,tc)138108ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ADDRCONFIG, tc)
138208ca345cSEnji Cooper {
138308ca345cSEnji Cooper 
138408ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG | AI_ADDRCONFIG;
138508ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, false);
138608ca345cSEnji Cooper }
138708ca345cSEnji Cooper 
138808ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ALL);
ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ALL,tc)138908ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ALL, tc)
139008ca345cSEnji Cooper {
139108ca345cSEnji Cooper 
139208ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG | AI_ALL;
139308ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2, true);
139408ca345cSEnji Cooper }
139508ca345cSEnji Cooper 
139608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED);
ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED,tc)139708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED, tc)
139808ca345cSEnji Cooper {
139908ca345cSEnji Cooper 
140008ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED;
140108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc,
140208ca345cSEnji Cooper 	    "snapshot_ipnodename6_AI_V4MAPPED", AF_INET6,
140308ca345cSEnji Cooper 	    TEST_GETHOSTBYNAME2, true);
140408ca345cSEnji Cooper }
140508ca345cSEnji Cooper 
140608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG);
ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG,tc)140708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG, tc)
140808ca345cSEnji Cooper {
140908ca345cSEnji Cooper 
141008ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG;
141108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc,
141208ca345cSEnji Cooper 	    "snapshot_ipnodename6_AI_V4MAPPED_CFG", AF_INET6,
141308ca345cSEnji Cooper 	    TEST_GETHOSTBYNAME2, true);
141408ca345cSEnji Cooper }
141508ca345cSEnji Cooper 
141608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ADDRCONFIG);
ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ADDRCONFIG,tc)141708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ADDRCONFIG, tc)
141808ca345cSEnji Cooper {
141908ca345cSEnji Cooper 
142008ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG | AI_ADDRCONFIG;
142108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc,
142208ca345cSEnji Cooper 	    "snapshot_ipnodename6_AI_V4MAPPED_CFG_AI_ADDRCONFIG", AF_INET6,
142308ca345cSEnji Cooper 	    TEST_GETHOSTBYNAME2, false);
142408ca345cSEnji Cooper }
142508ca345cSEnji Cooper 
142608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL);
ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL,tc)142708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL, tc)
142808ca345cSEnji Cooper {
142908ca345cSEnji Cooper 
143008ca345cSEnji Cooper 	ipnode_flags = AI_V4MAPPED_CFG | AI_ALL;
143108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc,
143208ca345cSEnji Cooper 	    "snapshot_ipnodename6_AI_V4MAPPED_CFG_AI_ALL", AF_INET6,
143308ca345cSEnji Cooper 	    TEST_GETHOSTBYNAME2, true);
143408ca345cSEnji Cooper }
143508ca345cSEnji Cooper 
143608ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_ipv6_with_snapshot_AI_ADDRCONFIG);
ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_ADDRCONFIG,tc)143708ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_ipv6_with_snapshot_AI_ADDRCONFIG, tc)
143808ca345cSEnji Cooper {
143908ca345cSEnji Cooper 
144008ca345cSEnji Cooper 	ipnode_flags = AI_ADDRCONFIG;
144108ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, "snapshot_ipnodename6_AI_ADDRCONFIG", AF_INET6,
144208ca345cSEnji Cooper 	    TEST_GETHOSTBYNAME2, false);
144308ca345cSEnji Cooper }
144408ca345cSEnji Cooper 
144508ca345cSEnji Cooper ATF_TC_WITHOUT_HEAD(getipnodebyname_getaddrinfo_ipv6);
ATF_TC_BODY(getipnodebyname_getaddrinfo_ipv6,tc)144608ca345cSEnji Cooper ATF_TC_BODY(getipnodebyname_getaddrinfo_ipv6, tc)
144708ca345cSEnji Cooper {
144808ca345cSEnji Cooper 
144908ca345cSEnji Cooper 	RUN_IPNODE_TESTS(tc, NULL, AF_INET6, TEST_GETHOSTBYNAME2_GETADDRINFO, false);
145008ca345cSEnji Cooper }
145108ca345cSEnji Cooper 
ATF_TP_ADD_TCS(tp)145208ca345cSEnji Cooper ATF_TP_ADD_TCS(tp)
145308ca345cSEnji Cooper {
145408ca345cSEnji Cooper 
145508ca345cSEnji Cooper 	/* gethostbyaddr */
145608ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_ipv4);
145708ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_ipv4_with_snapshot);
145808ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_ipv6);
145908ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_ipv6_AI_V4MAPPED); /* XXX */
146008ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_ipv6_with_snapshot);
146108ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_ipv6_with_snapshot_AI_V4MAPPED);
146208ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_getnameinfo_ipv4);
146308ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyaddr_getnameinfo_ipv6);
146408ca345cSEnji Cooper 
146508ca345cSEnji Cooper 	/* gethostbyname2 */
146608ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_getaddrinfo_ipv4);
146708ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_getaddrinfo_ipv6);
146808ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_ipv4);
146908ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_ipv4_with_snapshot);
147008ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_ipv6);
147108ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_ipv6_AI_V4MAPPED);
147208ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_ipv6_with_snapshot);
147308ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, gethostbyname2_ipv6_with_snapshot_AI_V4MAPPED);
147408ca345cSEnji Cooper 
147508ca345cSEnji Cooper 	/* getipnodebyaddr */
147608ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv4);
147708ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv4_with_snapshot);
147808ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_getnameinfo_ipv4);
147908ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6);
148008ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6_AI_V4MAPPED);
148108ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6_AI_V4MAPPED_CFG);
148208ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6_AI_V4MAPPED_CFG_AI_ALL);
148308ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6_with_snapshot);
148408ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED);
148508ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG);
148608ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL);
148708ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyaddr_getnameinfo_ipv6);
148808ca345cSEnji Cooper 
148908ca345cSEnji Cooper 	/* getipnodebyname */
149008ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv4);
149108ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv4_with_snapshot);
149208ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv4_AI_ADDRCONFIG);
149308ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv4_with_snapshot_AI_ADDRCONFIG);
149408ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_getaddrinfo_ipv4);
149508ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6);
149608ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_with_snapshot);
149708ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_AI_ADDRCONFIG);
149808ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_AI_V4MAPPED);
149908ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_AI_V4MAPPED_CFG);
150008ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ADDRCONFIG);
150108ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_AI_V4MAPPED_CFG_AI_ALL);
150208ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED);
150308ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG);
150408ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ADDRCONFIG);
150508ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_with_snapshot_AI_V4MAPPED_CFG_AI_ALL);
150608ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_ipv6_with_snapshot_AI_ADDRCONFIG);
150708ca345cSEnji Cooper 	ATF_TP_ADD_TC(tp, getipnodebyname_getaddrinfo_ipv6);
150808ca345cSEnji Cooper 
150908ca345cSEnji Cooper 	return (atf_no_error());
151008ca345cSEnji Cooper }
1511