shithub: riscv

Download patch

ref: a630e17bd7d77df2b88ee3995e35ed1b88f00830
parent: 0e516cbf488a9ec8edae3dc6efca2baa0c3d95bd
author: cinap_lenrek <[email protected]>
date: Sun May 8 02:05:25 EDT 2016

ip/ipconfig, ip/ppp: preserve preexisting entries when writing /net/ndb

it is now possible to configure additional interfaces (like wifi)
and store the network information while preserving old entries
in /net/ndb. this allows to easily switch from ethernet to wifi
and have dhcp configure dns without having to clear /net/ndb.

--- a/sys/src/cmd/ip/ipconfig/ipconfig.h
+++ b/sys/src/cmd/ip/ipconfig/ipconfig.h
@@ -108,7 +108,6 @@
 void	doadd(int);
 void	doremove(void);
 void	dounbind(void);
-int	getndb(void);
 int	ipconfig4(void);
 int	ipconfig6(int);
 long	jitter(void);
@@ -134,11 +133,9 @@
 void	procsetname(char *fmt, ...);
 void	putndb(void);
 ulong	randint(ulong low, ulong hi);
-void	tweakservers(void);
 void	usage(void);
 int	validip(uchar*);
 void	warning(char *fmt, ...);
-void	writendb(char*, int, int);
 
 /*
  * IPv6
--- a/sys/src/cmd/ip/ipconfig/main.c
+++ b/sys/src/cmd/ip/ipconfig/main.c
@@ -188,7 +188,6 @@
 void	doadd(int);
 void	doremove(void);
 void	dounbind(void);
-int	getndb(void);
 void	getoptions(uchar*);
 int	ip4cfg(void);
 int	ip6cfg(int a);
@@ -217,10 +216,8 @@
 int	parseverb(char*);
 void	pppbinddev(void);
 void	putndb(void);
-void	tweakservers(void);
 void	usage(void);
 int	validip(uchar*);
-void	writendb(char*, int, int);
 
 void
 usage(void)
@@ -593,23 +590,6 @@
 	exits(0);
 }
 
-int
-havendb(char *net)
-{
-	Dir *d;
-	char buf[128];
-
-	snprint(buf, sizeof buf, "%s/ndb", net);
-	if((d = dirstat(buf)) == nil)
-		return 0;
-	if(d->length == 0){
-		free(d);
-		return 0;
-	}
-	free(d);
-	return 1;
-}
-
 void
 doadd(int retry)
 {
@@ -619,7 +599,7 @@
 
 	/* get number of preexisting interfaces */
 	nip = nipifcs(conf.mpoint);
-	if(beprimary == -1 && (nip == 0 || !havendb(conf.mpoint)))
+	if(beprimary == -1 && nip == 0)
 		beprimary = 1;
 
 	/* get ipifc into name space and condition device for ip */
@@ -659,17 +639,17 @@
 		} else
 			sysfatal("no success with DHCP");
 
-	if(!noconfig)
-		if(ip4cfg() < 0)
-			sysfatal("can't start ip");
-		else if(dodhcp && conf.lease != Lforever)
-			dhcpwatch(0);
+	if(noconfig)
+		return;
 
+	if(ip4cfg() < 0)
+		sysfatal("can't start ip");
+	else if(dodhcp && conf.lease != Lforever)
+		dhcpwatch(0);
+
 	/* leave everything we've learned somewhere other procs can find it */
-	if(beprimary == 1){
+	if(beprimary)
 		putndb();
-		tweakservers();
-	}
 }
 
 void
@@ -893,10 +873,6 @@
 	ipmove(conf.laddr, IPnoaddr);
 	ipmove(conf.raddr, IPnoaddr);
 	ipmove(conf.mask, IPnoaddr);
-
-	/* forget configuration info */
-	if(beprimary==1)
-		writendb("", 0, 0);
 }
 
 void
@@ -1015,10 +991,8 @@
 			 * leave everything we've learned somewhere that
 			 * other procs can find it.
 			 */
-			if(beprimary==1){
+			if(beprimary)
 				putndb();
-				tweakservers();
-			}
 		}
 	}
 }
@@ -1656,23 +1630,6 @@
 	return bp;
 }
 
-/* write out an ndb entry */
-void
-writendb(char *s, int n, int append)
-{
-	char file[64];
-	int fd;
-
-	snprint(file, sizeof file, "%s/ndb", conf.mpoint);
-	if(append){
-		fd = open(file, OWRITE);
-		seek(fd, 0, 2);
-	} else
-		fd = open(file, OWRITE|OTRUNC);
-	write(fd, s, n);
-	close(fd);
-}
-
 /* put server addresses into the ndb entry */
 char*
 putaddrs(char *p, char *e, char *attr, uchar *a, int len)
@@ -1688,19 +1645,16 @@
 void
 putndb(void)
 {
-	int append;
-	char buf[1024];
-	char *p, *e, *np;
+	static char buf[16*1024];
+	char file[64], *p, *e, *np;
+	Ndbtuple *t, *nt;
+	Ndb *db;
+	int fd;
 
 	p = buf;
 	e = buf + sizeof buf;
-	if(getndb() == 0)
-		append = 1;
-	else {
-		append = 0;
-		p = seprint(p, e, "ip=%I ipmask=%M ipgw=%I\n",
-			conf.laddr, conf.mask, conf.gaddr);
-	}
+	p = seprint(p, e, "ip=%I ipmask=%M ipgw=%I\n",
+		conf.laddr, conf.mask, conf.gaddr);
 	if(np = strchr(conf.hostname, '.')){
 		if(*conf.domainname == 0)
 			strcpy(conf.domainname, np+1);
@@ -1721,54 +1675,41 @@
 		p = putaddrs(p, e, "\tntp", conf.ntp, sizeof conf.ntp);
 	if(ndboptions)
 		p = seprint(p, e, "%s\n", ndboptions);
-	if(p > buf)
-		writendb(buf, p-buf, append);
-}
 
-/* get an ndb entry someone else wrote */
-int
-getndb(void)
-{
-	char buf[1024];
-	int fd, n;
-	char *p;
+	/* append preexisting entries not matching our ip */
+	snprint(file, sizeof file, "%s/ndb", conf.mpoint);
+	db = ndbopen(file);
+	if(db != nil ){
+		while((t = ndbparse(db)) != nil){
+			uchar ip[IPaddrlen];
 
-	snprint(buf, sizeof buf, "%s/ndb", conf.mpoint);
-	fd = open(buf, OREAD);
-	n = read(fd, buf, sizeof buf-1);
-	close(fd);
-	if(n <= 0)
-		return -1;
-	buf[n] = 0;
-	p = strstr(buf, "ip=");
-	if(p == nil)
-		return -1;
-	if (parseip(conf.laddr, p+3) == -1)
-		fprint(2, "%s: bad address %s\n", argv0, p+3);
-	return 0;
-}
+			if((nt = ndbfindattr(t, t, "ip")) == nil
+			|| parseip(ip, nt->val) < 0 || ipcmp(ip, conf.laddr) != 0){
+				p = seprint(p, e, "\n");
+				for(nt = t; nt != nil; nt = nt->entry)
+					p = seprint(p, e, "%s=%s%s", nt->attr, nt->val,
+						nt->entry==nil? "\n": nt->line!=nt->entry? "\n\t": " ");
+			}
+			ndbfree(t);
+		}
+		ndbclose(db);
+	}
 
-/* tell a server to refresh */
-void
-tweakserver(char *server)
-{
-	int fd;
-	char file[64];
-
-	snprint(file, sizeof file, "%s/%s", conf.mpoint, server);
-	fd = open(file, ORDWR);
-	if(fd < 0)
+	if((fd = open(file, OWRITE|OTRUNC)) < 0)
 		return;
-	fprint(fd, "refresh");
+	write(fd, buf, p-buf);
 	close(fd);
-}
 
-/* tell all servers to refresh their information */
-void
-tweakservers(void)
-{
-	tweakserver("dns");
-	tweakserver("cs");
+	snprint(file, sizeof file, "%s/cs", conf.mpoint);
+	if((fd = open(file, OWRITE)) >= 0){
+		write(fd, "refresh", 7);
+		close(fd);
+	}
+	snprint(file, sizeof file, "%s/dns", conf.mpoint);
+	if((fd = open(file, OWRITE)) >= 0){
+		write(fd, "refresh", 7);
+		close(fd);
+	}
 }
 
 /* return number of networks */
--- a/sys/src/cmd/ip/ipconfig/ppp.c
+++ b/sys/src/cmd/ip/ipconfig/ppp.c
@@ -14,11 +14,6 @@
 	Waitmsg *w;
 
 	/* ppp does the binding */
-
-	/* start with an empty config file */
-	if(nip == 0)
-		writendb("", 0, 0);
-
 	switch(pid = rfork(RFPROC|RFFDG|RFMEM)){
 	case -1:
 		sysfatal("can't start ppp: %r");
@@ -55,6 +50,5 @@
 
 	/* ppp sets up the configuration itself */
 	noconfig = 1;
-	getndb();
 }
 
--- a/sys/src/cmd/ip/ppp/ppp.c
+++ b/sys/src/cmd/ip/ppp/ppp.c
@@ -2847,10 +2847,9 @@
 	/* wait until ip is configured */
 	rendezvous((void*)Rmagic, 0);
 
-	if(primary){
-		/* create a /net/ndb entry */
+	/* create a /net/ndb entry */
+	if(primary)
 		putndb(ppp, net);
-	}
 
 	exits(0);
 }
@@ -2917,15 +2916,16 @@
 static void
 putndb(PPP *ppp, char *net)
 {
-	char buf[1024];
-	char file[64];
-	char *p, *e;
+	static char buf[16*1024];
+	char file[64], *p, *e;
+	Ndbtuple *t, *nt;
+	Ndb *db;
 	int fd;
 
 	e = buf + sizeof(buf);
 	p = buf;
-	p = seprint(p, e, "ip=%I ipmask=255.255.255.255 ipgw=%I\n", ppp->local,
-			ppp->remote);
+	p = seprint(p, e, "ip=%I ipmask=255.255.255.255 ipgw=%I\n",
+		ppp->local, ppp->remote);
 	if(validv4(ppp->dns[0]))
 		p = seprint(p, e, "\tdns=%I\n", ppp->dns[0]);
 	if(validv4(ppp->dns[1]))
@@ -2934,20 +2934,41 @@
 		p = seprint(p, e, "\twins=%I\n", ppp->wins[0]);
 	if(validv4(ppp->wins[1]))
 		p = seprint(p, e, "\twins=%I\n", ppp->wins[1]);
-	seprint(file, file+sizeof file, "%s/ndb", net);
-	fd = open(file, OWRITE);
-	if(fd < 0)
+
+	/* append preexisting entries not matching our ip */
+	snprint(file, sizeof file, "%s/ndb", net);
+	db = ndbopen(file);
+	if(db != nil ){
+		while((t = ndbparse(db)) != nil){
+			uchar ip[IPaddrlen];
+
+			if((nt = ndbfindattr(t, t, "ip")) == nil
+			|| parseip(ip, nt->val) < 0 || ipcmp(ip, ppp->local) != 0){
+				p = seprint(p, e, "\n");
+				for(nt = t; nt != nil; nt = nt->entry)
+					p = seprint(p, e, "%s=%s%s", nt->attr, nt->val,
+						nt->entry==nil? "\n": nt->line!=nt->entry? "\n\t": " ");
+			}
+			ndbfree(t);
+		}
+		ndbclose(db);
+	}
+
+	if((fd = open(file, OWRITE|OTRUNC)) < 0)
 		return;
 	write(fd, buf, p-buf);
 	close(fd);
-	seprint(file, file+sizeof file, "%s/cs", net);
-	fd = open(file, OWRITE);
-	write(fd, "refresh", 7);
-	close(fd);
-	seprint(file, file+sizeof file, "%s/dns", net);
-	fd = open(file, OWRITE);
-	write(fd, "refresh", 7);
-	close(fd);
+
+	snprint(file, sizeof file, "%s/cs", net);
+	if((fd = open(file, OWRITE)) >= 0){
+		write(fd, "refresh", 7);
+		close(fd);
+	}
+	snprint(file, sizeof file, "%s/dns", net);
+	if((fd = open(file, OWRITE)) >= 0){
+		write(fd, "refresh", 7);
+		close(fd);
+	}
 }
 
 static void