ref: 12b3c82014efd24fa57037c001c7d3ce78204e5a
parent: 2f076f946fe7a5409cda7d83af5585442b294ec8
author: cinap_lenrek <[email protected]>
date: Tue Sep 25 11:02:29 EDT 2018
ip/ipconfig: implement rfc3397 dhcp dns search option (dnsdomain)
--- a/sys/src/cmd/ip/ipconfig/dhcp.c
+++ b/sys/src/cmd/ip/ipconfig/dhcp.c
@@ -17,6 +17,7 @@
Tbyte,
Tulong,
Tvec,
+ Tnames,
};
typedef struct Option Option;
@@ -107,10 +108,11 @@
[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 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 @@
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 @@
continue;
}
if(np != nil){
- if(*np > len) {
+ if(*np > len)
return 0;
- }
*np = len;
}
return p;
@@ -799,6 +806,28 @@
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 @@
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;
}
--- a/sys/src/cmd/ip/ipconfig/ipconfig.h
+++ b/sys/src/cmd/ip/ipconfig/ipconfig.h
@@ -127,6 +127,8 @@
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);
--- a/sys/src/cmd/ip/ipconfig/ipv6.c
+++ b/sys/src/cmd/ip/ipconfig/ipv6.c
@@ -544,66 +544,6 @@
*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
{
--- a/sys/src/cmd/ip/ipconfig/main.c
+++ b/sys/src/cmd/ip/ipconfig/main.c
@@ -61,6 +61,7 @@
init(void)
{
srand(truerand());
+ fmtinstall('H', encodefmt);
fmtinstall('E', eipfmt);
fmtinstall('I', eipfmt);
fmtinstall('M', eipfmt);
@@ -893,6 +894,77 @@
if(*s == 0)
break;
}
+}
+
+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*