From owner-p4-projects@FreeBSD.ORG Tue Jul 4 17:40:44 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E44C416A4E0; Tue, 4 Jul 2006 17:40:43 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C01FB16A4DE for ; Tue, 4 Jul 2006 17:40:43 +0000 (UTC) (envelope-from bushman@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6D40D43D49 for ; Tue, 4 Jul 2006 17:40:43 +0000 (GMT) (envelope-from bushman@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k64HehnQ070500 for ; Tue, 4 Jul 2006 17:40:43 GMT (envelope-from bushman@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k64Hehrh070497 for perforce@freebsd.org; Tue, 4 Jul 2006 17:40:43 GMT (envelope-from bushman@freebsd.org) Date: Tue, 4 Jul 2006 17:40:43 GMT Message-Id: <200607041740.k64Hehrh070497@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bushman@freebsd.org using -f From: Michael Bushkov To: Perforce Change Reviews Cc: Subject: PERFORCE change 100566 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Jul 2006 17:40:44 -0000 http://perforce.freebsd.org/chv.cgi?CH=100566 Change 100566 by bushman@bushman_nss_ldap_cached on 2006/07/04 17:39:57 gethostby***() regression test finished - some issues with host aliases left, though. The test can be possibly extended by adding support for snapshot file for hostents received via gethostbyaddr(). Affected files ... .. //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/Makefile#5 edit .. //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.t#2 edit Differences ... ==== //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/Makefile#5 (text+ko) ==== ==== //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.c#2 (text+ko) ==== @@ -30,6 +30,8 @@ #include #include +#include +#include #include #include #include @@ -40,11 +42,14 @@ #include #include "testutil.h" +#ifndef min +#define min(a,b) (((a)<(b))?(a):(b)) +#endif + enum test_methods { TEST_GETHOSTBYNAME2, TEST_GETHOSTBYADDR, TEST_GETHOSTBYNAME2_GETADDRINFO, - TEST_GETHOSTBYADDR_GETNAMEINFO, TEST_BUILD_SNAPSHOT }; @@ -183,28 +188,34 @@ c1 = ht1->h_aliases; c2 = ht2->h_aliases; - if ((ht1->h_aliases == NULL) || (ht2->h_aliases == NULL)) + if (((ht1->h_aliases == NULL) || (ht2->h_aliases == NULL)) && + (ht1->h_aliases != ht2->h_aliases)) goto errfin; - for (;*c1 && *c2; ++c1, ++c2) - if (strcmp(*c1, *c2) != 0) - goto errfin; + if ((c1 != NULL) && (c2 != NULL)) { + for (;*c1 && *c2; ++c1, ++c2) + if (strcmp(*c1, *c2) != 0) + goto errfin; if ((*c1 != NULL) || (*c2 != NULL)) goto errfin; + } c1 = ht1->h_addr_list; c2 = ht2->h_addr_list; - if ((ht1->h_addr_list == NULL) || (ht2->h_addr_list== NULL)) + if (((ht1->h_addr_list == NULL) || (ht2->h_addr_list== NULL)) && + (ht1->h_addr_list != ht2->h_addr_list)) goto errfin; - for (;*c1 && *c2; ++c1, ++c2) - if (memcmp(*c1, *c2, ht1->h_length) != 0) + if ((c1 != NULL) && (c2 != NULL)) { + for (;*c1 && *c2; ++c1, ++c2) + if (memcmp(*c1, *c2, ht1->h_length) != 0) + goto errfin; + + if ((*c1 != NULL) || (*c2 != NULL)) goto errfin; - - if ((*c1 != NULL) || (*c2 != NULL)) - goto errfin; + } return 0; @@ -218,6 +229,64 @@ return (-1); } +static int +check_addrinfo_for_name(struct addrinfo *ai, char const *name) +{ + struct addrinfo *ai2; + + for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) { + if (strcmp(ai2->ai_canonname, name) == 0) + return (0); + } + + return (-1); +} + +static int +check_addrinfo_for_addr(struct addrinfo *ai, char const *addr, + socklen_t addrlen, int af) +{ + struct addrinfo *ai2; + +/* char buffer[100]; + memset(buffer, 0, sizeof(buffer)); + + char *res = inet_ntop(af, addr, buffer, + sizeof(buffer)); + if (res != NULL) + printf("===he %s %s\n", buffer, ai->ai_canonname); + +*/ + for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) { + if (af != ai2->ai_family) + continue; + +/* res = inet_ntop(ai2->ai_family, (void *)&((struct sockaddr_in *)ai2->ai_addr)->sin_addr, buffer, + sizeof(buffer)); + if (res != NULL) + printf("===ai %s\n", buffer);*/ + + switch (af) { + case AF_INET: + if (memcmp(addr, + (void *)&((struct sockaddr_in *)ai2->ai_addr)->sin_addr, + min(addrlen, ai2->ai_addrlen)) == 0) + return (0); + break; + case AF_INET6: + if (memcmp(addr, + (void *)&((struct sockaddr_in6 *)ai2->ai_addr)->sin6_addr, + min(addrlen, ai2->ai_addrlen)) == 0) + return (0); + break; + default: + break; + } + } + + return (-1); +} + static int is_hostent_equal(struct hostent *he, struct addrinfo *ai) { @@ -225,10 +294,42 @@ char **cp; int rv; + if (debug) + printf("checking equality of he and ai\n"); + + rv = check_addrinfo_for_name(ai, he->h_name); + if (rv != 0) { + if (debug) + printf("not equal - he->h_name couldn't be found\n"); + + return (rv); + } + + /* getaddrinfo doesn't provide the aliases information */ /* for (cp = he->h_aliases; *cp; ++cp) { - for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) - if (strcmp( + rv = check_addrinfo_for_name(ai, *cp); + if (rv != 0) { + if (debug) + printf("not equal - one of he->h_aliases couldn't be found\n"); + + return (rv); + } }*/ + + for (cp = he->h_addr_list; *cp; ++cp) { + rv = check_addrinfo_for_addr(ai, *cp, he->h_length, + he->h_addrtype); + if (rv != 0) { + if (debug) + printf("not equal - one of he->h_addr_list couldn't be found\n"); + + return (rv); + } + } + + if (debug) + printf("equal\n"); + return (0); } @@ -323,7 +424,7 @@ if (result != NULL) { if (debug) printf("found\n"); - + rv = hostent_test_correctness(result, NULL); if (rv != 0) return (rv); @@ -553,6 +654,12 @@ result = gethostbyaddr(cp, he->h_length, he->h_addrtype); + if (result == NULL) { + if (debug) + printf("warning: reverse lookup failed\n"); + + continue; + } rv = hostent_test_correctness(result, NULL); if (rv != 0) return (rv); @@ -573,7 +680,8 @@ ai = NULL; memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_flags = af_type; + hints.ai_family = af_type; + hints.ai_flags = AI_CANONNAME; if (debug) printf("using getaddrinfo() to resolve %s\n", he->h_name); @@ -595,15 +703,152 @@ return (-1); } -// rv = + rv = is_hostent_equal(he, ai); + if (rv != 0) { + if (debug) + printf("not ok - addrinfo and hostent are not equal\n"); + return (-1); + } + } return (0); } +static void +usage(void) +{ + (void)fprintf(stderr, + "Usage: %s [-dna2] [-s ] -f \n", + getprogname()); + exit(1); +} + int main(int argc, char **argv) { + struct hostent_test_data td, td_snap; + char *snapshot_file, *hostlist_file; + int rv; + int c; + + if (argc < 2) + usage(); + + snapshot_file = NULL; + hostlist_file = NULL; + while ((c = getopt(argc, argv, "na2ds:f:")) != -1) + switch (c) { + case 'd': + debug++; + break; + case 'n': + method = TEST_GETHOSTBYNAME2; + break; + case 'a': + method = TEST_GETHOSTBYADDR; + break; + case '2': + method = TEST_GETHOSTBYNAME2_GETADDRINFO; + break; + case 's': + snapshot_file = strdup(optarg); + break; + case 'f': + hostlist_file = strdup(optarg); + break; + default: + usage(); + } + + TEST_DATA_INIT(hostent, &td, clone_hostent, free_hostent); + TEST_DATA_INIT(hostent, &td_snap, clone_hostent, free_hostent); + + if (hostlist_file == NULL) + usage(); + + if (access(hostlist_file, R_OK) != 0) { + if (debug) + printf("can't access the hostlist file %s\n", + hostlist_file); + + usage(); + } + + if (debug) + printf("building host lists from %s\n", hostlist_file); + rv = TEST_SNAPSHOT_FILE_READ(hostent, hostlist_file, &td, + hostent_read_hostlist_func); + if (rv != 0) + goto fin; + + if (snapshot_file != NULL) { + if (access(snapshot_file, W_OK | R_OK) != 0) { + if (errno == ENOENT) + method = TEST_BUILD_SNAPSHOT; + else { + if (debug) + printf("can't access the snapshot file %s\n", + snapshot_file); + + rv = -1; + goto fin; + } + } else { + if (method == TEST_BUILD_SNAPSHOT) { + rv = 0; + goto fin; + } + + TEST_SNAPSHOT_FILE_READ(hostent, snapshot_file, + &td_snap, hostent_read_snapshot_func); + } + } + + switch (method) { + case TEST_GETHOSTBYNAME2: + if (snapshot_file != NULL) + rv = DO_2PASS_TEST(hostent, &td, &td_snap, + compare_hostent, NULL); + break; + case TEST_GETHOSTBYADDR: + if (snapshot_file == NULL) + rv = DO_1PASS_TEST(hostent, &td, + hostent_test_gethostbyaddr, (void *)&td); + else + rv = DO_1PASS_TEST(hostent, &td_snap, + hostent_test_gethostbyaddr, (void *)&td_snap); + break; + case TEST_GETHOSTBYNAME2_GETADDRINFO: + if (snapshot_file == NULL) + rv = DO_1PASS_TEST(hostent, &td, + hostent_test_getaddrinfo_eq, (void *)&td); + else + rv = DO_1PASS_TEST(hostent, &td_snap, + hostent_test_getaddrinfo_eq, (void *)&td); + break; + case TEST_BUILD_SNAPSHOT: + if (snapshot_file != NULL) + rv = TEST_SNAPSHOT_FILE_WRITE(hostent, snapshot_file, &td, + sdump_hostent); + break; + default: + rv = 0; + break; + }; + +fin: + TEST_DATA_DESTROY(hostent, &td_snap); + TEST_DATA_DESTROY(hostent, &td); + free(hostlist_file); + free(snapshot_file); + return (rv); +} + + +/*int +main(int argc, char **argv) +{ struct hostent_test_data td; debug = 1; @@ -611,7 +856,7 @@ hostent_fill_gethostbyname2_data("../resolv/mach", &td); TEST_DATA_DESTROY(hostent, &td); return (0); -} +}*/ /*int main(int argc, char **argv) ==== //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.t#2 (text+ko) ==== @@ -1,0 +1,29 @@ +#!/bin/sh +# $FreeBSD$ + +do_test() { + number=$1 + comment=$2 + opt=$3 + if ./$executable $opt; then + echo "ok $number - $comment" + else + echo "not ok $number - $comment" + fi +} + +cd `dirname $0` + +executable=`basename $0 .t` + +make $executable 2>&1 > /dev/null + +echo 1..8 +do_test 1 'gethostbyname2()' '-n -f ../resolv/mach' +do_test 2 'gethostbyaddr()' '-a -f ../resolv/mach' +do_test 3 'gethostbyname()-getaddrinfo()' '-2 -f ../resolv/mach' +do_test 5 'building snapshot, if needed' '-s snapshot_ht -f ../resolv/mach' +do_test 6 'gethostbyname2() snapshot' '-n -s snapshot_serv -f ../resolv/mach' +do_test 7 'gethostbyaddr() snapshot' '-a -s snapshot_serv -f ../resolv/mach' +do_test 8 'gethostbyname2()-getaddrinfo snapshot'\ + '-2 -s snapshot_serv -f ../resolv/mach'