diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2023-01-04 19:25:05 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2023-01-04 19:25:05 +0000 |
commit | 2402025982aa44c91e452fd792abdfc880461944 (patch) | |
tree | 02e41a037ef3ba6f07d8d82e6308ee794854e371 /sys/src | |
parent | 358551de19c9ff5bab9cd9c98769224f63fb7e94 (diff) |
ndb/dns: allow specifying local ip addresses for serving dns
Allow specifying the local IP addresses that
the UDP dns server will listen on when the
-s flag is given.
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/cmd/ndb/dn.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/ndb/dnnotify.c | 12 | ||||
-rw-r--r-- | sys/src/cmd/ndb/dnresolve.c | 28 | ||||
-rw-r--r-- | sys/src/cmd/ndb/dns.c | 21 | ||||
-rw-r--r-- | sys/src/cmd/ndb/dns.h | 5 | ||||
-rw-r--r-- | sys/src/cmd/ndb/dnudpserver.c | 66 |
6 files changed, 68 insertions, 65 deletions
diff --git a/sys/src/cmd/ndb/dn.c b/sys/src/cmd/ndb/dn.c index 2fbbb50c6..6bc47b04a 100644 --- a/sys/src/cmd/ndb/dn.c +++ b/sys/src/cmd/ndb/dn.c @@ -144,7 +144,6 @@ static void ding(void*, char *msg) { if(strstr(msg, "alarm") != nil) { - stats.alarms++; noted(NCONT); /* resume with system call error */ } else noted(NDFLT); /* die */ diff --git a/sys/src/cmd/ndb/dnnotify.c b/sys/src/cmd/ndb/dnnotify.c index c52ea469f..cd3e2e71e 100644 --- a/sys/src/cmd/ndb/dnnotify.c +++ b/sys/src/cmd/ndb/dnnotify.c @@ -73,7 +73,7 @@ getips(char *name, uchar *ips, int maxips, Request *req) /* notify a slave that an area has changed. */ static void -send_notify(char *slave, RR *soa, Request *req) +send_notify(char *mntpt, char *slave, RR *soa, Request *req) { int i, j, len, n, reqno, fd, nips, send; uchar ips[8*IPaddrlen], ibuf[Maxudp+Udphdrsize], obuf[Maxudp+Udphdrsize]; @@ -91,7 +91,7 @@ send_notify(char *slave, RR *soa, Request *req) reqno = rand(); n = mkreq(soa->owner, Cin, obuf, Fauth | Onotify, reqno); - fd = udpport(nil); + fd = udpport(mntpt); if(fd < 0) return; @@ -130,7 +130,7 @@ send_notify(char *slave, RR *soa, Request *req) /* send notifies for any updated areas */ static void -notify_areas(Area *a, Request *req) +notify_areas(char *mntpt, Area *a, Request *req) { Server *s; @@ -140,7 +140,7 @@ notify_areas(Area *a, Request *req) /* send notifies to all slaves */ for(s = a->soarr->soa->slaves; s != nil; s = s->next) - send_notify(s->name, a->soarr, req); + send_notify(mntpt, s->name, a->soarr, req); a->neednotify = 0; } } @@ -150,7 +150,7 @@ notify_areas(Area *a, Request *req) * (also reads in new databases) */ void -notifyproc(void) +notifyproc(char *mntpt) { Request req; @@ -169,7 +169,7 @@ notifyproc(void) for(;;){ getactivity(&req, 0); - notify_areas(owned, &req); + notify_areas(mntpt, owned, &req); putactivity(0); sleep(60*1000); } diff --git a/sys/src/cmd/ndb/dnresolve.c b/sys/src/cmd/ndb/dnresolve.c index 335c2a47c..513967301 100644 --- a/sys/src/cmd/ndb/dnresolve.c +++ b/sys/src/cmd/ndb/dnresolve.c @@ -473,38 +473,40 @@ walkup(char *name) } /* - * Get a udp port for sending requests and reading replies. Put the port - * into "headers" mode. + * Get a udp port for sending requests and reading replies. + * Put the port into "headers" mode. */ -static char *hmsg = "headers"; - int -udpport(char *mtpt) +udpport(char *mntpt) { - int fd, ctl; + static char hmsg[] = "headers"; + static char imsg[] = "ignoreadvice"; + char ds[64], adir[64]; + int fd, ctl; /* get a udp port */ - snprint(ds, sizeof ds, "%s/udp!*!0", (mtpt && *mtpt) ? mtpt : "/net"); + snprint(ds, sizeof ds, "%s/udp!*!0", mntpt); ctl = announce(ds, adir); - if(ctl < 0){ - /* warning("can't get udp port"); */ + if(ctl < 0) return -1; - } /* turn on header style interface */ - if(write(ctl, hmsg, strlen(hmsg)) != strlen(hmsg)){ + if(write(ctl, hmsg, sizeof(hmsg)-1) < 0){ + warning("can't enable %s on %s: %r", hmsg, adir); close(ctl); - warning(hmsg); return -1; } + /* ignore ICMP advice */ + write(ctl, imsg, sizeof(imsg)-1); + /* grab the data file */ snprint(ds, sizeof ds, "%s/data", adir); fd = open(ds, ORDWR); - close(ctl); if(fd < 0) warning("can't open udp port %s: %r", ds); + close(ctl); return fd; } diff --git a/sys/src/cmd/ndb/dns.c b/sys/src/cmd/ndb/dns.c index e93a70284..3a8028337 100644 --- a/sys/src/cmd/ndb/dns.c +++ b/sys/src/cmd/ndb/dns.c @@ -103,8 +103,8 @@ static char *respond(Job*, Mfile*, RR*, char*, int, int); void usage(void) { - fprint(2, "usage: %s [-FnorRs] [-a maxage] [-f ndb-file] [-N target] " - "[-T forwip] [-x netmtpt] [-z refreshprog]\n", argv0); + fprint(2, "usage: %s [-FnorR] [-a maxage] [-f ndb-file] [-N target] " + "[-T forwip] [-x netmtpt] [-z refreshprog] [-s [addrs...]]\n", argv0); exits("usage"); } @@ -167,12 +167,13 @@ main(int argc, char *argv[]) usage(); break; }ARGEND - if(argc != 0) + + if(argc != 0 && !cfg.serve) usage(); rfork(RFREND|RFNOTEG); - cfg.inside = (*mntpt == '\0' || strcmp(mntpt, "/net") == 0); + cfg.inside = strcmp(mntpt, "/net") == 0; /* start syslog before we fork */ fmtinstall('F', fcallfmt); @@ -203,10 +204,16 @@ main(int argc, char *argv[]) if (cfg.straddle && !seerootns()) dnslog("straddle server misconfigured; can't see root name servers"); - if(cfg.serve) - dnudpserver(mntpt); + if(cfg.serve){ + if(argc == 0) + dnudpserver(mntpt, "*"); + else { + while(argc-- > 0) + dnudpserver(mntpt, *argv++); + } + } if(sendnotifies) - notifyproc(); + notifyproc(mntpt); io(); _exits(0); diff --git a/sys/src/cmd/ndb/dns.h b/sys/src/cmd/ndb/dns.h index 3944c604e..7306cd1fc 100644 --- a/sys/src/cmd/ndb/dns.h +++ b/sys/src/cmd/ndb/dns.h @@ -392,7 +392,6 @@ typedef struct { ulong qrecvdudp; ulong qsent; ulong qrecvd9prpc; /* packet count */ - ulong alarms; /* reply times by count */ ulong under10ths[3*10+2]; /* under n*0.1 seconds, n is index */ ulong tmout; @@ -527,11 +526,11 @@ void initdnsmsg(DNSmsg *mp, RR *rp, int flags, ushort reqno); /* dnserver.c */ void dnserver(DNSmsg*, DNSmsg*, Request*, uchar *, int); -void dnudpserver(char*); +void dnudpserver(char*, char*); /* dnnotify.c */ void dnnotify(DNSmsg*, DNSmsg*, Request*); -void notifyproc(void); +void notifyproc(char*); /* convDNS2M.c */ int convDNS2M(DNSmsg*, uchar*, int); diff --git a/sys/src/cmd/ndb/dnudpserver.c b/sys/src/cmd/ndb/dnudpserver.c index 5a4b4eee8..1f4776995 100644 --- a/sys/src/cmd/ndb/dnudpserver.c +++ b/sys/src/cmd/ndb/dnudpserver.c @@ -7,7 +7,7 @@ enum { Logqueries = 0, }; -static int udpannounce(char*); +static int udpannounce(char*, char*); static void reply(int, uchar*, DNSmsg*, Request*); typedef struct Inprogress Inprogress; @@ -31,8 +31,6 @@ struct Forwtarg { Forwtarg forwtarg[10]; int forwtcount; -static char *hmsg = "headers"; - /* * record client id and ignore retransmissions. * we're still single thread at this point. @@ -129,9 +127,9 @@ redistrib(uchar *buf, int len) * a process to act as a dns server for outside reqeusts */ void -dnudpserver(char *mntpt) +dnudpserver(char *mntpt, char *addr) { - volatile int fd, len, op, rcode; + volatile int fd, len, op, rcode, served; char *volatile err; volatile char tname[32]; volatile uchar buf[Udphdrsize + Maxudp + 1024]; @@ -153,15 +151,16 @@ dnudpserver(char *mntpt) return; } - fd = -1; + served = 0; restart: - procsetname("udp server announcing"); - if(fd >= 0) - close(fd); - while((fd = udpannounce(mntpt)) < 0) - sleep(5000); + procsetname("%s: udp server announcing %s", mntpt, addr); + if((fd = udpannounce(mntpt, addr)) < 0){ + warning("can't announce %s on %s: %r", addr, mntpt); + do { + sleep(5000); + } while((fd = udpannounce(mntpt, addr)) < 0); + } -// procsetname("udp server"); memset(&req, 0, sizeof req); if(setjmp(req.mret)) putactivity(0); @@ -171,16 +170,17 @@ restart: /* loop on requests */ for(;; putactivity(0)){ - procsetname("served %lud udp; %lud alarms", - stats.qrecvdudp, stats.alarms); + procsetname("%s: udp server %s: served %d", mntpt, addr, served); memset(&repmsg, 0, sizeof repmsg); memset(&reqmsg, 0, sizeof reqmsg); alarm(60*1000); len = read(fd, buf, sizeof buf); alarm(0); - if(len <= Udphdrsize) + if(len <= Udphdrsize){ + close(fd); goto restart; + } if(forwtcount > 0) redistrib(buf, len); @@ -194,6 +194,8 @@ restart: req.aborttime = timems() + Maxreqtm; req.from = smprint("%I", buf); rcode = 0; + + served++; stats.qrecvdudp++; err = convM2DNS(&buf[Udphdrsize], len, &reqmsg, &rcode); @@ -279,39 +281,33 @@ freereq: * announce on well-known dns udp port and set message style interface */ static int -udpannounce(char *mntpt) +udpannounce(char *mntpt, char *addr) { - int data, ctl; + static char hmsg[] = "headers"; + static char imsg[] = "ignoreadvice"; + char dir[64], datafile[64+6]; - static int whined; + int data, ctl; - /* get a udp port */ - sprint(datafile, "%s/udp!*!dns", mntpt); + snprint(datafile, sizeof(datafile), "%s/udp!%s!dns", mntpt, addr); ctl = announce(datafile, dir); - if(ctl < 0){ - if(!whined++) - warning("can't announce on %s", datafile); + if(ctl < 0) return -1; - } /* turn on header style interface */ - if(write(ctl, hmsg, strlen(hmsg)) != strlen(hmsg)){ + if(write(ctl, hmsg, sizeof(hmsg)-1) < 0){ + warning("can't enable %s on %s: %r", hmsg, datafile); close(ctl); - if(!whined++) - warning("can't enable headers on %s", datafile); return -1; } + /* ignore ICMP advice */ + write(ctl, imsg, sizeof(imsg)-1); + snprint(datafile, sizeof(datafile), "%s/data", dir); data = open(datafile, ORDWR); - if(data < 0){ - close(ctl); - if(!whined++) - warning("can't open %s to announce on dns udp port", - datafile); - return -1; - } - + if(data < 0) + warning("can't open udp port %s: %r", datafile); close(ctl); return data; } |