Ptrttl = 2*Min,
};
-static Ndb *db;
-static Lock dblock;
+static Ndb *db;
+static QLock dblock;
+
+static Ipifc *ipifcs;
+static QLock ipifclock;
static RR* addrrr(Ndbtuple*, Ndbtuple*);
static RR* cnamerr(Ndbtuple*, Ndbtuple*);
char netdbnm[256];
Ndb *xdb, *netdb;
- if (db)
+ if(db != nil)
return 0;
xdb = ndbopen(dbfile); /* /lib/ndb */
netdb->nohash = 1;
db = ndbcat(netdb, xdb); /* both */
- return db? 0: -1;
+ return db!=nil ? 0: -1;
}
/*
return rp;
}
- lock(&dblock);
+ qlock(&dblock);
dp = idnlookup(name, class, 1);
if(opendatabase() < 0)
dp->respcode = err;
}
- unlock(&dblock);
+ qunlock(&dblock);
return rp;
}
/*
* find a matching entry in the database
*/
+ t = nil;
nstrcpy(dname, name, sizeof dname);
for(x=0; x<4; x++){
switch(x){
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;
}
return nil;
}
+
/* search whole entry for default domain name */
for(nt = t; nt; nt = nt->entry)
if(strcmp(nt->attr, "dom") == 0){
refresh_areas(owned);
- lock(&dblock);
-
+ qlock(&dblock);
if(opendatabase() < 0){
- unlock(&dblock);
+ qunlock(&dblock);
return;
}
+ qlock(&ipifclock);
+ ipifcs = readipifc(mntpt, ipifcs, -1);
+ qunlock(&ipifclock);
+
/*
* file may be changing as we are reading it, so loop till
* mod times are consistent.
createptrs();
}
- unlock(&dblock);
+ qunlock(&dblock);
}
extern char mntpt[Maxpath]; /* net mountpoint */
-static uchar ipaddr[IPaddrlen]; /* my ip address */
/*
* get all my xxx
Ndbtuple*
lookupinfo(char *attr)
{
- char buf[64];
- char *a[2];
- Ndbtuple *t;
-
- if(ipcmp(ipaddr, IPnoaddr) == 0)
- if(myipaddr(ipaddr, mntpt) < 0)
- return nil;
-
- snprint(buf, sizeof buf, "%I", ipaddr);
- a[0] = attr;
+ Ndbtuple *t, *nt;
+ char ip[64];
+ Ipifc *ifc;
+ Iplifc *lifc;
- lock(&dblock);
+ t = nil;
+ qlock(&dblock);
if(opendatabase() < 0){
- unlock(&dblock);
+ qunlock(&dblock);
return nil;
}
- t = ndbipinfo(db, "ip", buf, a, 1);
- unlock(&dblock);
+ qlock(&ipifclock);
+ if(ipifcs == nil)
+ ipifcs = readipifc(mntpt, ipifcs, -1);
+ for(ifc = ipifcs; ifc != nil; ifc = ifc->next){
+ for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){
+ snprint(ip, sizeof(ip), "%I", lifc->ip);
+ nt = ndbipinfo(db, "ip", ip, &attr, 1);
+ t = ndbconcatenate(t, nt);
+ }
+ }
+ qunlock(&ipifclock);
+ qunlock(&dblock);
+
return t;
}
int
myip(uchar *ip)
{
- char *line, *sp;
- char buf[Maxpath];
- uchar ipa[IPaddrlen];
- Biobuf *bp;
-
- if(ipcmp(ipaddr, IPnoaddr) == 0)
- if(myipaddr(ipaddr, mntpt) < 0)
- return -1;
-
- if(ipcmp(ipaddr, ip) == 0)
- return 1;
-
- snprint(buf, sizeof buf, "%s/ipselftab", mntpt);
- bp = Bopen(buf, OREAD);
- if(bp != nil) {
- while((line = Brdline(bp, '\n')) != nil) {
- line[Blinelen(bp) - 1] = '\0';
- if((sp = strchr(line, ' ')) != nil) {
- *sp = '\0';
- if(parseip(ipa, line) != -1 && ipcmp(ipa, ip) == 0) {
- Bterm(bp);
- return 1;
- }
+ Ipifc *ifc;
+ Iplifc *lifc;
+
+ qlock(&ipifclock);
+ for(ifc = ipifcs; ifc != nil; ifc = ifc->next){
+ for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){
+ if(ipcmp(ip, lifc->ip) == 0){
+ qunlock(&ipifclock);
+ return 1;
}
}
- Bterm(bp);
}
+ qunlock(&ipifclock);
+
return 0;
}
static void
-addlocaldnsserver(DN *dp, int class, char *ipaddr, int i)
+addlocaldnsserver(DN *dp, int class, char *addr, int i)
{
uchar ip[IPaddrlen];
DN *nsdp, *ipdp;
int type, n;
char buf[32];
- if(parseip(ip, ipaddr) == -1 || ipcmp(ip, IPnoaddr) == 0){
- dnslog("rejecting bad ip %s as local dns server", ipaddr);
+ if(parseip(ip, addr) == -1 || ipcmp(ip, IPnoaddr) == 0){
+ dnslog("rejecting bad ip %s as local dns server", addr);
return;
}
if (dom[0] == '\0' || strcmp(dom, ".") == 0) /* dns root? */
return 1; /* hack for initialisation */
- lock(&dblock);
+ qlock(&dblock);
if (indoms == nil)
loaddomsrvs();
if (indoms == nil) {
- unlock(&dblock);
+ qunlock(&dblock);
return 1; /* no "inside-dom" sys, try inside nameservers */
}
break;
}
}
- unlock(&dblock);
+ qunlock(&dblock);
return rv;
}