From 49a1496cbbb871bc623cfd0925566628e246c9ba Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 20 Feb 2006 19:38:29 +0000 Subject: dns changes --- src/cmd/ndb/dn.c | 2 +- src/cmd/ndb/dnresolve.c | 35 +++++++++++++++++++---------------- src/cmd/ndb/dns.c | 39 ++++++++++++++++++++++++++++----------- src/cmd/ndb/dns.h | 6 ++++-- src/cmd/ndb/dnsdebug.c | 12 +++--------- src/cmd/ndb/dnsquery.c | 2 +- src/cmd/ndb/dnstcp.c | 3 ++- src/cmd/ndb/dntcpserver.c | 6 ++---- src/cmd/ndb/dnudpserver.c | 4 +--- 9 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/cmd/ndb/dn.c b/src/cmd/ndb/dn.c index b24a5ff4..d1bfcaed 100755 --- a/src/cmd/ndb/dn.c +++ b/src/cmd/ndb/dn.c @@ -1183,8 +1183,8 @@ warning(char *fmt, ...) void dncheck(void *p, int dolock) { - int i; DN *dp; + int i; RR *rp; if(p != nil){ diff --git a/src/cmd/ndb/dnresolve.c b/src/cmd/ndb/dnresolve.c index 7ba17c0c..cc6aec3d 100755 --- a/src/cmd/ndb/dnresolve.c +++ b/src/cmd/ndb/dnresolve.c @@ -278,17 +278,6 @@ mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno) return len; } -/* for alarms in readreply */ -static void -ding(void *x, char *msg) -{ - USED(x); - if(strcmp(msg, "alarm") == 0) - noted(NCONT); - else - noted(NDFLT); -} - static void freeanswers(DNSmsg *mp) { @@ -301,6 +290,7 @@ freeanswers(DNSmsg *mp) /* * read replies to a request. ignore any of the wrong type. wait at most 5 seconds. */ +static int udpreadtimeout(int, Udphdr*, void*, int, int); static int readreply(int fd, DN *dp, int type, ushort req, uchar *ibuf, DNSmsg *mp, ulong endtime, Request *reqp) @@ -310,17 +300,13 @@ readreply(int fd, DN *dp, int type, ushort req, ulong now; RR *rp; - notify(ding); - for(; ; freeanswers(mp)){ now = time(0); if(now >= endtime) return -1; /* timed out */ /* timed read */ - alarm((endtime - now) * 1000); - len = udpread(fd, (Udphdr*)ibuf, ibuf+Udphdrsize, Maxudpin); - alarm(0); + len = udpreadtimeout(fd, (Udphdr*)ibuf, ibuf+Udphdrsize, Maxudpin, (endtime-now)*1000); if(len < 0) return -1; /* timed out */ @@ -365,6 +351,23 @@ readreply(int fd, DN *dp, int type, ushort req, return 0; /* never reached */ } +static int +udpreadtimeout(int fd, Udphdr *h, void *data, int n, int ms) +{ + fd_set rd; + struct timeval tv; + + FD_ZERO(&rd); + FD_SET(fd, &rd); + + tv.tv_sec = ms/1000; + tv.tv_usec = (ms%1000)*1000; + + if(select(fd+1, &rd, 0, 0, &tv) != 1) + return -1; + return udpread(fd, h, data, n); +} + /* * return non-0 if first list includes second list */ diff --git a/src/cmd/ndb/dns.c b/src/cmd/ndb/dns.c index 90a1a193..901b7acb 100755 --- a/src/cmd/ndb/dns.c +++ b/src/cmd/ndb/dns.c @@ -96,7 +96,8 @@ Job* newjob(void); void freejob(Job*); void setext(char*, int, char*); -char *portname = "domain"; +char *tcpaddr = "tcp!*!dns"; +char *udpaddr = "udp!*!dns"; char *logfile = "dns"; char *dbfile; char mntpt[Maxpath]; @@ -105,10 +106,21 @@ char *LOG; void usage(void) { - fprint(2, "usage: dns [-dnrstT] [-a maxage] [-f ndb-file] [-p port] [-x service] [-z zoneprog]\n"); + fprint(2, "usage: dns [-dnrst] [-a maxage] [-f ndb-file] [-p port] [-T tcpaddr] [-U udpaddr] [-x service] [-z zoneprog]\n"); threadexitsall("usage"); } +void +checkaddress(void) +{ + char *u, *t; + + u = strchr(udpaddr, '!'); + t = strchr(tcpaddr, '!'); + if(u && t && strcmp(u, t) != 0) + fprint(2, "warning: announce mismatch %s %s\n", udpaddr, tcpaddr); +} + void threadmain(int argc, char *argv[]) { @@ -136,28 +148,33 @@ threadmain(int argc, char *argv[]) serveudp = 1; cachedb = 1; break; - case 'T': + case 't': servetcp = 1; cachedb = 1; break; case 'a': maxage = atoi(EARGF(usage())); break; - case 't': - testing = 1; - break; case 'z': zonerefreshprogram = EARGF(usage()); break; - case 'p': - portname = EARGF(usage()); - break; case 'n': sendnotifies = 1; break; + case 'U': + udpaddr = estrdup(netmkaddr(EARGF(usage()), "udp", "dns")); + break; + case 'T': + tcpaddr = estrdup(netmkaddr(EARGF(usage()), "tcp", "dns")); + break; + default: + usage(); }ARGEND - USED(argc); - USED(argv); + + if(argc) + usage(); + if(serveudp && servetcp) + checkaddress(); rfork(RFNOTEG); diff --git a/src/cmd/ndb/dns.h b/src/cmd/ndb/dns.h index 1d19db7e..e08f1b5e 100755 --- a/src/cmd/ndb/dns.h +++ b/src/cmd/ndb/dns.h @@ -402,8 +402,10 @@ extern ulong now; /* time base */ extern Area *owned; extern Area *delegated; -extern char *portname; +extern char *udpaddr; +extern char *tcpaddr; +#ifdef VARARGCK #pragma varargck type "R" RR* #pragma varargck type "Q" RR* - +#endif diff --git a/src/cmd/ndb/dnsdebug.c b/src/cmd/ndb/dnsdebug.c index 6e3a49f7..82109c18 100755 --- a/src/cmd/ndb/dnsdebug.c +++ b/src/cmd/ndb/dnsdebug.c @@ -33,7 +33,8 @@ char *logfile = "dns"; char *dbfile; char mntpt[Maxpath]; char *zonerefreshprogram; -char *portname = "domain"; +char *tcpaddr; +char *udpaddr; int prettyrrfmt(Fmt*); void preloadserveraddrs(void); @@ -45,7 +46,7 @@ void docmd(int, char**); void usage(void) { - fprint(2, "usage: dnsdebug -rxf [-p port] [query ...]\n"); + fprint(2, "usage: dnsdebug [-fr] [query ...]\n"); threadexitsall("usage"); } @@ -63,16 +64,9 @@ threadmain(int argc, char *argv[]) case 'r': resolver = 1; break; - case 'x': - dbfile = "/lib/ndb/external"; - strcpy(mntpt, "/net.alt"); - break; case 'f': dbfile = EARGF(usage()); break; - case 'p': - portname = EARGF(usage()); - break; default: usage(); }ARGEND diff --git a/src/cmd/ndb/dnsquery.c b/src/cmd/ndb/dnsquery.c index ca52010b..dc7ae06b 100755 --- a/src/cmd/ndb/dnsquery.c +++ b/src/cmd/ndb/dnsquery.c @@ -10,7 +10,7 @@ void usage(void) { - fprint(2, "usage: dnsquery [-x dns]\n"); + fprint(2, "usage: dnsquery [-x service]\n"); threadexitsall("usage"); } diff --git a/src/cmd/ndb/dnstcp.c b/src/cmd/ndb/dnstcp.c index e3f7eae5..75beda8b 100755 --- a/src/cmd/ndb/dnstcp.c +++ b/src/cmd/ndb/dnstcp.c @@ -25,7 +25,8 @@ int maxage; uchar ipaddr[IPaddrlen]; /* my ip address */ char *LOG; char *zonerefreshprogram; -char *portname = "domain"; +char *tcpaddr; +char *udpaddr; void usage(void) diff --git a/src/cmd/ndb/dntcpserver.c b/src/cmd/ndb/dntcpserver.c index 38e3ce7c..59d0e04b 100644 --- a/src/cmd/ndb/dntcpserver.c +++ b/src/cmd/ndb/dntcpserver.c @@ -269,12 +269,10 @@ static int tcpannounce(char *mntpt) { int fd; - char an[40]; USED(mntpt); - snprint(an, sizeof an, "tcp!*!%s", portname); - if((fd=announce(an, adir)) < 0) - warning("announce %s: %r", an); + if((fd=announce(tcpaddr, adir)) < 0) + warning("announce %s: %r", tcpaddr); return fd; } diff --git a/src/cmd/ndb/dnudpserver.c b/src/cmd/ndb/dnudpserver.c index 54d29705..9f84125c 100755 --- a/src/cmd/ndb/dnudpserver.c +++ b/src/cmd/ndb/dnudpserver.c @@ -160,11 +160,9 @@ udpannounce(char *mntpt) { int fd; char buf[40]; - USED(mntpt); - snprint(buf, sizeof buf, "udp!*!%s", portname); - if((fd=announce(buf, buf)) < 0) + if((fd=announce(udpaddr, buf)) < 0) warning("announce %s: %r", buf); return fd; } -- cgit v1.2.3