* confused by a zero ttl, and instead of using the data and then
* discarding the RR, they conclude that they don't have valid data.
*/
- Ptrttl = 120,
+ Ptrttl = 2*Min,
};
static Ndb *db;
dblookup(char *name, int class, int type, int auth, int ttl)
{
int err;
- char *wild;
- char buf[256];
+ char buf[Domlen], *wild;
RR *rp, *tp;
DN *dp, *ndp;
}
lock(&dblock);
- dp = dnlookup(name, class, 1);
+ dp = idnlookup(name, class, 1);
if(opendatabase() < 0)
goto out;
/* walk the domain name trying the wildcard '*' at each position */
for(wild = strchr(name, '.'); wild; wild = strchr(wild+1, '.')){
snprint(buf, sizeof buf, "*%s", wild);
- ndp = dnlookup(buf, class, 1);
+ ndp = idnlookup(buf, class, 1);
if(ndp->rr)
err = 0;
if(cfg.cachedb)
* don't call it non-existent if it's not ours
* (unless we're a resolver).
*/
- if(err == Rname && (!inmyarea(name) || cfg.resolver))
+ if(err == Rname && (!inmyarea(dp->name) || cfg.resolver))
err = Rserver;
dp->respcode = err;
}
return (t? strtoul(t->val, 0, 10): def);
}
+static void
+mklowcase(char *cp)
+{
+ Rune r;
+
+ while(*cp != 0){
+ chartorune(&r, cp);
+ r = tolowerrune(r);
+ cp += runetochar(cp, &r);
+ }
+}
+
/*
* lookup an RR in the network database
*/
case Tixfr:
return doaxfr(db, name);
default:
-// dnslog("dnlookup1(%s) bad type", name);
+// dnslog("dblookup1(%s) bad type", name);
return nil;
}
/*
* find a matching entry in the database
*/
- t = nil;
nstrcpy(dname, name, sizeof dname);
- free(ndbgetvalue(db, &s, "dom", dname, attr, &t));
- if(t == nil && strchr(dname, '.') == nil)
- free(ndbgetvalue(db, &s, "sys", dname, attr, &t));
- if(t == nil) {
- char *cp;
-
- /* try lower case */
- for(cp = dname; *cp; cp++)
- if(isupper(*cp)) {
- for(; *cp; cp++)
- *cp = tolower(*cp);
- free(ndbgetvalue(db, &s, "dom", dname, attr, &t));
- if(t == nil && strchr(dname, '.') == nil)
- free(ndbgetvalue(db, &s, "sys", dname, attr, &t));
- break;
+ for(x=0; x<4; x++){
+ switch(x){
+ case 1: /* try unicode */
+ if(idn2utf(name, dname, sizeof dname) == nil){
+ nstrcpy(dname, name, sizeof dname);
+ continue;
}
+ if(strcmp(name, dname) == 0)
+ continue;
+ break;
+ case 3: /* try ascii (lower case) */
+ if(utf2idn(name, dname, sizeof dname) == nil)
+ continue;
+ case 2:
+ mklowcase(dname);
+ if(strcmp(name, dname) == 0)
+ 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));
+ if(t != nil)
+ break;
}
+
if(t == nil) {
-// dnslog("dnlookup1(%s) name not found", name);
+// dnslog("dblookup1(%s) name not found", name);
return nil;
}
if(ttl)
rp->ttl = ttl;
if(dp == nil)
- dp = dnlookup(dname, Cin, 1);
+ dp = idnlookup(dname, Cin, 1);
rp->owner = dp;
*l = rp;
l = &rp->next;
rp->ttl = ttl;
rp->auth = auth;
if(dp == nil)
- dp = dnlookup(dname, Cin, 1);
+ dp = idnlookup(dname, Cin, 1);
rp->owner = dp;
*l = rp;
l = &rp->next;
}
ndbfree(t);
-// dnslog("dnlookup1(%s) -> %#p", name, list);
+// dnslog("dblookup1(%s) -> %#p", name, list);
return list;
}
USED(entry);
rp = rralloc(Tcname);
- rp->host = dnlookup(pair->val, Cin, 1);
+ rp->host = idnlookup(pair->val, Cin, 1);
return rp;
}
static RR*
RR *rp;
rp = rralloc(Tmx);
- rp->host = dnlookup(pair->val, Cin, 1);
+ rp->host = idnlookup(pair->val, Cin, 1);
rp->pref = intval(entry, pair, "pref", 1);
return rp;
}
Ndbtuple *t;
rp = rralloc(Tns);
- rp->host = dnlookup(pair->val, Cin, 1);
+ rp->host = idnlookup(pair->val, Cin, 1);
t = look(entry, pair, "soa");
if(t && t->val[0] == 0)
rp->local = 1;
ns = look(entry, pair, "ns");
if(ns == nil)
ns = look(entry, pair, "dom");
- rp->host = dnlookup(ns->val, Cin, 1);
+ rp->host = idnlookup(ns->val, Cin, 1);
/* accept all of:
* mbox=person
p = strchr(mb->val, '@');
if(p != nil)
*p = '.';
- rp->rmb = dnlookup(mb->val, Cin, 1);
+ rp->rmb = idnlookup(mb->val, Cin, 1);
} else {
snprint(mailbox, sizeof mailbox, "%s.%s",
mb->val, ns->val);
- rp->rmb = dnlookup(mailbox, Cin, 1);
+ rp->rmb = idnlookup(mailbox, Cin, 1);
}
else {
snprint(mailbox, sizeof mailbox, "postmaster.%s", ns->val);
- rp->rmb = dnlookup(mailbox, Cin, 1);
+ rp->rmb = idnlookup(mailbox, Cin, 1);
}
/*
RR *rp;
rp = rralloc(Tsrv);
- rp->host = dnlookup(pair->val, Cin, 1);
+ rp->host = idnlookup(pair->val, Cin, 1);
rp->srv->pri = intval(entry, pair, "pri", 0);
rp->srv->weight = intval(entry, pair, "weight", 0);
/* TODO: translate service name to port # */
return;
rp->owner = dp;
- dnagenever(dp, 1);
rp->db = 1;
rp->ttl = intval(entry, pair, "ttl", rp->ttl);
rrattach(rp, Notauthoritative);
+ dnagenever(dp);
}
static void
dbtuple2cache(Ndbtuple *t)
for(et = t; et; et = et->entry)
if(strcmp(et->attr, "dom") == 0){
- dp = dnlookup(et->val, Cin, 1);
+ dp = idnlookup(et->val, Cin, 1);
/* first same line */
for(nt = et->line; nt != et; nt = nt->line){
return t;
}
-char *localservers = "local#dns#servers";
-char *localserverprefix = "local#dns#server";
-
/*
* return non-zero if this is a bad delegation
*/
int
baddelegation(RR *rp, RR *nsrp, uchar *addr)
{
- Ndbtuple *nt;
static int whined;
static Ndbtuple *t;
+ Ndbtuple *nt;
+
+ if(rp->type != Tns)
+ return 0;
if(t == nil)
t = lookupinfo("dom");
-
- for(; rp; rp = rp->next){
- if(rp->type != Tns)
- continue;
-
- /* see if delegation is looping */
- if(nsrp)
- if(rp->owner != nsrp->owner)
- if(subsume(rp->owner->name, nsrp->owner->name) &&
- strcmp(nsrp->owner->name, localservers) != 0){
- dnslog("delegation loop %R -> %R from %I",
- nsrp, rp, addr);
- return 1;
- }
-
- if(t == nil)
- continue;
-
+ if(t != nil){
/* see if delegating to us what we don't own */
for(nt = t; nt != nil; nt = nt->entry)
if(rp->host && cistrcmp(rp->host->name, nt->val) == 0)
break;
+
if(nt != nil && !inmyarea(rp->owner->name)){
if (!whined) {
whined = 1;
- dnslog("bad delegation %R from %I; "
- "no further logging of them", rp, addr);
+ dnslog("bad delegation %R from %I/%s; "
+ "no further logging of them",
+ rp, addr, nsrp->host->name);
}
return 1;
}
}
-
return 0;
}
/* ns record for name server, make up an impossible name */
rp = rralloc(Tns);
- snprint(buf, sizeof buf, "%s%d", localserverprefix, i);
+ snprint(buf, sizeof buf, "local#dns#server%d", i);
nsdp = dnlookup(buf, class, 1);
rp->host = nsdp;
rp->owner = dp; /* e.g., local#dns#servers */
rp->local = 1;
rp->db = 1;
-// rp->ttl = 10*Min; /* seems too short */
- rp->ttl = (1UL<<31)-1;
+ rp->ttl = 10*Min;
rrattach(rp, Authoritative); /* will not attach rrs in my area */
+ dnagenever(dp);
/* A or AAAA record */
if (parseip(ip, ipaddr) >= 0 && isv4(ip))
rp->owner = nsdp;
rp->local = 1;
rp->db = 1;
-// rp->ttl = 10*Min; /* seems too short */
- rp->ttl = (1UL<<31)-1;
+ rp->ttl = 10*Min;
rrattach(rp, Authoritative); /* will not attach rrs in my area */
+ dnagenever(nsdp);
dnslog("added local dns server %s at %s", buf, ipaddr);
}
RR *nsrp;
DN *dp;
- dp = dnlookup(localservers, class, 1);
+ dp = dnlookup("local#dns#servers", class, 1);
nsrp = rrlookup(dp, Tns, NOneg);
if(nsrp != nil)
return nsrp;
rp->db = 1;
rp->ttl = 10*Min;
rrattach(rp, Authoritative);
+ dnagenever(dp);
}
/*