xref: /plan9/sys/src/9/boot/aux.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <../boot/boot.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier int
63e12c5d1SDavid du Colombier plumb(char *dir, char *dest, int *efd, char *here)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	char buf[128];
93e12c5d1SDavid du Colombier 	char name[128];
103e12c5d1SDavid du Colombier 	int n;
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier 	sprint(name, "%s/clone", dir);
133e12c5d1SDavid du Colombier 	efd[0] = open(name, ORDWR);
143e12c5d1SDavid du Colombier 	if(efd[0] < 0)
153e12c5d1SDavid du Colombier 		return -1;
163e12c5d1SDavid du Colombier 	n = read(efd[0], buf, sizeof(buf)-1);
173e12c5d1SDavid du Colombier 	if(n < 0){
183e12c5d1SDavid du Colombier 		close(efd[0]);
193e12c5d1SDavid du Colombier 		return -1;
203e12c5d1SDavid du Colombier 	}
213e12c5d1SDavid du Colombier 	buf[n] = 0;
223e12c5d1SDavid du Colombier 	sprint(name, "%s/%s/data", dir, buf);
233e12c5d1SDavid du Colombier 	if(here){
243e12c5d1SDavid du Colombier 		sprint(buf, "announce %s", here);
253e12c5d1SDavid du Colombier 		if(sendmsg(efd[0], buf) < 0){
263e12c5d1SDavid du Colombier 			close(efd[0]);
273e12c5d1SDavid du Colombier 			return -1;
283e12c5d1SDavid du Colombier 		}
293e12c5d1SDavid du Colombier 	}
303e12c5d1SDavid du Colombier 	sprint(buf, "connect %s", dest);
313e12c5d1SDavid du Colombier 	if(sendmsg(efd[0], buf) < 0){
323e12c5d1SDavid du Colombier 		close(efd[0]);
333e12c5d1SDavid du Colombier 		return -1;
343e12c5d1SDavid du Colombier 	}
353e12c5d1SDavid du Colombier 	efd[1] = open(name, ORDWR);
363e12c5d1SDavid du Colombier 	if(efd[1] < 0){
373e12c5d1SDavid du Colombier 		close(efd[0]);
383e12c5d1SDavid du Colombier 		return -1;
393e12c5d1SDavid du Colombier 	}
403e12c5d1SDavid du Colombier 	return efd[1];
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier 
433e12c5d1SDavid du Colombier int
443e12c5d1SDavid du Colombier sendmsg(int fd, char *msg)
453e12c5d1SDavid du Colombier {
463e12c5d1SDavid du Colombier 	int n;
473e12c5d1SDavid du Colombier 
483e12c5d1SDavid du Colombier 	n = strlen(msg);
493e12c5d1SDavid du Colombier 	if(write(fd, msg, n) != n)
503e12c5d1SDavid du Colombier 		return -1;
513e12c5d1SDavid du Colombier 	return 0;
523e12c5d1SDavid du Colombier }
533e12c5d1SDavid du Colombier 
543e12c5d1SDavid du Colombier void
553e12c5d1SDavid du Colombier warning(char *s)
563e12c5d1SDavid du Colombier {
57*9a747e4fSDavid du Colombier 	char buf[ERRMAX];
58*9a747e4fSDavid du Colombier 
59*9a747e4fSDavid du Colombier 	buf[0] = '\0';
60*9a747e4fSDavid du Colombier 	errstr(buf, sizeof buf);
61*9a747e4fSDavid du Colombier 	fprint(2, "boot: %s: %s\n", s, buf);
623e12c5d1SDavid du Colombier }
633e12c5d1SDavid du Colombier 
643e12c5d1SDavid du Colombier void
653e12c5d1SDavid du Colombier fatal(char *s)
663e12c5d1SDavid du Colombier {
67*9a747e4fSDavid du Colombier 	char buf[ERRMAX];
68*9a747e4fSDavid du Colombier 
69*9a747e4fSDavid du Colombier 	buf[0] = '\0';
70*9a747e4fSDavid du Colombier 	errstr(buf, sizeof buf);
71*9a747e4fSDavid du Colombier 	fprint(2, "boot: %s: %s\n", s, buf);
723e12c5d1SDavid du Colombier 	exits(0);
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier 
753e12c5d1SDavid du Colombier int
763e12c5d1SDavid du Colombier readfile(char *name, char *buf, int len)
773e12c5d1SDavid du Colombier {
783e12c5d1SDavid du Colombier 	int f, n;
793e12c5d1SDavid du Colombier 
803e12c5d1SDavid du Colombier 	buf[0] = 0;
813e12c5d1SDavid du Colombier 	f = open(name, OREAD);
823e12c5d1SDavid du Colombier 	if(f < 0)
833e12c5d1SDavid du Colombier 		return -1;
843e12c5d1SDavid du Colombier 	n = read(f, buf, len-1);
853e12c5d1SDavid du Colombier 	if(n >= 0)
863e12c5d1SDavid du Colombier 		buf[n] = 0;
873e12c5d1SDavid du Colombier 	close(f);
883e12c5d1SDavid du Colombier 	return 0;
893e12c5d1SDavid du Colombier }
903e12c5d1SDavid du Colombier 
91219b2ee8SDavid du Colombier int
92219b2ee8SDavid du Colombier writefile(char *name, char *buf, int len)
93219b2ee8SDavid du Colombier {
94219b2ee8SDavid du Colombier 	int f, n;
95219b2ee8SDavid du Colombier 
96219b2ee8SDavid du Colombier 	f = open(name, OWRITE);
97219b2ee8SDavid du Colombier 	if(f < 0)
98219b2ee8SDavid du Colombier 		return -1;
99219b2ee8SDavid du Colombier 	n = write(f, buf, len);
100219b2ee8SDavid du Colombier 	close(f);
101219b2ee8SDavid du Colombier 	return (n != len) ? -1 : 0;
102219b2ee8SDavid du Colombier }
103219b2ee8SDavid du Colombier 
1043e12c5d1SDavid du Colombier void
1053e12c5d1SDavid du Colombier setenv(char *name, char *val)
1063e12c5d1SDavid du Colombier {
1073e12c5d1SDavid du Colombier 	int f;
108*9a747e4fSDavid du Colombier 	char ename[64];
1093e12c5d1SDavid du Colombier 
110*9a747e4fSDavid du Colombier 	snprint(ename, sizeof ename, "#e/%s", name);
1113e12c5d1SDavid du Colombier 	f = create(ename, 1, 0666);
1123e12c5d1SDavid du Colombier 	if(f < 0)
1133e12c5d1SDavid du Colombier 		return;
1143e12c5d1SDavid du Colombier 	write(f, val, strlen(val));
1153e12c5d1SDavid du Colombier 	close(f);
1163e12c5d1SDavid du Colombier }
1173e12c5d1SDavid du Colombier 
1183e12c5d1SDavid du Colombier void
1193e12c5d1SDavid du Colombier srvcreate(char *name, int fd)
1203e12c5d1SDavid du Colombier {
1213e12c5d1SDavid du Colombier 	char *srvname;
1223e12c5d1SDavid du Colombier 	int f;
123*9a747e4fSDavid du Colombier 	char buf[64];
1243e12c5d1SDavid du Colombier 
1253e12c5d1SDavid du Colombier 	srvname = strrchr(name, '/');
1263e12c5d1SDavid du Colombier 	if(srvname)
1273e12c5d1SDavid du Colombier 		srvname++;
1283e12c5d1SDavid du Colombier 	else
1293e12c5d1SDavid du Colombier 		srvname = name;
1303e12c5d1SDavid du Colombier 
131*9a747e4fSDavid du Colombier 	snprint(buf, sizeof buf, "#s/%s", srvname);
1323e12c5d1SDavid du Colombier 	f = create(buf, 1, 0666);
1333e12c5d1SDavid du Colombier 	if(f < 0)
1343e12c5d1SDavid du Colombier 		fatal(buf);
1353e12c5d1SDavid du Colombier 	sprint(buf, "%d", fd);
1363e12c5d1SDavid du Colombier 	if(write(f, buf, strlen(buf)) != strlen(buf))
1373e12c5d1SDavid du Colombier 		fatal("write");
1383e12c5d1SDavid du Colombier 	close(f);
1393e12c5d1SDavid du Colombier }
1403e12c5d1SDavid du Colombier 
141219b2ee8SDavid du Colombier static int
142219b2ee8SDavid du Colombier catchint(void *a, char *note)
143219b2ee8SDavid du Colombier {
144219b2ee8SDavid du Colombier 	USED(a);
145219b2ee8SDavid du Colombier 	if(strcmp(note, "alarm") == 0)
146219b2ee8SDavid du Colombier 		return 1;
147219b2ee8SDavid du Colombier 	return 0;
148219b2ee8SDavid du Colombier }
149219b2ee8SDavid du Colombier 
1503e12c5d1SDavid du Colombier int
1517dd7cddfSDavid du Colombier outin(char *prompt, char *def, int len)
1523e12c5d1SDavid du Colombier {
1533e12c5d1SDavid du Colombier 	int n;
1543e12c5d1SDavid du Colombier 	char buf[256];
1553e12c5d1SDavid du Colombier 
156219b2ee8SDavid du Colombier 	atnotify(catchint, 1);
1577dd7cddfSDavid du Colombier 	if(cpuflag)
158219b2ee8SDavid du Colombier 		alarm(15*1000);
159219b2ee8SDavid du Colombier 	do{
160219b2ee8SDavid du Colombier 		print("%s[%s]: ", prompt, *def ? def : "no default");
161219b2ee8SDavid du Colombier 		n = read(0, buf, len);
1627dd7cddfSDavid du Colombier 		if(cpuflag)
163219b2ee8SDavid du Colombier 			alarm(15*1000);
164219b2ee8SDavid du Colombier 	}while(n==0);
1657dd7cddfSDavid du Colombier 	if(cpuflag)
166219b2ee8SDavid du Colombier 		alarm(0);
167219b2ee8SDavid du Colombier 	atnotify(catchint, 0);
1683e12c5d1SDavid du Colombier 	if(n < 0)
169219b2ee8SDavid du Colombier 		return 1;
1703e12c5d1SDavid du Colombier 	if(n != 1){
1713e12c5d1SDavid du Colombier 		buf[n-1] = 0;
1723e12c5d1SDavid du Colombier 		strcpy(def, buf);
1733e12c5d1SDavid du Colombier 	}
1743e12c5d1SDavid du Colombier 	return n;
1753e12c5d1SDavid du Colombier }
176