xref: /plan9/sys/src/9/boot/bootip.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <ip.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier #include "boot.h"
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier static	uchar	fsip[IPaddrlen];
8*9a747e4fSDavid du Colombier 	uchar	auip[IPaddrlen];
97dd7cddfSDavid du Colombier static	char	mpoint[32];
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier static int isvalidip(uchar*);
127dd7cddfSDavid du Colombier static void netndb(char*, uchar*);
1380ee5cbfSDavid du Colombier static void netenv(char*, uchar*);
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier void
167dd7cddfSDavid du Colombier configip(void)
177dd7cddfSDavid du Colombier {
18*9a747e4fSDavid du Colombier 	int argc, pid;
197dd7cddfSDavid du Colombier 	char **argv, *p;
20*9a747e4fSDavid du Colombier 	Waitmsg *w;
217dd7cddfSDavid du Colombier 	char **arg;
227dd7cddfSDavid du Colombier 	char buf[32];
237dd7cddfSDavid du Colombier 
24*9a747e4fSDavid du Colombier 	fmtinstall('I', eipfmt);
25*9a747e4fSDavid du Colombier 	fmtinstall('M', eipfmt);
26*9a747e4fSDavid du Colombier 	fmtinstall('E', eipfmt);
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier 	arg = malloc((bargc+1) * sizeof(char*));
297dd7cddfSDavid du Colombier 	if(arg == nil)
30*9a747e4fSDavid du Colombier 		fatal("%r");
317dd7cddfSDavid du Colombier 	memmove(arg, bargv, (bargc+1) * sizeof(char*));
327dd7cddfSDavid du Colombier 
337dd7cddfSDavid du Colombier 	argc = bargc;
347dd7cddfSDavid du Colombier 	argv = arg;
357dd7cddfSDavid du Colombier 	strcpy(mpoint, "/net");
367dd7cddfSDavid du Colombier 	ARGBEGIN {
377dd7cddfSDavid du Colombier 	case 'x':
387dd7cddfSDavid du Colombier 		p = ARGF();
397dd7cddfSDavid du Colombier 		if(p != nil)
407dd7cddfSDavid du Colombier 			snprint(mpoint, sizeof(mpoint), "/net%s", p);
417dd7cddfSDavid du Colombier 		break;
427dd7cddfSDavid du Colombier 	case 'g':
437dd7cddfSDavid du Colombier 	case 'b':
447dd7cddfSDavid du Colombier 	case 'h':
457dd7cddfSDavid du Colombier 	case 'm':
467dd7cddfSDavid du Colombier 		p = ARGF();
477dd7cddfSDavid du Colombier 		USED(p);
487dd7cddfSDavid du Colombier 		break;
497dd7cddfSDavid du Colombier 	} ARGEND;
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier 	/* bind in an ip interface */
527dd7cddfSDavid du Colombier 	bind("#I", mpoint, MAFTER);
537dd7cddfSDavid du Colombier 	bind("#l0", mpoint, MAFTER);
547dd7cddfSDavid du Colombier 	bind("#l1", mpoint, MAFTER);
55*9a747e4fSDavid du Colombier 	bind("#l2", mpoint, MAFTER);
56*9a747e4fSDavid du Colombier 	bind("#l3", mpoint, MAFTER);
577dd7cddfSDavid du Colombier 
587dd7cddfSDavid du Colombier 	/* let ipconfig configure the ip interface */
597dd7cddfSDavid du Colombier 	switch(pid = fork()){
607dd7cddfSDavid du Colombier 	case -1:
61*9a747e4fSDavid du Colombier 		fatal("configuring ip: %r");
627dd7cddfSDavid du Colombier 	case 0:
637dd7cddfSDavid du Colombier 		exec("/ipconfig", arg);
647dd7cddfSDavid du Colombier 		fatal("execing /ipconfig");
657dd7cddfSDavid du Colombier 	default:
667dd7cddfSDavid du Colombier 		break;
677dd7cddfSDavid du Colombier 	}
687dd7cddfSDavid du Colombier 
697dd7cddfSDavid du Colombier 	/* wait for ipconfig to finish */
707dd7cddfSDavid du Colombier 	for(;;){
71*9a747e4fSDavid du Colombier 		w = wait();
72*9a747e4fSDavid du Colombier 		if(w != nil && w->pid == pid){
73*9a747e4fSDavid du Colombier 			if(w->msg[0] != 0)
74*9a747e4fSDavid du Colombier 				fatal(w->msg);
75*9a747e4fSDavid du Colombier 			free(w);
767dd7cddfSDavid du Colombier 			break;
77*9a747e4fSDavid du Colombier 		} else if(w == nil)
787dd7cddfSDavid du Colombier 			fatal("configuring ip");
79*9a747e4fSDavid du Colombier 		free(w);
807dd7cddfSDavid du Colombier 	}
817dd7cddfSDavid du Colombier 
827dd7cddfSDavid du Colombier 	/* if we didn't get a file and auth server, query user */
837dd7cddfSDavid du Colombier 	netndb("fs", fsip);
8480ee5cbfSDavid du Colombier 	if(!isvalidip(fsip))
8580ee5cbfSDavid du Colombier 		netenv("fs", fsip);
8680ee5cbfSDavid du Colombier 	while(!isvalidip(fsip)){
877dd7cddfSDavid du Colombier 		buf[0] = 0;
887dd7cddfSDavid du Colombier 		outin("filesystem IP address", buf, sizeof(buf));
897dd7cddfSDavid du Colombier 		parseip(fsip, buf);
907dd7cddfSDavid du Colombier 	}
9180ee5cbfSDavid du Colombier 
9280ee5cbfSDavid du Colombier 	netndb("auth", auip);
9380ee5cbfSDavid du Colombier 	if(!isvalidip(auip))
9480ee5cbfSDavid du Colombier 		netenv("auth", auip);
9580ee5cbfSDavid du Colombier 	while(!isvalidip(auip)){
967dd7cddfSDavid du Colombier 		buf[0] = 0;
977dd7cddfSDavid du Colombier 		outin("authentication server IP address", buf, sizeof(buf));
987dd7cddfSDavid du Colombier 		parseip(auip, buf);
997dd7cddfSDavid du Colombier 	}
1007dd7cddfSDavid du Colombier }
1017dd7cddfSDavid du Colombier 
102*9a747e4fSDavid du Colombier static void
103*9a747e4fSDavid du Colombier setauthaddr(char *proto, int port)
1047dd7cddfSDavid du Colombier {
105*9a747e4fSDavid du Colombier 	char buf[128];
1067dd7cddfSDavid du Colombier 
107*9a747e4fSDavid du Colombier 	snprint(buf, sizeof buf, "%s!%I!%d", proto, auip, port);
108*9a747e4fSDavid du Colombier 	authaddr = strdup(buf);
1097dd7cddfSDavid du Colombier }
1107dd7cddfSDavid du Colombier 
11180ee5cbfSDavid du Colombier void
11280ee5cbfSDavid du Colombier configtcp(Method*)
11380ee5cbfSDavid du Colombier {
114*9a747e4fSDavid du Colombier 	sleep(100);
115*9a747e4fSDavid du Colombier 	print("t");
116*9a747e4fSDavid du Colombier 	sleep(100);
11780ee5cbfSDavid du Colombier 	configip();
118*9a747e4fSDavid du Colombier 	sleep(100);
119*9a747e4fSDavid du Colombier 	print(".");
120*9a747e4fSDavid du Colombier 	sleep(100);
121*9a747e4fSDavid du Colombier 	setauthaddr("tcp", 567);
12280ee5cbfSDavid du Colombier }
12380ee5cbfSDavid du Colombier 
12480ee5cbfSDavid du Colombier int
12580ee5cbfSDavid du Colombier connecttcp(void)
12680ee5cbfSDavid du Colombier {
127*9a747e4fSDavid du Colombier 	char buf[64];
12880ee5cbfSDavid du Colombier 
129*9a747e4fSDavid du Colombier 	snprint(buf, sizeof buf, "tcp!%I!564", fsip);
130*9a747e4fSDavid du Colombier 	return dial(buf, 0, 0, 0);
131*9a747e4fSDavid du Colombier }
132*9a747e4fSDavid du Colombier 
133*9a747e4fSDavid du Colombier void
134*9a747e4fSDavid du Colombier configil(Method*)
135*9a747e4fSDavid du Colombier {
136*9a747e4fSDavid du Colombier 	configip();
137*9a747e4fSDavid du Colombier 	setauthaddr("il", 566);
138*9a747e4fSDavid du Colombier }
139*9a747e4fSDavid du Colombier 
140*9a747e4fSDavid du Colombier int
141*9a747e4fSDavid du Colombier connectil(void)
142*9a747e4fSDavid du Colombier {
143*9a747e4fSDavid du Colombier 	char buf[64];
144*9a747e4fSDavid du Colombier 
145*9a747e4fSDavid du Colombier 	snprint(buf, sizeof buf, "il!%I!17008", fsip);
146*9a747e4fSDavid du Colombier 	return dial(buf, 0, 0, 0);
14780ee5cbfSDavid du Colombier }
14880ee5cbfSDavid du Colombier 
1497dd7cddfSDavid du Colombier static int
1507dd7cddfSDavid du Colombier isvalidip(uchar *ip)
1517dd7cddfSDavid du Colombier {
1527dd7cddfSDavid du Colombier 	if(ipcmp(ip, IPnoaddr) == 0)
1537dd7cddfSDavid du Colombier 		return 0;
1547dd7cddfSDavid du Colombier 	if(ipcmp(ip, v4prefix) == 0)
1557dd7cddfSDavid du Colombier 		return 0;
1567dd7cddfSDavid du Colombier 	return 1;
1577dd7cddfSDavid du Colombier }
1587dd7cddfSDavid du Colombier 
1597dd7cddfSDavid du Colombier static void
16080ee5cbfSDavid du Colombier netenv(char *attr, uchar *ip)
16180ee5cbfSDavid du Colombier {
16280ee5cbfSDavid du Colombier 	int fd, n;
16380ee5cbfSDavid du Colombier 	char buf[128];
16480ee5cbfSDavid du Colombier 
16580ee5cbfSDavid du Colombier 	ipmove(ip, IPnoaddr);
16680ee5cbfSDavid du Colombier 	snprint(buf, sizeof(buf), "#e/%s", attr);
16780ee5cbfSDavid du Colombier 	fd = open(buf, OREAD);
16880ee5cbfSDavid du Colombier 	if(fd < 0)
16980ee5cbfSDavid du Colombier 		return;
17080ee5cbfSDavid du Colombier 
17180ee5cbfSDavid du Colombier 	n = read(fd, buf, sizeof(buf)-1);
17280ee5cbfSDavid du Colombier 	if(n <= 0)
17380ee5cbfSDavid du Colombier 		return;
17480ee5cbfSDavid du Colombier 	buf[n] = 0;
17580ee5cbfSDavid du Colombier 	parseip(ip, buf);
17680ee5cbfSDavid du Colombier }
17780ee5cbfSDavid du Colombier 
17880ee5cbfSDavid du Colombier static void
1797dd7cddfSDavid du Colombier netndb(char *attr, uchar *ip)
1807dd7cddfSDavid du Colombier {
1817dd7cddfSDavid du Colombier 	int fd, n, c;
1827dd7cddfSDavid du Colombier 	char buf[1024];
1837dd7cddfSDavid du Colombier 	char *p;
1847dd7cddfSDavid du Colombier 
1857dd7cddfSDavid du Colombier 	ipmove(ip, IPnoaddr);
1867dd7cddfSDavid du Colombier 	snprint(buf, sizeof(buf), "%s/ndb", mpoint);
1877dd7cddfSDavid du Colombier 	fd = open(buf, OREAD);
1887dd7cddfSDavid du Colombier 	if(fd < 0)
1897dd7cddfSDavid du Colombier 		return;
1907dd7cddfSDavid du Colombier 	n = read(fd, buf, sizeof(buf)-1);
1917dd7cddfSDavid du Colombier 	close(fd);
1927dd7cddfSDavid du Colombier 	if(n <= 0)
1937dd7cddfSDavid du Colombier 		return;
1947dd7cddfSDavid du Colombier 	buf[n] = 0;
1957dd7cddfSDavid du Colombier 	n = strlen(attr);
1967dd7cddfSDavid du Colombier 	for(p = buf;;){
1977dd7cddfSDavid du Colombier 		p = strstr(p, attr);
1987dd7cddfSDavid du Colombier 		if(p == nil)
1997dd7cddfSDavid du Colombier 			break;
2007dd7cddfSDavid du Colombier 		c = *(p-1);
2017dd7cddfSDavid du Colombier 		if(*(p + n) == '=' && (p == buf || c == '\n' || c == ' ' || c == '\t')){
2027dd7cddfSDavid du Colombier 			p += n+1;
2037dd7cddfSDavid du Colombier 			parseip(ip, p);
20480ee5cbfSDavid du Colombier 			return;
2057dd7cddfSDavid du Colombier 		}
2067dd7cddfSDavid du Colombier 		p++;
2077dd7cddfSDavid du Colombier 	}
20880ee5cbfSDavid du Colombier 	return;
2097dd7cddfSDavid du Colombier }
210