ref: d2b3e2f55a52df45c8e9c0b043763809f0001e69
parent: 72a840b31dd2ffc600dcffec7170eef76d7bb5ee
parent: dbfb76673539e5b59dac437c6b2a2159c896731c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Sep 25 11:06:13 EDT 2018
merge
--- a/sys/src/cmd/ip/dhcp.h
+++ b/sys/src/cmd/ip/dhcp.h
@@ -111,6 +111,8 @@
ODtftpserver= 66,
ODbootfile= 67,
+ ODdnsdomain= 119,
+
/* plan9 vendor info options, v4 addresses only (deprecated) */
OP9fsv4= 128, /* plan9 file servers */
OP9authv4= 129, /* plan9 auth servers */
--- a/sys/src/cmd/ip/dhcpd/dhcpd.c
+++ b/sys/src/cmd/ip/dhcpd/dhcpd.c
@@ -161,6 +161,7 @@
[ODclientid] "cid",
[ODtftpserver] "tftpserver",
[ODbootfile] "bf",
+[ODdnsdomain] "dnsdomain",
};
void addropt(Req*, int, uchar*);
@@ -177,6 +178,7 @@
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 @@
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 @@
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);
@@ -1573,6 +1579,40 @@
}
op = seprint(op, oe, "%s(%s)", optname[t], 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
--- 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*
--
⑨