#include <u.h>
#include <libc.h>
#include <ip.h>
-#include <pool.h>
#include <ctype.h>
#include "dns.h"
{
char dom[Domlen];
- if(utf2idn(name, dom, sizeof dom) != nil)
+ if(utf2idn(name, dom, sizeof dom) >= 0)
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;
}
char *name;
name = dnname(dn);
- if(idn2utf(name, buf, nbuf) != nil)
+ if(idn2utf(name, buf, nbuf) >= 0)
return buf;
return name;
}
syslog(0, logfile, dnserr);
}
-/*
- * based on libthread's threadsetname, but drags in less library code.
- * actually just sets the arguments displayed.
- */
-void
-procsetname(char *fmt, ...)
-{
- int fd;
- char *cmdname;
- char buf[128];
- va_list arg;
-
- va_start(arg, fmt);
- cmdname = vsmprint(fmt, arg);
- va_end(arg);
- if (cmdname == nil)
- return;
- snprint(buf, sizeof buf, "#p/%d/args", getpid());
- if((fd = open(buf, OWRITE)) >= 0){
- write(fd, cmdname, strlen(cmdname)+1);
- close(fd);
- }
- free(cmdname);
-}
-
/*
* create a slave process to handle a request to avoid one request blocking
* another
}
}
-/*
- * 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;