]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ndb/dns.c
ndb/dns: double Maxretries for long cname redirection chains
[plan9front.git] / sys / src / cmd / ndb / dns.c
index e21c3ab88733088d6e06ec0c0aa7c3b3edcf1bd2..0f748d48cb7d87d0fd844475e7355b842f56c994 100644 (file)
@@ -3,9 +3,7 @@
 #include <auth.h>
 #include <fcall.h>
 #include <bio.h>
-#include <ctype.h>
 #include <ip.h>
-#include <pool.h>
 #include "dns.h"
 
 enum
@@ -27,8 +25,6 @@ typedef struct Network        Network;
 
 int vers;              /* incremented each clone/attach */
 
-static volatile int stop;
-
 /* holds data to be returned via read of /net/dns, perhaps multiple reads */
 struct Mfile
 {
@@ -70,13 +66,13 @@ int needrefresh;
 ulong  now;
 vlong  nowns;
 int    sendnotifies;
-int    testing;
 char   *trace;
 int    traceactivity;
 char   *zonerefreshprogram;
 
 char   *logfile = "dns";       /* or "dns.test" */
 char   *dbfile;
+char   *dnsuser;
 char   mntpt[Maxpath];
 
 int    addforwtarg(char *);
@@ -107,7 +103,7 @@ static char *respond(Job*, Mfile*, RR*, char*, int, int);
 void
 usage(void)
 {
-       fprint(2, "usage: %s [-FnorRst] [-a maxage] [-f ndb-file] [-N target] "
+       fprint(2, "usage: %s [-FnorRs] [-a maxage] [-f ndb-file] [-N target] "
                "[-T forwip] [-x netmtpt] [-z refreshprog]\n", argv0);
        exits("usage");
 }
@@ -115,7 +111,6 @@ usage(void)
 void
 main(int argc, char *argv[])
 {
-       int kid, pid;
        char servefile[Maxpath], ext[Maxpath];
        Dir *dir;
 
@@ -158,9 +153,6 @@ main(int argc, char *argv[])
                cfg.serve = 1;          /* serve network */
                cfg.cachedb = 1;
                break;
-       case 't':
-               testing = 1;
-               break;
        case 'T':
                addforwtarg(EARGF(usage()));
                break;
@@ -178,9 +170,6 @@ main(int argc, char *argv[])
        if(argc != 0)
                usage();
 
-       if(testing)
-               mainmem->flags |= POOL_NOREUSE | POOL_ANTAGONISM;
-       mainmem->flags |= POOL_ANTAGONISM;
        rfork(RFREND|RFNOTEG);
 
        cfg.inside = (*mntpt == '\0' || strcmp(mntpt, "/net") == 0);
@@ -198,6 +187,7 @@ main(int argc, char *argv[])
        opendatabase();
        now = time(nil);                /* open time files before we fork */
        nowns = nsec();
+       dnsuser = estrdup(getuser());
 
        snprint(servefile, sizeof servefile, "#s/dns%s", ext);
        dir = dirstat(servefile);
@@ -205,43 +195,21 @@ main(int argc, char *argv[])
                sysfatal("%s exists; another dns instance is running",
                        servefile);
        free(dir);
-//     unmount(servefile, mntpt);
-//     remove(servefile);
-
        mountinit(servefile, mntpt);    /* forks, parent exits */
 
        srand(now*getpid());
        db2cache(1);
-//     dnageallnever();
 
        if (cfg.straddle && !seerootns())
                dnslog("straddle server misconfigured; can't see root name servers");
-       /*
-        * fork without sharing heap.
-        * parent waits around for child to die, then forks & restarts.
-        * child may spawn udp server, notify procs, etc.; when it gets too
-        * big, it kills itself and any children.
-        * /srv/dns and /net/dns remain open and valid.
-        */
-       for (;;) {
-               kid = rfork(RFPROC|RFFDG|RFNOTEG);
-               switch (kid) {
-               case -1:
-                       sysfatal("fork failed: %r");
-               case 0:
-                       if(cfg.serve)
-                               dnudpserver(mntpt);
-                       if(sendnotifies)
-                               notifyproc();
-                       io();
-                       _exits("restart");
-               default:
-                       while ((pid = waitpid()) != kid && pid != -1)
-                               continue;
-                       break;
-               }
-               dnslog("dns restarting");
-       }
+
+       if(cfg.serve)
+               dnudpserver(mntpt);
+       if(sendnotifies)
+               notifyproc();
+
+       io();
+       _exits(0);
 }
 
 /*
@@ -286,9 +254,9 @@ mountinit(char *service, char *mntpt)
 
        /* copy namespace to avoid a deadlock */
        switch(rfork(RFFDG|RFPROC|RFNAMEG)){
-       case 0:                 /* child: hang around and (re)start main proc */
+       case 0:                 /* child: start main proc */
                close(p[1]);
-               procsetname("%s restarter", mntpt);
+               procsetname("%s", mntpt);
                break;
        case -1:
                sysfatal("fork failed: %r");
@@ -320,7 +288,10 @@ newfid(int fid, int needunused)
                }
        mf = emalloc(sizeof(*mf));
        mf->fid = fid;
-       mf->user = estrdup("dummy");
+       mf->qid.vers = vers;
+       mf->qid.type = QTDIR;
+       mf->qid.path = 0LL;
+       mf->user = estrdup("none");
        mf->next = mfalloc.inuse;
        mfalloc.inuse = mf;
        unlock(&mfalloc);
@@ -355,7 +326,7 @@ copyfid(Mfile *mf, int fid)
        if(nmf == nil)
                return nil;
        nmf->fid = fid;
-       free(nmf->user);                        /* estrdup("dummy") */
+       free(nmf->user);                        /* estrdup("none") */
        nmf->user = estrdup(mf->user);
        nmf->qid.type = mf->qid.type;
        nmf->qid.path = mf->qid.path;
@@ -425,22 +396,19 @@ io(void)
        if(setjmp(req.mret))
                putactivity(0);
        req.isslave = 0;
-       stop = 0;
-       while(!stop){
-               procsetname("%d %s/dns Twrites of %d 9p rpcs read; %d alarms",
-                       stats.qrecvd9p, mntpt, stats.qrecvd9prpc, stats.alarms);
-               n = read9pmsg(mfd[0], mdata, sizeof mdata);
-               if(n<=0){
+       while((n = read9pmsg(mfd[0], mdata, sizeof mdata)) != 0){
+               if(n < 0){
                        dnslog("error reading 9P from %s: %r", mntpt);
-                       sleep(2000);    /* don't thrash after read error */
-                       return;
+                       break;
                }
 
                stats.qrecvd9prpc++;
                job = newjob();
                if(convM2S(mdata, n, &job->request) != n){
+                       dnslog("format error %ux %ux %ux %ux %ux",
+                               mdata[0], mdata[1], mdata[2], mdata[3], mdata[4]);
                        freejob(job);
-                       continue;
+                       break;
                }
                mf = newfid(job->request.fid, 0);
                if(debug)
@@ -508,9 +476,6 @@ io(void)
 
                putactivity(0);
        }
-       /* kill any udp server, notifier, etc. processes */
-       postnote(PNGROUP, getpid(), "die");
-       sleep(1000);
 }
 
 void
@@ -718,28 +683,21 @@ rwrite(Job *job, Mfile *mf, Request *req)
        if(cnt > 0 && job->request.data[cnt-1] == '\n')
                job->request.data[cnt-1] = 0;
 
+       if(strcmp(mf->user, "none") == 0 || strcmp(mf->user, dnsuser) != 0)
+               goto query;     /* skip special commands if not owner */
+
        /*
         *  special commands
         */
-//     dnslog("rwrite got: %s", job->request.data);
+       if(debug)
+               dnslog("rwrite got: %s", job->request.data);
        send = 1;
-       if(strcmp(job->request.data, "age")==0){
-               dnslog("dump, age & dump forced");
-               dndump("/lib/ndb/dnsdump1");
-               dnforceage();
-               dndump("/lib/ndb/dnsdump2");
-       } else if(strcmp(job->request.data, "debug")==0)
+       if(strcmp(job->request.data, "debug")==0)
                debug ^= 1;
-       else if(strcmp(job->request.data, "testing")==0)
-               testing ^= 1;
        else if(strcmp(job->request.data, "dump")==0)
                dndump("/lib/ndb/dnsdump");
-       else if(strcmp(job->request.data, "poolcheck")==0)
-               poolcheck(mainmem);
        else if(strcmp(job->request.data, "refresh")==0)
                needrefresh = 1;
-       else if(strcmp(job->request.data, "restart")==0)
-               stop = 1;
        else if(strcmp(job->request.data, "stats")==0)
                dnstats("/lib/ndb/dnsstats");
        else if(strncmp(job->request.data, "target ", 7)==0){
@@ -750,6 +708,7 @@ rwrite(Job *job, Mfile *mf, Request *req)
        if (send)
                goto send;
 
+query:
        /*
         *  kill previous reply
         */
@@ -806,7 +765,6 @@ rwrite(Job *job, Mfile *mf, Request *req)
 
        err = lookupquery(job, mf, req, errbuf, p, wantsav, rooted);
 send:
-       dncheck(0, 1);
        job->reply.count = cnt;
        sendmsg(job, err);
 }
@@ -828,18 +786,14 @@ lookupquery(Job *job, Mfile *mf, Request *req, char *errbuf, char *p,
        int status;
        RR *rp, *neg;
 
-       dncheck(0, 1);
        status = Rok;
        rp = dnresolve(p, Cin, mf->type, req, 0, 0, Recurse, rooted, &status);
 
-       dncheck(0, 1);
-       lock(&dnlock);
        neg = rrremneg(&rp);
        if(neg){
                status = neg->negrcode;
                rrfreelist(neg);
        }
-       unlock(&dnlock);
 
        return respond(job, mf, rp, errbuf, status, wantsav);
 }
@@ -880,9 +834,7 @@ respond(Job *job, Mfile *mf, RR *rp, char *errbuf, int status, int wantsav)
        }
        unlock(&joblock);
 
-       lock(&dnlock);
        rrfreelist(rp);
-       unlock(&dnlock);
 
        return nil;
 }