diff options
| -rw-r--r-- | sys/src/cmd/ip/dhcp.h | 2 | ||||
| -rw-r--r-- | sys/src/cmd/ip/dhcpd/dhcpd.c | 40 | ||||
| -rw-r--r-- | sys/src/cmd/ip/ipconfig/dhcp.c | 44 | ||||
| -rw-r--r-- | sys/src/cmd/ip/ipconfig/ipconfig.h | 2 | ||||
| -rw-r--r-- | sys/src/cmd/ip/ipconfig/ipv6.c | 60 | ||||
| -rw-r--r-- | sys/src/cmd/ip/ipconfig/main.c | 72 |
6 files changed, 152 insertions, 68 deletions
diff --git a/sys/src/cmd/ip/dhcp.h b/sys/src/cmd/ip/dhcp.h index 59edf4d3b..f69d4502d 100644 --- a/sys/src/cmd/ip/dhcp.h +++ b/sys/src/cmd/ip/dhcp.h @@ -111,6 +111,8 @@ enum ODtftpserver= 66, ODbootfile= 67, + ODdnsdomain= 119, + /* plan9 vendor info options, v4 addresses only (deprecated) */ OP9fsv4= 128, /* plan9 file servers */ OP9authv4= 129, /* plan9 auth servers */ diff --git a/sys/src/cmd/ip/dhcpd/dhcpd.c b/sys/src/cmd/ip/dhcpd/dhcpd.c index f0b24edef..d74e6391c 100644 --- a/sys/src/cmd/ip/dhcpd/dhcpd.c +++ b/sys/src/cmd/ip/dhcpd/dhcpd.c @@ -161,6 +161,7 @@ char *optname[256] = [ODclientid] "cid", [ODtftpserver] "tftpserver", [ODbootfile] "bf", +[ODdnsdomain] "dnsdomain", }; void addropt(Req*, int, uchar*); @@ -177,6 +178,7 @@ void maskopt(Req*, int, uchar*); void miscoptions(Req*, uchar*); int openlisten(char *net); void p9addrsopt(Req *rp, int t, uchar **ip, int i); +void dnsnamesopt(Req *rp, int t, char *attr, Ndbtuple *nt); void parseoptions(Req*); void proto(Req*, int); void rcvdecline(Req*); @@ -1170,6 +1172,7 @@ miscoptions(Req *rp, uchar *ip) a = attr; if(*rp->ii.domain == 0) a[na++] = "dom"; + a[na++] = "dnsdomain"; for(i = 0; i < sizeof(rp->requested); i++) switch(rp->requested[i]){ case OBrouter: @@ -1228,6 +1231,9 @@ miscoptions(Req *rp, uchar *ip) if(p != nil) stringopt(rp, OBdomainname, p+1); break; + case ODdnsdomain: + dnsnamesopt(rp, ODdnsdomain, "dnsdomain", t); + break; case OBnetbiosns: j = lookupserver("wins", addrs, nelem(addrs), t); addrsopt(rp, OBnetbiosns, addrs, j); @@ -1576,6 +1582,40 @@ hexopt(Req *rp, int t, char *str) } void +dnsnamesopt(Req *rp, int t, char *attr, Ndbtuple *nt) +{ + char *s; + uchar *d; + int n, l; + + for(; nt != nil; nt = nt->entry){ + if(strcmp(nt->attr, attr) != 0) + continue; + d = &rp->p[2]; + for(s = nt->val; *s != 0; s++){ + for(l = 0; *s != 0 && *s != '.'; l++) + s++; + if(l > 077) + goto Skip; + d += l+1; + if(d >= rp->max) + return; + d[-l-1] = l; + memmove(d-l, s-l, l); + } + *d++ = 0; + n = d - &rp->p[2]; + if(n > 255) + continue; + rp->p[0] = t; + rp->p[1] = n; + rp->p = d; + op = seprint(op, oe, "%s(%s)", optname[t], nt->val); + Skip:; + } +} + +void arpenter(uchar *ip, uchar *mac, uchar *src) { char buf[256]; diff --git a/sys/src/cmd/ip/ipconfig/dhcp.c b/sys/src/cmd/ip/ipconfig/dhcp.c index a312d2c07..b9453334e 100644 --- a/sys/src/cmd/ip/ipconfig/dhcp.c +++ b/sys/src/cmd/ip/ipconfig/dhcp.c @@ -17,6 +17,7 @@ enum Tbyte, Tulong, Tvec, + Tnames, }; typedef struct Option Option; @@ -107,10 +108,11 @@ static Option option[256] = [ODclientid] { "clientid", Tvec }, [ODtftpserver] { "tftp", Taddr }, [ODbootfile] { "bootfile", Tstr }, +[ODdnsdomain] { "dnsdomain", Tnames }, }; static uchar defrequested[] = { - OBmask, OBrouter, OBdnserver, OBhostname, OBdomainname, OBntpserver, + OBmask, OBrouter, OBdnserver, OBhostname, OBdomainname, ODdnsdomain, OBntpserver, }; static uchar requested[256]; @@ -139,6 +141,7 @@ static uchar* optget(uchar*, int, int*); static ulong optgetulong(uchar*, int); static int optgetvec(uchar*, int, uchar*, int); static char* optgetx(uchar*, uchar); +static int optgetnames(uchar*, int, char*, int); static void getoptions(uchar*); static int parseoptions(uchar *p, int n); @@ -513,10 +516,15 @@ dhcprecv(void) DEBUG("ntp=%I ", conf.ntp + i*IPaddrlen); /* get names */ - optgetstr(bp->optdata, OBhostname, - conf.hostname, sizeof conf.hostname); - optgetstr(bp->optdata, OBdomainname, - conf.domainname, sizeof conf.domainname); + if(optgetstr(bp->optdata, OBhostname, + conf.hostname, sizeof conf.hostname)) + DEBUG("hostname=%s ", conf.hostname); + if(optgetstr(bp->optdata, OBdomainname, + conf.domainname, sizeof conf.domainname)) + DEBUG("domainname=%s ", conf.domainname); + if(optgetnames(bp->optdata, ODdnsdomain, + conf.dnsdomain, sizeof conf.dnsdomain)) + DEBUG("dnsdomain=%s ", conf.dnsdomain); /* get anything else we asked for */ getoptions(bp->optdata); @@ -679,9 +687,8 @@ optget(uchar *p, int op, int *np) continue; } if(np != nil){ - if(*np > len) { + if(*np > len) return 0; - } *np = len; } return p; @@ -799,6 +806,28 @@ optgetstr(uchar *p, int op, char *s, int n) return len; } +static int +optgetnames(uchar *p, int op, char *s, int n) +{ + uchar buf[256]; + int nbuf, len; + + for(nbuf=0;;p+=len,nbuf+=len){ + len = 1; + p = optget(p, op, &len); + if(p == nil) + break; + if(nbuf+len > sizeof(buf)) + return 0; + memmove(buf+nbuf, p, len); + } + if((len = gnames(s, n, buf, nbuf)) < 0){ + memset(s, 0, n); + return 0; + } + return len; +} + int addoption(char *opt) { @@ -865,7 +894,6 @@ optgetx(uchar *p, uchar opt) case Tvec: n = optgetvec(p, opt, vec, sizeof vec); if(n > 0) - /* what's %H? it's not installed */ s = smprint("%s=%.*H", o->name, n, vec); break; } diff --git a/sys/src/cmd/ip/ipconfig/ipconfig.h b/sys/src/cmd/ip/ipconfig/ipconfig.h index 714794726..7210a3112 100644 --- a/sys/src/cmd/ip/ipconfig/ipconfig.h +++ b/sys/src/cmd/ip/ipconfig/ipconfig.h @@ -127,6 +127,8 @@ void catch(void*, char*); int countaddrs(uchar *a, int len); void addaddrs(uchar *to, int nto, uchar *from, int nfrom); void addnames(char *d, char *s, int len); +int pnames(uchar*, int, char*); +int gnames(char*, int, uchar*, int); Ndb* opendatabase(void); void ndb2conf(Ndb *db, uchar *ip); void putndb(void); diff --git a/sys/src/cmd/ip/ipconfig/ipv6.c b/sys/src/cmd/ip/ipconfig/ipv6.c index 652814f12..1c171b3be 100644 --- a/sys/src/cmd/ip/ipconfig/ipv6.c +++ b/sys/src/cmd/ip/ipconfig/ipv6.c @@ -544,66 +544,6 @@ genipmkask(uchar *mask, int len) *mask = ~((1<<(8-len))-1); } -static int -pnames(uchar *d, int nd, char *s) -{ - uchar *de = d + nd; - int l; - - if(nd < 1) - return -1; - for(; *s != 0; s++){ - for(l = 0; *s != 0 && *s != '.' && *s != ' '; l++) - s++; - - d += l+1; - if(d >= de || l > 077) - return -1; - - d[-l-1] = l; - memmove(d-l, s-l, l); - - if(*s != '.') - *d++ = 0; - } - return d - (de - nd); -} - -static int -gnames(char *d, int nd, uchar *s, int ns) -{ - uchar *se = s + ns; - char *de = d + nd; - int l; - - if(nd < 1 || ns < 1) - return -1; - l = *s++ & 077; - while(l > 0){ - if(d + l >= de || s + l >= se) - return -1; - - memmove(d, s, l); - d += l; - s += l; - - l = *s++ & 077; - if(l > 0) - *d++ = '.'; - else { - if(s >= se) - break; - - l = *s++ & 077; - if(l == 0) - break; - *d++ = ' '; - } - } - *d = 0; - return d - (de - nd); -} - typedef struct Route Route; struct Route { diff --git a/sys/src/cmd/ip/ipconfig/main.c b/sys/src/cmd/ip/ipconfig/main.c index a35802048..9f2155ff4 100644 --- a/sys/src/cmd/ip/ipconfig/main.c +++ b/sys/src/cmd/ip/ipconfig/main.c @@ -61,6 +61,7 @@ static void init(void) { srand(truerand()); + fmtinstall('H', encodefmt); fmtinstall('E', eipfmt); fmtinstall('I', eipfmt); fmtinstall('M', eipfmt); @@ -895,6 +896,77 @@ next: } } +int +pnames(uchar *d, int nd, char *s) +{ + uchar *de = d + nd; + int l; + + if(nd < 1) + return -1; + for(; *s != 0; s++){ + for(l = 0; *s != 0 && *s != '.' && *s != ' '; l++) + s++; + + d += l+1; + if(d >= de || l > 077) + return -1; + + d[-l-1] = l; + memmove(d-l, s-l, l); + + if(*s != '.') + *d++ = 0; + } + return d - (de - nd); +} + +int +gnames(char *d, int nd, uchar *s, int ns) +{ + char *de = d + nd; + uchar *se = s + ns; + uchar *c = nil; + int l, p = 0; + + if(ns < 1 || nd < 1) + return -1; + while(s < se){ + l = *s++; + if((l & 0300) == 0300){ + if(++p > 100 || s >= se) + break; + l = (l & 077)<<8 | *s++; + if(c == nil) + c = s; + s = (se - ns) + l; + continue; + } + l &= 077; + if(l == 0){ + if(d <= de - nd) + break; + d[-1] = ' '; + if(c != nil){ + s = c; + c = nil; + p = 0; + } + continue; + } + if(s+l >= se || d+l >= de) + break; + memmove(d, s, l); + s += l; + d += l; + *d++ = '.'; + } + if(p != 0 || s != se || d <= de - nd || d[-1] != ' ') + return -1; + *(--d) = 0; + return d - (de - nd); +} + static Ndbtuple* uniquent(Ndbtuple *t) { |
