]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ndb/dblookup.c
ndb/dns: do recursive lookup for dnsslave=
[plan9front.git] / sys / src / cmd / ndb / dblookup.c
index 14537f251ae409999cc95fa18c89e4382147b1fa..ec3f94d1cb980073fb2db6cba8c170c89ac8b9ac 100644 (file)
@@ -20,8 +20,11 @@ enum {
        Ptrttl = 2*Min,
 };
 
-static Ndb *db;
-static Lock    dblock;
+static Ndb     *db;
+static QLock   dblock;
+
+static Ipifc   *ipifcs;
+static QLock   ipifclock;
 
 static RR*     addrrr(Ndbtuple*, Ndbtuple*);
 static RR*     cnamerr(Ndbtuple*, Ndbtuple*);
@@ -67,7 +70,7 @@ opendatabase(void)
        char netdbnm[256];
        Ndb *xdb, *netdb;
 
-       if (db)
+       if(db != nil)
                return 0;
 
        xdb = ndbopen(dbfile);          /* /lib/ndb */
@@ -84,7 +87,7 @@ opendatabase(void)
                netdb->nohash = 1;
 
        db = ndbcat(netdb, xdb);        /* both */
-       return db? 0: -1;
+       return db!=nil ? 0: -1;
 }
 
 /*
@@ -122,7 +125,7 @@ dblookup(char *name, int class, int type, int auth, int ttl)
                return rp;
        }
 
-       lock(&dblock);
+       qlock(&dblock);
        dp = idnlookup(name, class, 1);
 
        if(opendatabase() < 0)
@@ -166,7 +169,7 @@ out:
                dp->respcode = err;
        }
 
-       unlock(&dblock);
+       qunlock(&dblock);
        return rp;
 }
 
@@ -254,11 +257,12 @@ dblookup1(char *name, int type, int auth, int ttl)
        /*
         *  find a matching entry in the database
         */
+       t = nil;
        nstrcpy(dname, name, sizeof dname);
        for(x=0; x<4; x++){
                switch(x){
                case 1: /* try unicode */
-                       if(idn2utf(name, dname, sizeof dname) == nil){
+                       if(idn2utf(name, dname, sizeof dname) < 0){
                                nstrcpy(dname, name, sizeof dname);
                                continue;
                        }
@@ -266,7 +270,7 @@ dblookup1(char *name, int type, int auth, int ttl)
                                continue;
                        break;
                case 3: /* try ascii (lower case) */
-                       if(utf2idn(name, dname, sizeof dname) == nil)
+                       if(utf2idn(name, dname, sizeof dname) < 0)
                                continue;
                case 2:
                        mklowcase(dname);
@@ -274,10 +278,23 @@ dblookup1(char *name, int type, int auth, int ttl)
                                continue;
                        break;
                }
-               t = nil;
-               free(ndbgetvalue(db, &s, "dom", dname, attr, &t));
-               if(t == nil && strchr(dname, '.') == nil)
-                       free(ndbgetvalue(db, &s, "sys", dname, attr, &t));
+               for(nt = ndbsearch(db, &s, "dom", dname); nt != nil; nt = ndbsnext(&s, "dom", dname)) {
+                       if(ndbfindattr(nt, s.t, attr) == nil) {
+                               ndbfree(nt);
+                               continue;
+                       }
+                       t = ndbconcatenate(t, ndbreorder(nt, s.t));
+               }
+               if(t == nil && strchr(dname, '.') == nil) {
+                       for(nt = ndbsearch(db, &s, "sys", dname); nt != nil; nt = ndbsnext(&s, "sys", dname)) {
+                               if(ndbfindattr(nt, s.t, attr) == nil) {
+                                       ndbfree(nt);
+                                       continue;
+                               }
+                               t = ndbconcatenate(t, ndbreorder(nt, s.t));
+                       }
+               }
+               s.t = t;
                if(t != nil)
                        break;
        }
@@ -287,6 +304,7 @@ dblookup1(char *name, int type, int auth, int ttl)
                return nil;
        }
 
+
        /* search whole entry for default domain name */
        for(nt = t; nt; nt = nt->entry)
                if(strcmp(nt->attr, "dom") == 0){
@@ -675,13 +693,16 @@ db2cache(int doit)
 
        refresh_areas(owned);
 
-       lock(&dblock);
-
+       qlock(&dblock);
        if(opendatabase() < 0){
-               unlock(&dblock);
+               qunlock(&dblock);
                return;
        }
 
+       qlock(&ipifclock);
+       ipifcs = readipifc(mntpt, ipifcs, -1);
+       qunlock(&ipifclock);
+
        /*
         *  file may be changing as we are reading it, so loop till
         *  mod times are consistent.
@@ -737,11 +758,10 @@ db2cache(int doit)
                createptrs();
        }
 
-       unlock(&dblock);
+       qunlock(&dblock);
 }
 
 extern char    mntpt[Maxpath];         /* net mountpoint */
-static uchar   ipaddr[IPaddrlen];      /* my ip address */
 
 /*
  *  get all my xxx
@@ -750,25 +770,31 @@ static uchar      ipaddr[IPaddrlen];      /* my ip address */
 Ndbtuple*
 lookupinfo(char *attr)
 {
-       char buf[64];
-       char *a[2];
-       Ndbtuple *t;
-
-       if(ipcmp(ipaddr, IPnoaddr) == 0)
-               if(myipaddr(ipaddr, mntpt) < 0)
-                       return nil;
-
-       snprint(buf, sizeof buf, "%I", ipaddr);
-       a[0] = attr;
+       Ndbtuple *t, *nt;
+       char ip[64];
+       Ipifc *ifc;
+       Iplifc *lifc;
 
-       lock(&dblock);
+       t = nil;
+       qlock(&dblock);
        if(opendatabase() < 0){
-               unlock(&dblock);
+               qunlock(&dblock);
                return nil;
        }
-       t = ndbipinfo(db, "ip", buf, a, 1);
-       unlock(&dblock);
-       return t;
+       qlock(&ipifclock);
+       if(ipifcs == nil)
+               ipifcs = readipifc(mntpt, ipifcs, -1);
+       for(ifc = ipifcs; ifc != nil; ifc = ifc->next){
+               for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){
+                       snprint(ip, sizeof(ip), "%I", lifc->ip);
+                       nt = ndbipinfo(db, "ip", ip, &attr, 1);
+                       t = ndbconcatenate(t, nt);
+               }
+       }
+       qunlock(&ipifclock);
+       qunlock(&dblock);
+
+       return ndbdedup(t);
 }
 
 /*
@@ -808,33 +834,20 @@ baddelegation(RR *rp, RR *nsrp, uchar *addr)
 int
 myip(uchar *ip)
 {
-       char *line, *sp;
-       char buf[Maxpath];
-       uchar ipa[IPaddrlen];
-       Biobuf *bp;
-
-       if(ipcmp(ipaddr, IPnoaddr) == 0)
-               if(myipaddr(ipaddr, mntpt) < 0)
-                       return -1;
-
-       if(ipcmp(ipaddr, ip) == 0)
-               return 1;
-
-       snprint(buf, sizeof buf, "%s/ipselftab", mntpt);
-       bp = Bopen(buf, OREAD);
-       if(bp != nil) {
-               while((line = Brdline(bp, '\n')) != nil) {
-                       line[Blinelen(bp) - 1] = '\0';
-                       if((sp = strchr(line, ' ')) != nil) {
-                               *sp = '\0';
-                               if(parseip(ipa, line) != -1 && ipcmp(ipa, ip) == 0) {
-                                       Bterm(bp);
-                                       return 1;
-                               }
+       Ipifc *ifc;
+       Iplifc *lifc;
+
+       qlock(&ipifclock);
+       for(ifc = ipifcs; ifc != nil; ifc = ifc->next){
+               for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){
+                       if(ipcmp(ip, lifc->ip) == 0){
+                               qunlock(&ipifclock);
+                               return 1;
                        }
                }
-               Bterm(bp);
        }
+       qunlock(&ipifclock);
+
        return 0;
 }
 
@@ -1170,11 +1183,11 @@ insideaddr(char *dom)
        if (dom[0] == '\0' || strcmp(dom, ".") == 0)    /* dns root? */
                return 1;                       /* hack for initialisation */
 
-       lock(&dblock);
+       qlock(&dblock);
        if (indoms == nil)
                loaddomsrvs();
        if (indoms == nil) {
-               unlock(&dblock);
+               qunlock(&dblock);
                return 1;  /* no "inside-dom" sys, try inside nameservers */
        }
 
@@ -1192,7 +1205,7 @@ insideaddr(char *dom)
                        break;
                }
        }
-       unlock(&dblock);
+       qunlock(&dblock);
        return rv;
 }