#include <u.h>
#include <libc.h>
#include <ip.h>
-#include <pool.h>
#include <ctype.h>
#include "dns.h"
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)
{
void
putactivity(int recursive)
{
- static ulong lastclean;
-
if(traceactivity)
dnslog("put: %d active by pid %d",
dnvars.active, getpid());
}
unlock(&dnvars);
- dncheck();
-
db2cache(needrefresh);
- dncheck();
dnageall(0);
- dncheck();
-
/* let others back in */
- lastclean = now;
needrefresh = 0;
dnvars.mutex = 0;
}
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
*/
rravfmt(Fmt *f)
{
int rv, quote;
- char *strp;
+ char buf[Domlen], *strp;
Fmt fstr;
RR *rp;
Server *s;
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:
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));
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)
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)
" 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)
}
}
-/*
- * 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)
{
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)
/* 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;