xref: /plan9/sys/src/9/boot/aux.c (revision 38ebe9496608d2f0e2b0fa51d807d7e59b654781)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <../boot/boot.h>
43e12c5d1SDavid du Colombier 
5208510e1SDavid du Colombier /*
63e12c5d1SDavid du Colombier int
73e12c5d1SDavid du Colombier plumb(char *dir, char *dest, int *efd, char *here)
83e12c5d1SDavid du Colombier {
93e12c5d1SDavid du Colombier 	char buf[128];
103e12c5d1SDavid du Colombier 	char name[128];
113e12c5d1SDavid du Colombier 	int n;
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier 	sprint(name, "%s/clone", dir);
143e12c5d1SDavid du Colombier 	efd[0] = open(name, ORDWR);
153e12c5d1SDavid du Colombier 	if(efd[0] < 0)
163e12c5d1SDavid du Colombier 		return -1;
173e12c5d1SDavid du Colombier 	n = read(efd[0], buf, sizeof(buf)-1);
183e12c5d1SDavid du Colombier 	if(n < 0){
193e12c5d1SDavid du Colombier 		close(efd[0]);
203e12c5d1SDavid du Colombier 		return -1;
213e12c5d1SDavid du Colombier 	}
223e12c5d1SDavid du Colombier 	buf[n] = 0;
233e12c5d1SDavid du Colombier 	sprint(name, "%s/%s/data", dir, buf);
243e12c5d1SDavid du Colombier 	if(here){
253e12c5d1SDavid du Colombier 		sprint(buf, "announce %s", here);
263e12c5d1SDavid du Colombier 		if(sendmsg(efd[0], buf) < 0){
273e12c5d1SDavid du Colombier 			close(efd[0]);
283e12c5d1SDavid du Colombier 			return -1;
293e12c5d1SDavid du Colombier 		}
303e12c5d1SDavid du Colombier 	}
313e12c5d1SDavid du Colombier 	sprint(buf, "connect %s", dest);
323e12c5d1SDavid du Colombier 	if(sendmsg(efd[0], buf) < 0){
333e12c5d1SDavid du Colombier 		close(efd[0]);
343e12c5d1SDavid du Colombier 		return -1;
353e12c5d1SDavid du Colombier 	}
363e12c5d1SDavid du Colombier 	efd[1] = open(name, ORDWR);
373e12c5d1SDavid du Colombier 	if(efd[1] < 0){
383e12c5d1SDavid du Colombier 		close(efd[0]);
393e12c5d1SDavid du Colombier 		return -1;
403e12c5d1SDavid du Colombier 	}
413e12c5d1SDavid du Colombier 	return efd[1];
423e12c5d1SDavid du Colombier }
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier int
453e12c5d1SDavid du Colombier sendmsg(int fd, char *msg)
463e12c5d1SDavid du Colombier {
473e12c5d1SDavid du Colombier 	int n;
483e12c5d1SDavid du Colombier 
493e12c5d1SDavid du Colombier 	n = strlen(msg);
503e12c5d1SDavid du Colombier 	if(write(fd, msg, n) != n)
513e12c5d1SDavid du Colombier 		return -1;
523e12c5d1SDavid du Colombier 	return 0;
533e12c5d1SDavid du Colombier }
548c055935SDavid du Colombier  */
553e12c5d1SDavid du Colombier 
563e12c5d1SDavid du Colombier void
warning(char * s)573e12c5d1SDavid du Colombier warning(char *s)
583e12c5d1SDavid du Colombier {
599a747e4fSDavid du Colombier 	char buf[ERRMAX];
609a747e4fSDavid du Colombier 
619a747e4fSDavid du Colombier 	buf[0] = '\0';
629a747e4fSDavid du Colombier 	errstr(buf, sizeof buf);
639a747e4fSDavid du Colombier 	fprint(2, "boot: %s: %s\n", s, buf);
643e12c5d1SDavid du Colombier }
653e12c5d1SDavid du Colombier 
663e12c5d1SDavid du Colombier void
fatal(char * s)673e12c5d1SDavid du Colombier fatal(char *s)
683e12c5d1SDavid du Colombier {
69*38ebe949SDavid du Colombier 	char *msg;
709a747e4fSDavid du Colombier 	char buf[ERRMAX];
719a747e4fSDavid du Colombier 
729a747e4fSDavid du Colombier 	buf[0] = '\0';
739a747e4fSDavid du Colombier 	errstr(buf, sizeof buf);
74*38ebe949SDavid du Colombier 	msg = smprint("%s: %s", s, buf);
75*38ebe949SDavid du Colombier 	fprint(2, "boot: %s\n", msg);
76*38ebe949SDavid du Colombier 	exits(msg);			/* this will trigger a panic */
773e12c5d1SDavid du Colombier }
783e12c5d1SDavid du Colombier 
793e12c5d1SDavid du Colombier int
readfile(char * name,char * buf,int len)803e12c5d1SDavid du Colombier readfile(char *name, char *buf, int len)
813e12c5d1SDavid du Colombier {
823e12c5d1SDavid du Colombier 	int f, n;
833e12c5d1SDavid du Colombier 
843e12c5d1SDavid du Colombier 	buf[0] = 0;
853e12c5d1SDavid du Colombier 	f = open(name, OREAD);
863e12c5d1SDavid du Colombier 	if(f < 0)
873e12c5d1SDavid du Colombier 		return -1;
883e12c5d1SDavid du Colombier 	n = read(f, buf, len-1);
893e12c5d1SDavid du Colombier 	if(n >= 0)
903e12c5d1SDavid du Colombier 		buf[n] = 0;
913e12c5d1SDavid du Colombier 	close(f);
923e12c5d1SDavid du Colombier 	return 0;
933e12c5d1SDavid du Colombier }
943e12c5d1SDavid du Colombier 
95219b2ee8SDavid du Colombier int
writefile(char * name,char * buf,int len)96219b2ee8SDavid du Colombier writefile(char *name, char *buf, int len)
97219b2ee8SDavid du Colombier {
98219b2ee8SDavid du Colombier 	int f, n;
99219b2ee8SDavid du Colombier 
100219b2ee8SDavid du Colombier 	f = open(name, OWRITE);
101219b2ee8SDavid du Colombier 	if(f < 0)
102219b2ee8SDavid du Colombier 		return -1;
103219b2ee8SDavid du Colombier 	n = write(f, buf, len);
104219b2ee8SDavid du Colombier 	close(f);
105219b2ee8SDavid du Colombier 	return (n != len) ? -1 : 0;
106219b2ee8SDavid du Colombier }
107219b2ee8SDavid du Colombier 
1083e12c5d1SDavid du Colombier void
setenv(char * name,char * val)1093e12c5d1SDavid du Colombier setenv(char *name, char *val)
1103e12c5d1SDavid du Colombier {
1113e12c5d1SDavid du Colombier 	int f;
1129a747e4fSDavid du Colombier 	char ename[64];
1133e12c5d1SDavid du Colombier 
1149a747e4fSDavid du Colombier 	snprint(ename, sizeof ename, "#e/%s", name);
1153e12c5d1SDavid du Colombier 	f = create(ename, 1, 0666);
11667031067SDavid du Colombier 	if(f < 0){
11767031067SDavid du Colombier 		fprint(2, "create %s: %r\n", ename);
1183e12c5d1SDavid du Colombier 		return;
11967031067SDavid du Colombier 	}
1203e12c5d1SDavid du Colombier 	write(f, val, strlen(val));
1213e12c5d1SDavid du Colombier 	close(f);
1223e12c5d1SDavid du Colombier }
1233e12c5d1SDavid du Colombier 
1243e12c5d1SDavid du Colombier void
srvcreate(char * name,int fd)1253e12c5d1SDavid du Colombier srvcreate(char *name, int fd)
1263e12c5d1SDavid du Colombier {
1273e12c5d1SDavid du Colombier 	char *srvname;
1283e12c5d1SDavid du Colombier 	int f;
1299a747e4fSDavid du Colombier 	char buf[64];
1303e12c5d1SDavid du Colombier 
1313e12c5d1SDavid du Colombier 	srvname = strrchr(name, '/');
1323e12c5d1SDavid du Colombier 	if(srvname)
1333e12c5d1SDavid du Colombier 		srvname++;
1343e12c5d1SDavid du Colombier 	else
1353e12c5d1SDavid du Colombier 		srvname = name;
1363e12c5d1SDavid du Colombier 
1379a747e4fSDavid du Colombier 	snprint(buf, sizeof buf, "#s/%s", srvname);
1383e12c5d1SDavid du Colombier 	f = create(buf, 1, 0666);
1393e12c5d1SDavid du Colombier 	if(f < 0)
1403e12c5d1SDavid du Colombier 		fatal(buf);
1413e12c5d1SDavid du Colombier 	sprint(buf, "%d", fd);
1423e12c5d1SDavid du Colombier 	if(write(f, buf, strlen(buf)) != strlen(buf))
1433e12c5d1SDavid du Colombier 		fatal("write");
1443e12c5d1SDavid du Colombier 	close(f);
1453e12c5d1SDavid du Colombier }
1463e12c5d1SDavid du Colombier 
14767031067SDavid du Colombier void
catchint(void * a,char * note)148219b2ee8SDavid du Colombier catchint(void *a, char *note)
149219b2ee8SDavid du Colombier {
150219b2ee8SDavid du Colombier 	USED(a);
151219b2ee8SDavid du Colombier 	if(strcmp(note, "alarm") == 0)
15267031067SDavid du Colombier 		noted(NCONT);
15367031067SDavid du Colombier 	noted(NDFLT);
154219b2ee8SDavid du Colombier }
155219b2ee8SDavid du Colombier 
1563e12c5d1SDavid du Colombier int
outin(char * prompt,char * def,int len)1577dd7cddfSDavid du Colombier outin(char *prompt, char *def, int len)
1583e12c5d1SDavid du Colombier {
1593e12c5d1SDavid du Colombier 	int n;
1603e12c5d1SDavid du Colombier 	char buf[256];
1613e12c5d1SDavid du Colombier 
16267031067SDavid du Colombier 	if(len >= sizeof buf)
16367031067SDavid du Colombier 		len = sizeof(buf)-1;
16467031067SDavid du Colombier 
16567031067SDavid du Colombier 	if(cpuflag){
16667031067SDavid du Colombier 		notify(catchint);
167219b2ee8SDavid du Colombier 		alarm(15*1000);
16867031067SDavid du Colombier 	}
169219b2ee8SDavid du Colombier 	print("%s[%s]: ", prompt, *def ? def : "no default");
17067031067SDavid du Colombier 	memset(buf, 0, sizeof buf);
171219b2ee8SDavid du Colombier 	n = read(0, buf, len);
17267031067SDavid du Colombier 	if(cpuflag){
173219b2ee8SDavid du Colombier 		alarm(0);
17467031067SDavid du Colombier 		notify(0);
17567031067SDavid du Colombier 	}
17667031067SDavid du Colombier 
1773e12c5d1SDavid du Colombier 	if(n < 0)
178219b2ee8SDavid du Colombier 		return 1;
17967031067SDavid du Colombier 	if(n > 1){
1803e12c5d1SDavid du Colombier 		buf[n-1] = 0;
1813e12c5d1SDavid du Colombier 		strcpy(def, buf);
1823e12c5d1SDavid du Colombier 	}
1833e12c5d1SDavid du Colombier 	return n;
1843e12c5d1SDavid du Colombier }
185