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
parent
58a0db935c
commit
75a8003a8a
|
@ -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
|
||||||
|
@ -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){
|
||||||
|
|
Loading…
Reference in New Issue