dns changes
diff --git a/src/cmd/ndb/dn.c b/src/cmd/ndb/dn.c
index b24a5ff..d1bfcae 100755
--- a/src/cmd/ndb/dn.c
+++ b/src/cmd/ndb/dn.c
@@ -1183,8 +1183,8 @@
 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 7ba17c0..cc6aec3 100755
--- a/src/cmd/ndb/dnresolve.c
+++ b/src/cmd/ndb/dnresolve.c
@@ -278,17 +278,6 @@
 	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 @@
 /*
  *  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 @@
 	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 @@
 	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 90a1a19..901b7ac 100755
--- a/src/cmd/ndb/dns.c
+++ b/src/cmd/ndb/dns.c
@@ -96,7 +96,8 @@
 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,11 +106,22 @@
 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[])
 {
 	int serveudp, servetcp;
@@ -136,28 +148,33 @@
 		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 1d19db7..e08f1b5 100755
--- a/src/cmd/ndb/dns.h
+++ b/src/cmd/ndb/dns.h
@@ -402,8 +402,10 @@
 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 6e3a49f..82109c1 100755
--- a/src/cmd/ndb/dnsdebug.c
+++ b/src/cmd/ndb/dnsdebug.c
@@ -33,7 +33,8 @@
 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
 usage(void)
 {
-	fprint(2, "usage: dnsdebug -rxf [-p port] [query ...]\n");
+	fprint(2, "usage: dnsdebug [-fr] [query ...]\n");
 	threadexitsall("usage");
 }
 
@@ -63,16 +64,9 @@
 	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 ca52010..dc7ae06 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 e3f7eae..75beda8 100755
--- a/src/cmd/ndb/dnstcp.c
+++ b/src/cmd/ndb/dnstcp.c
@@ -25,7 +25,8 @@
 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 38e3ce7..59d0e04 100644
--- a/src/cmd/ndb/dntcpserver.c
+++ b/src/cmd/ndb/dntcpserver.c
@@ -269,12 +269,10 @@
 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 54d2970..9f84125 100755
--- a/src/cmd/ndb/dnudpserver.c
+++ b/src/cmd/ndb/dnudpserver.c
@@ -160,11 +160,9 @@
 {
 	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;
 }