ndb/cs: don't lookup AAAA records for IL, make sure translated address is IPv4 for IL, consistent use of nil vs. 0 for pointers

front
cinap_lenrek 2016-08-14 23:10:19 +02:00
parent 58a0db935c
commit 75a8003a8a
1 changed files with 102 additions and 92 deletions

View File

@ -135,16 +135,16 @@ char netndb[Maxpath];
/* /*
* Network specific translators * Network specific translators
*/ */
Ndbtuple* iplookup(Network*, char*, char*, int); Ndbtuple* iplookup(Network*, char*, char*);
char* iptrans(Ndbtuple*, Network*, char*, char*, int); char* iptrans(Ndbtuple*, Network*, char*, char*, int);
Ndbtuple* telcolookup(Network*, char*, char*, int); Ndbtuple* telcolookup(Network*, char*, char*);
char* telcotrans(Ndbtuple*, Network*, char*, char*, int); char* telcotrans(Ndbtuple*, Network*, char*, char*, int);
Ndbtuple* dnsiplookup(char*, Ndbs*); Ndbtuple* dnsiplookup(char*, Ndbs*, int);
struct Network struct Network
{ {
char *net; char *net;
Ndbtuple *(*lookup)(Network*, char*, char*, int); Ndbtuple *(*lookup)(Network*, char*, char*);
char *(*trans)(Ndbtuple*, Network*, char*, char*, int); char *(*trans)(Ndbtuple*, Network*, char*, char*, int);
int considered; /* flag: ignored for "net!"? */ int considered; /* flag: ignored for "net!"? */
int fasttimeouthack; /* flag. was for IL */ int fasttimeouthack; /* flag. was for IL */
@ -341,7 +341,7 @@ ndbinit(void)
if(db == nil) if(db == nil)
error("can't open network database"); error("can't open network database");
for(netdb = db; netdb; netdb = netdb->next) for(netdb = db; netdb != nil; netdb = netdb->next)
if(strcmp(netdb->file, netndb) == 0) if(strcmp(netdb->file, netndb) == 0)
return; return;
@ -358,13 +358,13 @@ newfid(int fid)
Mlist *f, *ff; Mlist *f, *ff;
Mfile *mf; Mfile *mf;
ff = 0; ff = nil;
for(f = mlist; f; f = f->next) for(f = mlist; f != nil; f = f->next)
if(f->mf.busy && f->mf.fid == fid) if(f->mf.busy && f->mf.fid == fid)
return &f->mf; return &f->mf;
else if(!ff && !f->mf.busy && !f->mf.ref) else if(ff == nil && !f->mf.busy && !f->mf.ref)
ff = f; ff = f;
if(ff == 0){ if(ff == nil){
ff = emalloc(sizeof *f); ff = emalloc(sizeof *f);
ff->next = mlist; ff->next = mlist;
mlist = ff; mlist = ff;
@ -395,7 +395,7 @@ freejob(Job *job)
Job **l; Job **l;
qlock(&joblock); qlock(&joblock);
for(l = &joblist; *l; l = &(*l)->next){ for(l = &joblist; *l != nil; l = &(*l)->next){
if((*l) == job){ if((*l) == job){
*l = job->next; *l = job->next;
break; break;
@ -411,7 +411,7 @@ flushjob(int tag)
Job *job; Job *job;
qlock(&joblock); qlock(&joblock);
for(job = joblist; job; job = job->next){ for(job = joblist; job != nil; job = job->next){
if(job->request.tag == tag && job->request.type != Tflush){ if(job->request.tag == tag && job->request.type != Tflush){
job->flushed = 1; job->flushed = 1;
break; break;
@ -531,7 +531,7 @@ rversion(Job *job)
sendmsg(job, "unknown 9P version"); sendmsg(job, "unknown 9P version");
else{ else{
job->reply.version = "9P2000"; job->reply.version = "9P2000";
sendmsg(job, 0); sendmsg(job, nil);
} }
} }
@ -548,7 +548,7 @@ void
rflush(Job *job) rflush(Job *job)
{ {
flushjob(job->request.oldtag); flushjob(job->request.oldtag);
sendmsg(job, 0); sendmsg(job, nil);
} }
void void
@ -562,7 +562,7 @@ rattach(Job *job, Mfile *mf)
mf->qid.type = QTDIR; mf->qid.type = QTDIR;
mf->qid.path = 0LL; mf->qid.path = 0LL;
job->reply.qid = mf->qid; job->reply.qid = mf->qid;
sendmsg(job, 0); sendmsg(job, nil);
} }
@ -576,7 +576,7 @@ rwalk(Job *job, Mfile *mf)
Mfile *nmf; Mfile *nmf;
Qid qid; Qid qid;
err = 0; err = nil;
nmf = nil; nmf = nil;
elems = job->request.wname; elems = job->request.wname;
nelems = job->request.nwname; nelems = job->request.nwname;
@ -628,7 +628,7 @@ rwalk(Job *job, Mfile *mf)
if(nmf != nil && (err!=nil || job->reply.nwqid<nelems)){ if(nmf != nil && (err!=nil || job->reply.nwqid<nelems)){
cleanmf(nmf); cleanmf(nmf);
free(nmf->user); free(nmf->user);
nmf->user = 0; nmf->user = nil;
nmf->busy = 0; nmf->busy = 0;
nmf->fid = 0; nmf->fid = 0;
} }
@ -644,7 +644,7 @@ ropen(Job *job, Mfile *mf)
int mode; int mode;
char *err; char *err;
err = 0; err = nil;
mode = job->request.mode; mode = job->request.mode;
if(mf->qid.type & QTDIR){ if(mf->qid.type & QTDIR){
if(mode) if(mode)
@ -672,7 +672,7 @@ rread(Job *job, Mfile *mf)
char *err; char *err;
n = 0; n = 0;
err = 0; err = nil;
off = job->request.offset; off = job->request.offset;
cnt = job->request.count; cnt = job->request.count;
mf->ref++; mf->ref++;
@ -701,7 +701,7 @@ rread(Job *job, Mfile *mf)
for(;;){ for(;;){
/* look for an answer at the right offset */ /* look for an answer at the right offset */
toff = 0; toff = 0;
for(i = 0; mf->reply[i] && i < mf->nreply; i++){ for(i = 0; mf->reply[i] != nil && i < mf->nreply; i++){
n = mf->replylen[i]; n = mf->replylen[i];
if(off < toff + n) if(off < toff + n)
break; break;
@ -771,7 +771,7 @@ rwrite(Job *job, Mfile *mf)
char *field[4]; char *field[4];
char curerr[64]; char curerr[64];
err = 0; err = nil;
cnt = job->request.count; cnt = job->request.count;
if(mf->qid.type & QTDIR){ if(mf->qid.type & QTDIR){
err = "can't write directory"; err = "can't write directory";
@ -898,10 +898,10 @@ rclunk(Job *job, Mfile *mf)
if(mf->ref == 0) if(mf->ref == 0)
cleanmf(mf); cleanmf(mf);
free(mf->user); free(mf->user);
mf->user = 0; mf->user = nil;
mf->fid = 0; mf->fid = 0;
mf->busy = 0; mf->busy = 0;
sendmsg(job, 0); sendmsg(job, nil);
} }
void void
@ -933,7 +933,7 @@ rstat(Job *job, Mfile *mf)
dir.atime = dir.mtime = time(0); dir.atime = dir.mtime = time(0);
job->reply.nstat = convD2M(&dir, buf, sizeof buf); job->reply.nstat = convD2M(&dir, buf, sizeof buf);
job->reply.stat = buf; job->reply.stat = buf;
sendmsg(job, 0); sendmsg(job, nil);
} }
void void
@ -1023,7 +1023,7 @@ ipid(void)
char buf[Maxpath]; char buf[Maxpath];
/* use environment, ether addr, or ipaddr to get system name */ /* use environment, ether addr, or ipaddr to get system name */
if(mysysname == 0){ if(mysysname == nil){
/* /*
* environment has priority. * environment has priority.
* *
@ -1032,7 +1032,7 @@ ipid(void)
* *
*/ */
p = getenv("sysname"); p = getenv("sysname");
if(p && *p){ if(p != nil && *p){
attr = ipattr(p); attr = ipattr(p);
if(strcmp(attr, "ip") != 0) if(strcmp(attr, "ip") != 0)
mysysname = estrdup(p); mysysname = estrdup(p);
@ -1043,7 +1043,7 @@ ipid(void)
* figured out from DHCP. use that name if * figured out from DHCP. use that name if
* there is one. * there is one.
*/ */
if(mysysname == 0 && netdb != nil){ if(mysysname == nil && netdb != nil){
ndbreopen(netdb); ndbreopen(netdb);
for(tt = t = ndbparse(netdb); t != nil; t = t->entry){ for(tt = t = ndbparse(netdb); t != nil; t = t->entry){
if(strcmp(t->attr, "sys") == 0){ if(strcmp(t->attr, "sys") == 0){
@ -1055,7 +1055,7 @@ ipid(void)
} }
/* next network database, ip address, and ether address to find a name */ /* next network database, ip address, and ether address to find a name */
if(mysysname == 0){ if(mysysname == nil){
t = nil; t = nil;
if(isvalidip(ipa)) if(isvalidip(ipa))
free(ndbgetvalue(db, &s, "ip", ipaddr, "sys", &t)); free(ndbgetvalue(db, &s, "ip", ipaddr, "sys", &t));
@ -1090,12 +1090,12 @@ ipid(void)
} }
/* nothing else worked, use the ip address */ /* nothing else worked, use the ip address */
if(mysysname == 0 && isvalidip(ipa)) if(mysysname == nil && isvalidip(ipa))
mysysname = estrdup(ipaddr); mysysname = estrdup(ipaddr);
/* set /dev/sysname if we now know it */ /* set /dev/sysname if we now know it */
if(mysysname){ if(mysysname != nil){
f = open("/dev/sysname", OWRITE); f = open("/dev/sysname", OWRITE);
if(f >= 0){ if(f >= 0){
write(f, mysysname, strlen(mysysname)); write(f, mysysname, strlen(mysysname));
@ -1127,18 +1127,18 @@ netinit(int background)
} }
/* add the mounted networks to the default list */ /* add the mounted networks to the default list */
for(np = network; np->net; np++){ for(np = network; np->net != nil; np++){
if(np->considered) if(np->considered)
continue; continue;
snprint(clone, sizeof(clone), "%s/%s/clone", mntpt, np->net); snprint(clone, sizeof(clone), "%s/%s/clone", mntpt, np->net);
if(access(clone, AEXIST) < 0) if(access(clone, AEXIST) < 0)
continue; continue;
if(netlist) if(netlist != nil)
last->next = np; last->next = np;
else else
netlist = np; netlist = np;
last = np; last = np;
np->next = 0; np->next = nil;
np->considered = 1; np->considered = 1;
} }
@ -1170,17 +1170,17 @@ netadd(char *p)
n = getfields(p, field, 12, 1, " "); n = getfields(p, field, 12, 1, " ");
for(i = 0; i < n; i++){ for(i = 0; i < n; i++){
for(np = network; np->net; np++){ for(np = network; np->net != nil; np++){
if(strcmp(field[i], np->net) != 0) if(strcmp(field[i], np->net) != 0)
continue; continue;
if(np->considered) if(np->considered)
break; break;
if(netlist) if(netlist != nil)
last->next = np; last->next = np;
else else
netlist = np; netlist = np;
last = np; last = np;
np->next = 0; np->next = nil;
np->considered = 1; np->considered = 1;
} }
} }
@ -1210,28 +1210,27 @@ lookup(Mfile *mf)
int hack; int hack;
/* open up the standard db files */ /* open up the standard db files */
if(db == 0) if(db == nil)
ndbinit(); ndbinit();
if(db == 0) if(db == nil)
error("can't open mf->network database\n"); error("can't open mf->network database\n");
rv = 0;
if(mf->net == nil) if(mf->net == nil)
return 0; /* must have been a genquery */ return 0; /* must have been a genquery */
rv = 0;
if(strcmp(mf->net, "net") == 0){ if(strcmp(mf->net, "net") == 0){
/* /*
* go through set of default nets * go through set of default nets
*/ */
for(np = mf->nextnet; np; np = np->next){ for(np = mf->nextnet; np != nil && rv == 0; np = np->next){
nt = (*np->lookup)(np, mf->host, mf->serv, 1); nt = (*np->lookup)(np, mf->host, mf->serv);
if(nt == nil) if(nt == nil)
continue; continue;
hack = np->fasttimeouthack && !lookforproto(nt, np->net); hack = np->fasttimeouthack && !lookforproto(nt, np->net);
for(t = nt; mf->nreply < Nreply && t; t = t->entry){ for(t = nt; mf->nreply < Nreply && t != nil; t = t->entry){
cp = (*np->trans)(t, np, mf->serv, mf->rem, hack); cp = (*np->trans)(t, np, mf->serv, mf->rem, hack);
if(cp){ if(cp != nil){
/* avoid duplicates */ /* avoid duplicates */
for(i = 0; i < mf->nreply; i++) for(i = 0; i < mf->nreply; i++)
if(strcmp(mf->reply[i], cp) == 0) if(strcmp(mf->reply[i], cp) == 0)
@ -1246,8 +1245,6 @@ lookup(Mfile *mf)
} }
} }
ndbfree(nt); ndbfree(nt);
np = np->next;
break;
} }
mf->nextnet = np; mf->nextnet = np;
return rv; return rv;
@ -1258,24 +1255,25 @@ lookup(Mfile *mf)
*/ */
if(mf->nreply != 0) if(mf->nreply != 0)
return 0; return 0;
/* /*
* look for a specific network * look for a specific network
*/ */
for(np = netlist; np && np->net != nil; np++){ for(np = network; np->net != nil; np++){
if(np->fasttimeouthack) if(np->fasttimeouthack)
continue; continue;
if(strcmp(np->net, mf->net) == 0) if(strcmp(np->net, mf->net) == 0)
break; break;
} }
if(np && np->net != nil){ if(np->net != nil){
/* /*
* known network * known network
*/ */
nt = (*np->lookup)(np, mf->host, mf->serv, 1); nt = (*np->lookup)(np, mf->host, mf->serv);
for(t = nt; mf->nreply < Nreply && t; t = t->entry){ for(t = nt; mf->nreply < Nreply && t != nil; t = t->entry){
cp = (*np->trans)(t, np, mf->serv, mf->rem, 0); cp = (*np->trans)(t, np, mf->serv, mf->rem, 0);
if(cp){ if(cp != nil){
mf->replylen[mf->nreply] = strlen(cp); mf->replylen[mf->nreply] = strlen(cp);
mf->reply[mf->nreply++] = cp; mf->reply[mf->nreply++] = cp;
rv++; rv++;
@ -1287,7 +1285,7 @@ lookup(Mfile *mf)
/* /*
* not a known network, don't translate host or service * not a known network, don't translate host or service
*/ */
if(mf->serv) if(mf->serv != nil)
snprint(reply, sizeof(reply), "%s/%s/clone %s!%s", snprint(reply, sizeof(reply), "%s/%s/clone %s!%s",
mntpt, mf->net, mf->host, mf->serv); mntpt, mf->net, mf->host, mf->serv);
else else
@ -1317,7 +1315,7 @@ ipserv(Network *np, char *name, char *buf, int blen)
Ndbs s; Ndbs s;
/* '*' means any service */ /* '*' means any service */
if(strcmp(name, "*")==0){ if(strcmp(name, "*") == 0){
nstrcpy(buf, name, blen); nstrcpy(buf, name, blen);
return buf; return buf;
} }
@ -1330,14 +1328,14 @@ ipserv(Network *np, char *name, char *buf, int blen)
else if(isalpha(*p) || *p == '-' || *p == '$') else if(isalpha(*p) || *p == '-' || *p == '$')
alpha = 1; alpha = 1;
else else
return 0; return nil;
} }
t = nil; t = nil;
p = nil; p = nil;
if(alpha){ if(alpha){
p = ndbgetvalue(db, &s, np->net, name, "port", &t); p = ndbgetvalue(db, &s, np->net, name, "port", &t);
if(p == nil) if(p == nil)
return 0; return nil;
} else { } else {
/* look up only for tcp ports < 1024 to get the restricted /* look up only for tcp ports < 1024 to get the restricted
* attribute * attribute
@ -1349,7 +1347,7 @@ ipserv(Network *np, char *name, char *buf, int blen)
} }
if(t){ if(t){
for(nt = t; nt; nt = nt->entry) for(nt = t; nt != nil; nt = nt->entry)
if(strcmp(nt->attr, "restricted") == 0) if(strcmp(nt->attr, "restricted") == 0)
restr = 1; restr = 1;
ndbfree(t); ndbfree(t);
@ -1391,7 +1389,7 @@ ipattrlookup(Ndb *db, char *ipa, char *attr, char *val, int vlen)
* lookup (and translate) an ip destination * lookup (and translate) an ip destination
*/ */
Ndbtuple* Ndbtuple*
iplookup(Network *np, char *host, char *serv, int nolookup) iplookup(Network *np, char *host, char *serv)
{ {
char *attr, *dnsname; char *attr, *dnsname;
Ndbtuple *t, *nt; Ndbtuple *t, *nt;
@ -1403,17 +1401,16 @@ iplookup(Network *np, char *host, char *serv, int nolookup)
uchar tnet[IPaddrlen]; uchar tnet[IPaddrlen];
Ipifc *ifc; Ipifc *ifc;
Iplifc *lifc; Iplifc *lifc;
int v6;
USED(nolookup);
/* /*
* start with the service since it's the most likely to fail * start with the service since it's the most likely to fail
* and costs the least * and costs the least
*/ */
werrstr("can't translate address"); werrstr("can't translate address");
if(serv==0 || ipserv(np, serv, ts, sizeof ts) == 0){ if(serv == nil || ipserv(np, serv, ts, sizeof ts) == nil){
werrstr("can't translate service"); werrstr("can't translate service");
return 0; return nil;
} }
/* for dial strings with no host */ /* for dial strings with no host */
@ -1463,21 +1460,22 @@ iplookup(Network *np, char *host, char *serv, int nolookup)
*/ */
t = 0; t = 0;
werrstr("can't translate address"); werrstr("can't translate address");
v6 = strcmp(np->net, "il") != 0;
if(strcmp(attr, "dom") == 0) if(strcmp(attr, "dom") == 0)
t = dnsiplookup(host, &s); t = dnsiplookup(host, &s, v6);
if(t == 0) if(t == nil)
free(ndbgetvalue(db, &s, attr, host, "ip", &t)); free(ndbgetvalue(db, &s, attr, host, "ip", &t));
if(t == 0){ if(t == nil){
dnsname = ndbgetvalue(db, &s, attr, host, "dom", nil); dnsname = ndbgetvalue(db, &s, attr, host, "dom", nil);
if(dnsname){ if(dnsname){
t = dnsiplookup(dnsname, &s); t = dnsiplookup(dnsname, &s, v6);
free(dnsname); free(dnsname);
} }
} }
if(t == 0) if(t == nil)
t = dnsiplookup(host, &s); t = dnsiplookup(host, &s, v6);
if(t == 0) if(t == nil)
return 0; return nil;
/* /*
* reorder the tuple to have the matched line first and * reorder the tuple to have the matched line first and
@ -1510,6 +1508,13 @@ iplookup(Network *np, char *host, char *serv, int nolookup)
return t; return t;
} }
static int
isv4str(char *s)
{
uchar ip[IPaddrlen];
return parseip(ip, s) != -1 && isv4(ip);
}
/* /*
* translate an ip address * translate an ip address
*/ */
@ -1521,11 +1526,11 @@ iptrans(Ndbtuple *t, Network *np, char *serv, char *rem, int hack)
char x[Maxservice]; char x[Maxservice];
if(strcmp(t->attr, "ip") != 0) if(strcmp(t->attr, "ip") != 0)
return 0; return nil;
if(serv == 0 || ipserv(np, serv, ts, sizeof ts) == 0){ if(serv == nil || ipserv(np, serv, ts, sizeof ts) == nil){
werrstr("can't translate service"); werrstr("can't translate service");
return 0; return nil;
} }
if(rem != nil) if(rem != nil)
snprint(x, sizeof(x), "!%s", rem); snprint(x, sizeof(x), "!%s", rem);
@ -1535,9 +1540,14 @@ iptrans(Ndbtuple *t, Network *np, char *serv, char *rem, int hack)
if(*t->val == '*') if(*t->val == '*')
snprint(reply, sizeof(reply), "%s/%s/clone %s%s", snprint(reply, sizeof(reply), "%s/%s/clone %s%s",
mntpt, np->net, ts, x); mntpt, np->net, ts, x);
else else {
/* il only supports ipv4 addresses */
if(strcmp(np->net, "il") == 0 && !isv4str(t->val))
return nil;
snprint(reply, sizeof(reply), "%s/%s/clone %s!%s%s%s", snprint(reply, sizeof(reply), "%s/%s/clone %s!%s%s%s",
mntpt, np->net, t->val, ts, x, hack? "!fasttimeout": ""); mntpt, np->net, t->val, ts, x, hack? "!fasttimeout": "");
}
return estrdup(reply); return estrdup(reply);
} }
@ -1546,16 +1556,16 @@ iptrans(Ndbtuple *t, Network *np, char *serv, char *rem, int hack)
* lookup a telephone number * lookup a telephone number
*/ */
Ndbtuple* Ndbtuple*
telcolookup(Network *np, char *host, char *serv, int nolookup) telcolookup(Network *np, char *host, char *serv)
{ {
Ndbtuple *t; Ndbtuple *t;
Ndbs s; Ndbs s;
USED(np, nolookup, serv); USED(np, serv);
werrstr("can't translate address"); werrstr("can't translate address");
free(ndbgetvalue(db, &s, "sys", host, "telco", &t)); free(ndbgetvalue(db, &s, "sys", host, "telco", &t));
if(t == 0) if(t == nil)
return ndbnew("telco", host); return ndbnew("telco", host);
return reorder(t, s.t); return reorder(t, s.t);
@ -1571,13 +1581,13 @@ telcotrans(Ndbtuple *t, Network *np, char *serv, char *rem, int)
char x[Maxservice]; char x[Maxservice];
if(strcmp(t->attr, "telco") != 0) if(strcmp(t->attr, "telco") != 0)
return 0; return nil;
if(rem != nil) if(rem != nil)
snprint(x, sizeof(x), "!%s", rem); snprint(x, sizeof(x), "!%s", rem);
else else
*x = 0; *x = 0;
if(serv) if(serv != nil)
snprint(reply, sizeof(reply), "%s/%s/clone %s!%s%s", mntpt, np->net, snprint(reply, sizeof(reply), "%s/%s/clone %s!%s%s", mntpt, np->net,
t->val, serv, x); t->val, serv, x);
else else
@ -1605,10 +1615,10 @@ reorder(Ndbtuple *t, Ndbtuple *x)
/* remove this line and everything after it from the entry */ /* remove this line and everything after it from the entry */
for(nt = t; nt->entry != line; nt = nt->entry) for(nt = t; nt->entry != line; nt = nt->entry)
; ;
nt->entry = 0; nt->entry = nil;
/* make that the start of the entry */ /* make that the start of the entry */
for(nt = line; nt->entry; nt = nt->entry) for(nt = line; nt->entry != nil; nt = nt->entry)
; ;
nt->entry = t; nt->entry = t;
return line; return line;
@ -1671,7 +1681,7 @@ dnsip6lookup(char *mntpt, char *buf, Ndbtuple *t)
* call the dns process and have it try to translate a name * call the dns process and have it try to translate a name
*/ */
Ndbtuple* Ndbtuple*
dnsiplookup(char *host, Ndbs *s) dnsiplookup(char *host, Ndbs *s, int v6)
{ {
char buf[Maxreply]; char buf[Maxreply];
Ndbtuple *t; Ndbtuple *t;
@ -1689,16 +1699,16 @@ dnsiplookup(char *host, Ndbs *s)
else { else {
t = dnsquery(mntpt, host, "ip"); t = dnsquery(mntpt, host, "ip");
/* special case: query ipv6 (AAAA dns RR) too */ /* special case: query ipv6 (AAAA dns RR) too */
if (ipv6lookups) if (v6 && ipv6lookups)
t = dnsip6lookup(mntpt, host, t); t = dnsip6lookup(mntpt, host, t);
} }
s->t = t; s->t = t;
if(t == nil){ if(t == nil){
rerrstr(buf, sizeof buf); rerrstr(buf, sizeof buf);
if(strstr(buf, "exist")) if(strstr(buf, "exist") != nil)
werrstr("can't translate address: %s", buf); werrstr("can't translate address: %s", buf);
else if(strstr(buf, "dns failure")) else if(strstr(buf, "dns failure") != nil)
werrstr("temporary problem: %s", buf); werrstr("temporary problem: %s", buf);
} }
@ -1714,7 +1724,7 @@ qmatch(Ndbtuple *t, char **attr, char **val, int n)
for(i = 1; i < n; i++){ for(i = 1; i < n; i++){
found = 0; found = 0;
for(nt = t; nt; nt = nt->entry) for(nt = t; nt != nil; nt = nt->entry)
if(strcmp(attr[i], nt->attr) == 0) if(strcmp(attr[i], nt->attr) == 0)
if(strcmp(val[i], "*") == 0 if(strcmp(val[i], "*") == 0
|| strcmp(val[i], nt->val) == 0){ || strcmp(val[i], nt->val) == 0){
@ -1734,7 +1744,7 @@ qreply(Mfile *mf, Ndbtuple *t)
String *s; String *s;
s = s_new(); s = s_new();
for(nt = t; mf->nreply < Nreply && nt; nt = nt->entry){ for(nt = t; mf->nreply < Nreply && nt != nil; nt = nt->entry){
s_append(s, nt->attr); s_append(s, nt->attr);
s_append(s, "="); s_append(s, "=");
s_append(s, nt->val); s_append(s, nt->val);
@ -1787,7 +1797,7 @@ genquery(Mfile *mf, char *query)
/* parse pairs */ /* parse pairs */
for(i = 0; i < n; i++){ for(i = 0; i < n; i++){
p = strchr(attr[i], '='); p = strchr(attr[i], '=');
if(p == 0) if(p == nil)
return "bad query"; return "bad query";
*p++ = 0; *p++ = 0;
val[i] = p; val[i] = p;
@ -1795,12 +1805,12 @@ genquery(Mfile *mf, char *query)
/* give dns a chance */ /* give dns a chance */
if((strcmp(attr[0], "dom") == 0 || strcmp(attr[0], "ip") == 0) && val[0]){ if((strcmp(attr[0], "dom") == 0 || strcmp(attr[0], "ip") == 0) && val[0]){
t = dnsiplookup(val[0], &s); t = dnsiplookup(val[0], &s, 1);
if(t){ if(t != nil){
if(qmatch(t, attr, val, n)){ if(qmatch(t, attr, val, n)){
qreply(mf, t); qreply(mf, t);
ndbfree(t); ndbfree(t);
return 0; return nil;
} }
ndbfree(t); ndbfree(t);
} }
@ -1810,11 +1820,11 @@ genquery(Mfile *mf, char *query)
t = ndbsearch(db, &s, attr[0], val[0]); t = ndbsearch(db, &s, attr[0], val[0]);
/* search is the and of all the pairs */ /* search is the and of all the pairs */
while(t){ while(t != nil){
if(qmatch(t, attr, val, n)){ if(qmatch(t, attr, val, n)){
qreply(mf, t); qreply(mf, t);
ndbfree(t); ndbfree(t);
return 0; return nil;
} }
ndbfree(t); ndbfree(t);
@ -1832,7 +1842,7 @@ ipresolve(char *attr, char *host)
{ {
Ndbtuple *t, *nt, **l; Ndbtuple *t, *nt, **l;
t = iplookup(&network[Ntcp], host, "*", 0); t = iplookup(&network[Ntcp], host, "*");
for(l = &t; *l != nil; ){ for(l = &t; *l != nil; ){
nt = *l; nt = *l;
if(strcmp(nt->attr, "ip") != 0){ if(strcmp(nt->attr, "ip") != 0){