Module Name: src Committed By: christos Date: Thu Jan 9 02:18:10 UTC 2014
Modified Files: src/tests/lib/libc/net: Makefile h_dns_server.c h_hostent.c t_hostent.sh Added Files: src/tests/lib/libc/net: resolv.conf Log Message: Use our own resolv.conf file simplifying the test to not need rump_vfs. Add debugging on the dns server One test fails (gethostbyaddr6) why? It runs without rump To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/tests/lib/libc/net/Makefile cvs rdiff -u -r1.2 -r1.3 src/tests/lib/libc/net/h_dns_server.c cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libc/net/h_hostent.c cvs rdiff -u -r0 -r1.1 src/tests/lib/libc/net/resolv.conf cvs rdiff -u -r1.4 -r1.5 src/tests/lib/libc/net/t_hostent.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/net/Makefile diff -u src/tests/lib/libc/net/Makefile:1.9 src/tests/lib/libc/net/Makefile:1.10 --- src/tests/lib/libc/net/Makefile:1.9 Mon Jan 6 09:50:32 2014 +++ src/tests/lib/libc/net/Makefile Wed Jan 8 21:18:10 2014 @@ -1,11 +1,11 @@ -# $NetBSD: Makefile,v 1.9 2014/01/06 14:50:32 gson Exp $ +# $NetBSD: Makefile,v 1.10 2014/01/09 02:18:10 christos Exp $ .include <bsd.own.mk> MKMAN= no TESTS_SUBDIRS+= getaddrinfo -FILES+=hosts +FILES+=hosts resolv.conf TESTSDIR= ${TESTSBASE}/lib/libc/net Index: src/tests/lib/libc/net/h_dns_server.c diff -u src/tests/lib/libc/net/h_dns_server.c:1.2 src/tests/lib/libc/net/h_dns_server.c:1.3 --- src/tests/lib/libc/net/h_dns_server.c:1.2 Mon Jan 6 11:42:57 2014 +++ src/tests/lib/libc/net/h_dns_server.c Wed Jan 8 21:18:10 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: h_dns_server.c,v 1.2 2014/01/06 16:42:57 gson Exp $ */ +/* $NetBSD: h_dns_server.c,v 1.3 2014/01/09 02:18:10 christos Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: h_dns_server.c,v 1.2 2014/01/06 16:42:57 gson Exp $"); +__RCSID("$NetBSD: h_dns_server.c,v 1.3 2014/01/09 02:18:10 christos Exp $"); #include <ctype.h> #include <err.h> @@ -58,6 +58,12 @@ union sockaddr_either { struct sockaddr_in6 sin6; }; +#ifdef DEBUG +#define DPRINTF(...) fprintf(stderr, __VA_ARGS__) +#else +#define DPRINTF(...) +#endif + /* A DNS question and its corresponding answer */ struct dns_data { @@ -131,6 +137,34 @@ name_eq(const unsigned char *a, const un } } +#ifdef DEBUG +static char * +name2str(const void *v, char *buf, size_t buflen) { + const unsigned char *a = v; + char *b = buf; + char *eb = buf + buflen; + +#define ADDC(c) do { \ + if (b < eb) \ + *b++ = c; \ + else \ + return NULL; \ + } while (/*CONSTCOND*/0) + for (int did = 0;; did++) { + int lena = *a++; + if (lena == 0) { + ADDC('\0'); + return buf; + } + if (did) + ADDC('.'); + for (int i = 0; i < lena; i++) + ADDC(a[i]); + a += lena; + } +} +#endif + /* XXX the daemon2_* functions should be in a library */ int __daemon2_detach_pipe[2]; @@ -237,6 +271,9 @@ int main(int argc, char **argv) { char pidfile_name[40]; FILE *f; int one = 1; +#ifdef DEBUG + char buf1[1024], buf2[1024]; +#endif daemon2_fork(); @@ -276,7 +313,11 @@ int main(int argc, char **argv) { f = fopen(pidfile_name, "w"); fprintf(f, "%d", getpid()); fclose(f); +#ifdef DEBUG + daemon2_detach(0, 1); +#else daemon2_detach(0, 0); +#endif for (;;) { unsigned char buf[512]; @@ -289,28 +330,47 @@ int main(int argc, char **argv) { nrecv = recvfrom(s, buf, sizeof buf, 0, &from.s, &fromlen); if (nrecv < 0) err(1, "recvfrom"); - if (nrecv < 12) - continue; /* Too short */ - if ((buf[2] & 0x80) != 0) - continue; /* Not a query */ - if (!(buf[4] == 0 && buf[5] == 1)) - continue; /* QDCOUNT is not 1 */ + if (nrecv < 12) { + DPRINTF("Too short %zd\n", nrecv); + continue; + } + if ((buf[2] & 0x80) != 0) { + DPRINTF("Not a query 0x%x\n", buf[2]); + continue; + } + if (!(buf[4] == 0 && buf[5] == 1)) { + DPRINTF("QCOUNT is not 1 0x%x 0x%x\n", buf[4], buf[5]); + continue; /* QDCOUNT is not 1 */ + } for (dp = data; dp->qname_size != 0; dp++) { int qtype, qclass; p = buf + 12; /* Point to QNAME */ int n = name_eq(p, (const unsigned char *) dp->qname); - if (n == 0) + if (n == 0) { + DPRINTF("no match name %s != %s\n", + name2str(p, buf1, sizeof(buf1)), + name2str(dp->qname, buf2, sizeof(buf2))); continue; /* Name does not match */ + } + DPRINTF("match name %s\n", + name2str(p, buf1, sizeof(buf1))); p += n; /* Skip QNAME */ qtype = *p++ << 8; qtype |= *p++; - if (qtype != dp->qtype) + if (qtype != dp->qtype) { + DPRINTF("no match name 0x%x != 0x%x\n", + qtype, dp->qtype); continue; + } + DPRINTF("match type 0x%x\n", qtype); qclass = *p++ << 8; qclass |= *p++; - if (qclass != 1) /* IN */ + if (qclass != 1) { /* IN */ + DPRINTF("no match class %d != 1\n", qclass); continue; + } + DPRINTF("match class %d\n", qclass); goto found; } continue; @@ -332,6 +392,7 @@ int main(int argc, char **argv) { memcpy(p, dp->answer, dp->answer_size); p += dp->answer_size; nsent = sendto(s, buf, p - buf, 0, &from.s, fromlen); + DPRINTF("sent %zd\n", nsent); if (nsent != p - buf) warn("sendto"); } Index: src/tests/lib/libc/net/h_hostent.c diff -u src/tests/lib/libc/net/h_hostent.c:1.1 src/tests/lib/libc/net/h_hostent.c:1.2 --- src/tests/lib/libc/net/h_hostent.c:1.1 Fri Aug 16 11:29:45 2013 +++ src/tests/lib/libc/net/h_hostent.c Wed Jan 8 21:18:10 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: h_hostent.c,v 1.1 2013/08/16 15:29:45 christos Exp $ */ +/* $NetBSD: h_hostent.c,v 1.2 2014/01/09 02:18:10 christos Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: h_hostent.c,v 1.1 2013/08/16 15:29:45 christos Exp $"); +__RCSID("$NetBSD: h_hostent.c,v 1.2 2014/01/09 02:18:10 christos Exp $"); #include <stdio.h> #include <string.h> @@ -47,6 +47,8 @@ __RCSID("$NetBSD: h_hostent.c,v 1.1 2013 #include "hostent.h" +extern const char *__res_conf_name; + static void phostent(const struct hostent *h) { @@ -123,7 +125,7 @@ main(int argc, char *argv[]) info.buflen = sizeof(buf); info.he = &e; - while ((c = getopt(argc, argv, "46af:t:")) != -1) { + while ((c = getopt(argc, argv, "46af:r:t:")) != -1) { switch (c) { case '4': af = AF_INET; @@ -134,12 +136,15 @@ main(int argc, char *argv[]) case 'a': byaddr++; break; - case 't': - type = optarg; - break; case 'f': _hf_sethostsfile(optarg); break; + case 'r': + __res_conf_name = optarg; + break; + case 't': + type = optarg; + break; default: usage(); } Index: src/tests/lib/libc/net/t_hostent.sh diff -u src/tests/lib/libc/net/t_hostent.sh:1.4 src/tests/lib/libc/net/t_hostent.sh:1.5 --- src/tests/lib/libc/net/t_hostent.sh:1.4 Mon Jan 6 09:50:32 2014 +++ src/tests/lib/libc/net/t_hostent.sh Wed Jan 8 21:18:10 2014 @@ -1,4 +1,4 @@ -# $NetBSD: t_hostent.sh,v 1.4 2014/01/06 14:50:32 gson Exp $ +# $NetBSD: t_hostent.sh,v 1.5 2014/01/09 02:18:10 christos Exp $ # # Copyright (c) 2008 The NetBSD Foundation, Inc. # All rights reserved. @@ -13,7 +13,7 @@ # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS -# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# ``AS IS'' AND ANY EXP{res}S OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR @@ -41,6 +41,9 @@ l4="localhost" al4="127.0.0.1" loc4="name=$l4, length=4, addrtype=2, aliases=[localhost. localhost.localdomain.] addr_list=[$al4]\n" +dir="$(atf_get_srcdir)" +res="-r ${dir}/resolv.conf" + # Hijack DNS traffic using a single rump server instance and a DNS # server listening on its loopback address. Also hijack file system # call to /etc, mapping them to the root file system of the rump @@ -48,16 +51,15 @@ loc4="name=$l4, length=4, addrtype=2, al start_dns_server() { export RUMP_SERVER=unix:///tmp/rumpserver - rump_server -lrumpvfs -lrumpdev -lrumpnet \ + rump_server -lrumpdev -lrumpnet \ -lrumpnet_net -lrumpnet_netinet -lrumpnet_local \ $RUMP_SERVER - HIJACK_DNS="LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK='path=/etc,socket=inet:inet6'" - eval $HIJACK_DNS sh -c 'echo nameserver 127.0.0.1 >/etc/resolv.conf' - eval $HIJACK_DNS $(atf_get_srcdir)/h_dns_server 4 + HIJACK_DNS="LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK='socket=inet:inet6'" + eval $HIJACK_DNS ${dir}/h_dns_server $1 } stop_dns_server() { - kill $(cat dns_server_4.pid) + kill $(cat dns_server_$1.pid) rump.halt } @@ -68,9 +70,9 @@ gethostbyname4_head() } gethostbyname4_body() { - start_dns_server - atf_check -o inline:"$ans4" -x "$HIJACK_DNS $(atf_get_srcdir)/h_hostent -t auto -4 $n4" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans4" -x "$HIJACK_DNS ${dir}/h_hostent $res -t auto -4 $n4" + stop_dns_server 4 } atf_test_case gethostbyname6 @@ -80,9 +82,9 @@ gethostbyname6_head() } gethostbyname6_body() { - start_dns_server - atf_check -o inline:"$ans6" -x "$HIJACK_DNS $(atf_get_srcdir)/h_hostent -t auto -6 $n6" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans6" -x "$HIJACK_DNS ${dir}/h_hostent ${res} -t auto -6 $n6" + stop_dns_server 4 } atf_test_case gethostbyaddr4 @@ -92,9 +94,9 @@ gethostbyaddr4_head() } gethostbyaddr4_body() { - start_dns_server - atf_check -o inline:"$ans4" -x "$HIJACK_DNS $(atf_get_srcdir)/h_hostent -t auto -a $a4" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans4" -x "$HIJACK_DNS ${dir}/h_hostent ${res} -t auto -a $a4" + stop_dns_server 4 } atf_test_case gethostbyaddr6 @@ -104,9 +106,9 @@ gethostbyaddr6_head() } gethostbyaddr6_body() { - start_dns_server - atf_check -o inline:"$ans6" -x "$HIJACK_DNS $(atf_get_srcdir)/h_hostent -t auto -a $a6" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans6" -x "$HIJACK_DNS ${dir}/h_hostent -t auto -a $a6" + stop_dns_server 4 } atf_test_case hostsbynamelookup4 @@ -116,8 +118,7 @@ hostsbynamelookup4_head() } hostsbynamelookup4_body() { - local dir=$(atf_get_srcdir) - atf_check -o inline:"$loc4" -x "$dir/h_hostent -f $dir/hosts -t file -4 $l4" + atf_check -o inline:"$loc4" -x "${dir}/h_hostent -f ${dir}/hosts -t file -4 $l4" } atf_test_case hostsbynamelookup6 @@ -127,8 +128,7 @@ hostsbynamelookup6_head() } hostsbynamelookup6_body() { - local dir=$(atf_get_srcdir) - atf_check -o inline:"$loc6" -x "$dir/h_hostent -f $dir/hosts -t file -6 $l6" + atf_check -o inline:"$loc6" -x "${dir}/h_hostent -f ${dir}/hosts -t file -6 $l6" } atf_test_case hostsbyaddrlookup4 @@ -138,8 +138,7 @@ hostsbyaddrlookup4_head() } hostsbyaddrlookup4_body() { - local dir=$(atf_get_srcdir) - atf_check -o inline:"$loc4" -x "$dir/h_hostent -f $dir/hosts -t file -4 -a $al4" + atf_check -o inline:"$loc4" -x "${dir}/h_hostent -f ${dir}/hosts -t file -4 -a $al4" } atf_test_case hostsbyaddrlookup6 @@ -149,8 +148,7 @@ hostsbyaddrlookup6_head() } hostsbyaddrlookup6_body() { - local dir=$(atf_get_srcdir) - atf_check -o inline:"$loc6" -x "$dir/h_hostent -f $dir/hosts -t file -6 -a $al6" + atf_check -o inline:"$loc6" -x "${dir}/h_hostent -f ${dir}/hosts -t file -6 -a $al6" } atf_test_case dnsbynamelookup4 @@ -160,10 +158,9 @@ dnsbynamelookup4_head() } dnsbynamelookup4_body() { - local dir=$(atf_get_srcdir) - start_dns_server - atf_check -o inline:"$ans4" -x "$HIJACK_DNS $dir/h_hostent -t dns -4 $n4" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans4" -x "$HIJACK_DNS ${dir}/h_hostent ${res} -t dns -4 $n4" + stop_dns_server 4 } atf_test_case dnsbynamelookup6 @@ -173,10 +170,9 @@ dnsbynamelookup6_head() } dnsbynamelookup6_body() { - local dir=$(atf_get_srcdir) - start_dns_server - atf_check -o inline:"$ans6" -x "$HIJACK_DNS $dir/h_hostent -t dns -6 $n6" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans6" -x "$HIJACK_DNS ${dir}/h_hostent ${res} -t dns -6 $n6" + stop_dns_server 4 } atf_test_case dnsbyaddrlookup4 @@ -186,10 +182,9 @@ dnsbyaddrlookup4_head() } dnsbyaddrlookup4_body() { - local dir=$(atf_get_srcdir) - start_dns_server - atf_check -o inline:"$ans4" -x "$HIJACK_DNS $dir/h_hostent -t dns -4 -a $a4" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans4" -x "$HIJACK_DNS ${dir}/h_hostent ${res} -t dns -4 -a $a4" + stop_dns_server 4 } atf_test_case dnsbyaddrlookup6 @@ -199,10 +194,9 @@ dnsbyaddrlookup6_head() } dnsbyaddrlookup6_body() { - local dir=$(atf_get_srcdir) - start_dns_server - atf_check -o inline:"$ans6" -x "$HIJACK_DNS $dir/h_hostent -t dns -6 -a $a6" - stop_dns_server + start_dns_server 4 + atf_check -o inline:"$ans6" -x "$HIJACK_DNS ${dir}/h_hostent ${res} -t dns -6 -a $a6" + stop_dns_server 4 } atf_init_test_cases() Added files: Index: src/tests/lib/libc/net/resolv.conf diff -u /dev/null src/tests/lib/libc/net/resolv.conf:1.1 --- /dev/null Wed Jan 8 21:18:10 2014 +++ src/tests/lib/libc/net/resolv.conf Wed Jan 8 21:18:10 2014 @@ -0,0 +1 @@ +nameserver 127.0.0.1