]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ndb/dn.c
merge
[plan9front.git] / sys / src / cmd / ndb / dn.c
index fcf262259f584d39a533da13902a4680207a0ac4..dd566be067d871eb633510f77030f838cbb5e700 100644 (file)
@@ -1,7 +1,6 @@
 #include <u.h>
 #include <libc.h>
 #include <ip.h>
-#include <pool.h>
 #include <ctype.h>
 #include "dns.h"
 
@@ -224,6 +223,25 @@ dnlookup(char *name, int class, int enter)
        return dp;
 }
 
+DN*
+idnlookup(char *name, int class, int enter)
+{
+       char dom[Domlen];
+
+       if(utf2idn(name, dom, sizeof dom) != nil)
+               name = dom;
+       return dnlookup(name, class, enter);
+}
+
+DN*
+ipalookup(uchar *ip, int class, int enter)
+{
+       char addr[64];
+
+       snprint(addr, sizeof(addr), "%I", ip);
+       return dnlookup(addr, class, enter);
+}
+
 static int
 rrsame(RR *rr1, RR *rr2)
 {
@@ -663,8 +681,6 @@ getactivity(Request *req, int recursive)
 void
 putactivity(int recursive)
 {
-       static ulong lastclean;
-
        if(traceactivity)
                dnslog("put: %d active by pid %d",
                        dnvars.active, getpid());
@@ -692,17 +708,11 @@ putactivity(int recursive)
        }
        unlock(&dnvars);
 
-       dncheck();
-
        db2cache(needrefresh);
-       dncheck();
 
        dnageall(0);
 
-       dncheck();
-
        /* let others back in */
-       lastclean = now;
        needrefresh = 0;
        dnvars.mutex = 0;
 }
@@ -1085,54 +1095,69 @@ rrcat(RR **start, RR *rp)
        return *start;
 }
 
-/*
- *  remove negative cache rr's from an rr list
- */
 RR*
-rrremneg(RR **l)
+rrremfilter(RR **l, int (*filter)(RR*, void*), void *arg)
 {
-       RR **nl, *rp;
-       RR *first;
+       RR *first, *rp;
+       RR **nl;
 
        first = nil;
        nl = &first;
        while(*l != nil){
                rp = *l;
-               if(rp->negative){
+               if((*filter)(rp, arg)){
                        *l = rp->next;
                        *nl = rp;
                        nl = &rp->next;
                        *nl = nil;
                } else
-                       l = &rp->next;
+                       l = &(*l)->next;
        }
 
        return first;
 }
 
+static int
+filterneg(RR *rp, void*)
+{
+       return rp->negative;
+}
+static int
+filtertype(RR *rp, void *arg)
+{
+       return rp->type == *((int*)arg);
+}
+static int
+filterowner(RR *rp, void *arg)
+{
+       return rp->owner == (DN*)arg;
+}
+
+/*
+ *  remove negative cache rr's from an rr list
+ */
+RR*
+rrremneg(RR **l)
+{
+       return rrremfilter(l, filterneg, nil);
+}
+
 /*
  *  remove rr's of a particular type from an rr list
  */
 RR*
 rrremtype(RR **l, int type)
 {
-       RR *first, *rp;
-       RR **nl;
-
-       first = nil;
-       nl = &first;
-       while(*l != nil){
-               rp = *l;
-               if(rp->type == type){
-                       *l = rp->next;
-                       *nl = rp;
-                       nl = &rp->next;
-                       *nl = nil;
-               } else
-                       l = &(*l)->next;
-       }
+       return rrremfilter(l, filtertype, &type);
+}
 
-       return first;
+/*
+ *  remove rr's of a particular owner from an rr list
+ */
+RR*
+rrremowner(RR **l, DN *owner)
+{
+       return rrremfilter(l, filterowner, owner);
 }
 
 static char *
@@ -1141,6 +1166,17 @@ dnname(DN *dn)
        return dn? dn->name: "<null>";
 }
 
+static char *
+idnname(DN *dn, char *buf, int nbuf)
+{
+       char *name;
+
+       name = dnname(dn);
+       if(idn2utf(name, buf, nbuf) != nil)
+               return buf;
+       return name;
+}
+
 /*
  *  print conversion for rr records
  */
@@ -1272,7 +1308,7 @@ int
 rravfmt(Fmt *f)
 {
        int rv, quote;
-       char *strp;
+       char buf[Domlen], *strp;
        Fmt fstr;
        RR *rp;
        Server *s;
@@ -1291,34 +1327,37 @@ rravfmt(Fmt *f)
        if(rp->type == Tptr)
                fmtprint(&fstr, "ptr=%s", dnname(rp->owner));
        else
-               fmtprint(&fstr, "dom=%s", dnname(rp->owner));
+               fmtprint(&fstr, "dom=%s", idnname(rp->owner, buf, sizeof(buf)));
 
        switch(rp->type){
        case Thinfo:
                fmtprint(&fstr, " cpu=%s os=%s",
-                       dnname(rp->cpu), dnname(rp->os));
+                       idnname(rp->cpu, buf, sizeof(buf)),
+                       idnname(rp->os, buf, sizeof(buf)));
                break;
        case Tcname:
-               fmtprint(&fstr, " cname=%s", dnname(rp->host));
+               fmtprint(&fstr, " cname=%s", idnname(rp->host, buf, sizeof(buf)));
                break;
        case Tmb:
        case Tmd:
        case Tmf:
-               fmtprint(&fstr, " mbox=%s", dnname(rp->host));
+               fmtprint(&fstr, " mbox=%s", idnname(rp->host, buf, sizeof(buf)));
                break;
        case Tns:
-               fmtprint(&fstr,  " ns=%s", dnname(rp->host));
+               fmtprint(&fstr,  " ns=%s", idnname(rp->host, buf, sizeof(buf)));
                break;
        case Tmg:
        case Tmr:
-               fmtprint(&fstr, " mbox=%s", dnname(rp->mb));
+               fmtprint(&fstr, " mbox=%s", idnname(rp->mb, buf, sizeof(buf)));
                break;
        case Tminfo:
                fmtprint(&fstr, " mbox=%s mbox=%s",
-                       dnname(rp->mb), dnname(rp->rmb));
+                       idnname(rp->mb, buf, sizeof(buf)),
+                       idnname(rp->rmb, buf, sizeof(buf)));
                break;
        case Tmx:
-               fmtprint(&fstr, " pref=%lud mx=%s", rp->pref, dnname(rp->host));
+               fmtprint(&fstr, " pref=%lud mx=%s", rp->pref,
+                       idnname(rp->host, buf, sizeof(buf)));
                break;
        case Ta:
        case Taaaa:
@@ -1331,7 +1370,8 @@ rravfmt(Fmt *f)
                soa = rp->soa;
                fmtprint(&fstr,
 " ns=%s mbox=%s serial=%lud refresh=%lud retry=%lud expire=%lud ttl=%lud",
-                       dnname(rp->host), dnname(rp->rmb),
+                       idnname(rp->host, buf, sizeof(buf)),
+                       idnname(rp->rmb, buf, sizeof(buf)),
                        (soa? soa->serial: 0),
                        (soa? soa->refresh: 0), (soa? soa->retry: 0),
                        (soa? soa->expire: 0), (soa? soa->minttl: 0));
@@ -1342,7 +1382,7 @@ rravfmt(Fmt *f)
                srv = rp->srv;
                fmtprint(&fstr, " pri=%ud weight=%ud port=%ud target=%s",
                        (srv? srv->pri: 0), (srv? srv->weight: 0),
-                       rp->port, dnname(rp->host));
+                       rp->port, idnname(rp->host, buf, sizeof(buf)));
                break;
        case Tnull:
                if (rp->null == nil)
@@ -1366,7 +1406,8 @@ rravfmt(Fmt *f)
                break;
        case Trp:
                fmtprint(&fstr, " rp=%s txt=%s",
-                       dnname(rp->rmb), dnname(rp->rp));
+                       idnname(rp->rmb, buf, sizeof(buf)),
+                       idnname(rp->rp, buf, sizeof(buf)));
                break;
        case Tkey:
                if (rp->key == nil)
@@ -1384,7 +1425,7 @@ rravfmt(Fmt *f)
 " type=%d alg=%d labels=%d ttl=%lud exp=%lud incep=%lud tag=%d signer=%s",
                                rp->sig->type, rp->sig->alg, rp->sig->labels,
                                rp->sig->ttl, rp->sig->exp, rp->sig->incep,
-                               rp->sig->tag, dnname(rp->sig->signer));
+                               rp->sig->tag, idnname(rp->sig->signer, buf, sizeof(buf)));
                break;
        case Tcert:
                if (rp->cert == nil)
@@ -1507,39 +1548,6 @@ slave(Request *req)
        }
 }
 
-/*
- *  chasing down double free's
- */
-void
-dncheck(void)
-{
-       int i;
-       DN *dp;
-       RR *rp;
-
-       if(!testing)
-               return;
-
-       lock(&dnlock);
-       poolcheck(mainmem);
-       for(i = 0; i < HTLEN; i++)
-               for(dp = ht[i]; dp; dp = dp->next){
-                       assert(dp->magic == DNmagic);
-                       for(rp = dp->rr; rp; rp = rp->next){
-                               assert(rp->magic == RRmagic);
-                               assert(rp->cached);
-                               assert(rp->owner == dp);
-                               /* also check for duplicate rrs */
-                               if (rronlist(rp, rp->next)) {
-                                       dnslog("%R duplicates its next chain "
-                                               "(%R); aborting", rp, rp->next);
-                                       abort();
-                               }
-                       }
-               }
-       unlock(&dnlock);
-}
-
 static int
 rrequiv(RR *r1, RR *r2)
 {
@@ -1672,20 +1680,7 @@ sencodefmt(Fmt *f)
        ilen = f->prec;
        f->prec = 0;
        f->flags &= ~FmtPrec;
-       switch(f->r){
-       case '<':
-               len = (8*ilen+4)/5 + 3;
-               break;
-       case '[':
-               len = (8*ilen+5)/6 + 4;
-               break;
-       case 'H':
-               len = 2*ilen + 1;
-               break;
-       default:
-               goto error;
-       }
-
+       len = 2*ilen + 1;
        if(len > sizeof(obuf)){
                buf = malloc(len);
                if(buf == nil)
@@ -1695,20 +1690,7 @@ sencodefmt(Fmt *f)
 
        /* convert */
        out = buf;
-       switch(f->r){
-       case '<':
-               rv = enc32(out, len, b, ilen);
-               break;
-       case '[':
-               rv = enc64(out, len, b, ilen);
-               break;
-       case 'H':
-               rv = enc16(out, len, b, ilen);
-               break;
-       default:
-               rv = -1;
-               break;
-       }
+       rv = enc16(out, len, b, ilen);
        if(rv < 0)
                goto error;