diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-09-25 15:02:29 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-09-25 15:02:29 +0200 |
commit | 12b3c82014efd24fa57037c001c7d3ce78204e5a (patch) | |
tree | d99820e4cc013dce4b69497fe94db256cfd3b229 /sys | |
parent | 2f076f946fe7a5409cda7d83af5585442b294ec8 (diff) |
ip/ipconfig: implement rfc3397 dhcp dns search option (dnsdomain)
Diffstat (limited to 'sys')
-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 |
4 files changed, 110 insertions, 68 deletions
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) { |