]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ndb/dblookup.c
fix misleading/wrong fd checks
[plan9front.git] / sys / src / cmd / ndb / dblookup.c
index b7bb9097e5149c4b56ef781c79ed28ce33c511fe..ec3f94d1cb980073fb2db6cba8c170c89ac8b9ac 100644 (file)
@@ -257,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;
                        }
@@ -269,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);
@@ -277,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;
        }
@@ -290,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){
@@ -779,7 +794,7 @@ lookupinfo(char *attr)
        qunlock(&ipifclock);
        qunlock(&dblock);
 
-       return t;
+       return ndbdedup(t);
 }
 
 /*