xref: /plan9-contrib/sys/src/9k/boot/aux.c (revision 1928e0734c31813dfe95f41e96cd9e56ca4e7fa6)
19ef1f84bSDavid du Colombier #include <u.h>
29ef1f84bSDavid du Colombier #include <libc.h>
39ef1f84bSDavid du Colombier #include <../boot/boot.h>
49ef1f84bSDavid du Colombier 
59ef1f84bSDavid du Colombier /*
69ef1f84bSDavid du Colombier int
79ef1f84bSDavid du Colombier plumb(char *dir, char *dest, int *efd, char *here)
89ef1f84bSDavid du Colombier {
99ef1f84bSDavid du Colombier 	char buf[128];
109ef1f84bSDavid du Colombier 	char name[128];
119ef1f84bSDavid du Colombier 	int n;
129ef1f84bSDavid du Colombier 
13*1928e073SDavid du Colombier 	snprint(name, sizeof name, "%s/clone", dir);
149ef1f84bSDavid du Colombier 	efd[0] = open(name, ORDWR);
159ef1f84bSDavid du Colombier 	if(efd[0] < 0)
169ef1f84bSDavid du Colombier 		return -1;
179ef1f84bSDavid du Colombier 	n = read(efd[0], buf, sizeof(buf)-1);
189ef1f84bSDavid du Colombier 	if(n < 0){
199ef1f84bSDavid du Colombier 		close(efd[0]);
209ef1f84bSDavid du Colombier 		return -1;
219ef1f84bSDavid du Colombier 	}
229ef1f84bSDavid du Colombier 	buf[n] = 0;
23*1928e073SDavid du Colombier 	snprint(name, sizeof name, "%s/%s/data", dir, buf);
249ef1f84bSDavid du Colombier 	if(here){
25*1928e073SDavid du Colombier 		snprint(buf, sizeof buf, "announce %s", here);
269ef1f84bSDavid du Colombier 		if(sendmsg(efd[0], buf) < 0){
279ef1f84bSDavid du Colombier 			close(efd[0]);
289ef1f84bSDavid du Colombier 			return -1;
299ef1f84bSDavid du Colombier 		}
309ef1f84bSDavid du Colombier 	}
31*1928e073SDavid du Colombier 	snprint(buf, sizeof buf, "connect %s", dest);
329ef1f84bSDavid du Colombier 	if(sendmsg(efd[0], buf) < 0){
339ef1f84bSDavid du Colombier 		close(efd[0]);
349ef1f84bSDavid du Colombier 		return -1;
359ef1f84bSDavid du Colombier 	}
369ef1f84bSDavid du Colombier 	efd[1] = open(name, ORDWR);
379ef1f84bSDavid du Colombier 	if(efd[1] < 0){
389ef1f84bSDavid du Colombier 		close(efd[0]);
399ef1f84bSDavid du Colombier 		return -1;
409ef1f84bSDavid du Colombier 	}
419ef1f84bSDavid du Colombier 	return efd[1];
429ef1f84bSDavid du Colombier }
439ef1f84bSDavid du Colombier 
449ef1f84bSDavid du Colombier int
459ef1f84bSDavid du Colombier sendmsg(int fd, char *msg)
469ef1f84bSDavid du Colombier {
479ef1f84bSDavid du Colombier 	int n;
489ef1f84bSDavid du Colombier 
499ef1f84bSDavid du Colombier 	n = strlen(msg);
509ef1f84bSDavid du Colombier 	if(write(fd, msg, n) != n)
519ef1f84bSDavid du Colombier 		return -1;
529ef1f84bSDavid du Colombier 	return 0;
539ef1f84bSDavid du Colombier }
54532111f7SDavid du Colombier  */
559ef1f84bSDavid du Colombier 
569ef1f84bSDavid du Colombier void
warning(char * s)579ef1f84bSDavid du Colombier warning(char *s)
589ef1f84bSDavid du Colombier {
599ef1f84bSDavid du Colombier 	char buf[ERRMAX];
609ef1f84bSDavid du Colombier 
619ef1f84bSDavid du Colombier 	buf[0] = '\0';
629ef1f84bSDavid du Colombier 	errstr(buf, sizeof buf);
639ef1f84bSDavid du Colombier 	fprint(2, "boot: %s: %s\n", s, buf);
649ef1f84bSDavid du Colombier }
659ef1f84bSDavid du Colombier 
669ef1f84bSDavid du Colombier void
fatal(char * s)679ef1f84bSDavid du Colombier fatal(char *s)
689ef1f84bSDavid du Colombier {
69532111f7SDavid du Colombier 	char *msg;
709ef1f84bSDavid du Colombier 	char buf[ERRMAX];
719ef1f84bSDavid du Colombier 
729ef1f84bSDavid du Colombier 	buf[0] = '\0';
739ef1f84bSDavid du Colombier 	errstr(buf, sizeof buf);
74532111f7SDavid du Colombier 	msg = smprint("%s: %s", s, buf);
75532111f7SDavid du Colombier 	fprint(2, "boot: %s\n", msg);
76532111f7SDavid du Colombier 	exits(msg);			/* this will trigger a panic */
779ef1f84bSDavid du Colombier }
789ef1f84bSDavid du Colombier 
799ef1f84bSDavid du Colombier int
readfile(char * name,char * buf,int len)809ef1f84bSDavid du Colombier readfile(char *name, char *buf, int len)
819ef1f84bSDavid du Colombier {
829ef1f84bSDavid du Colombier 	int f, n;
839ef1f84bSDavid du Colombier 
849ef1f84bSDavid du Colombier 	buf[0] = 0;
859ef1f84bSDavid du Colombier 	f = open(name, OREAD);
869ef1f84bSDavid du Colombier 	if(f < 0)
879ef1f84bSDavid du Colombier 		return -1;
889ef1f84bSDavid du Colombier 	n = read(f, buf, len-1);
899ef1f84bSDavid du Colombier 	if(n >= 0)
909ef1f84bSDavid du Colombier 		buf[n] = 0;
919ef1f84bSDavid du Colombier 	close(f);
929ef1f84bSDavid du Colombier 	return 0;
939ef1f84bSDavid du Colombier }
949ef1f84bSDavid du Colombier 
959ef1f84bSDavid du Colombier int
writefile(char * name,char * buf,int len)969ef1f84bSDavid du Colombier writefile(char *name, char *buf, int len)
979ef1f84bSDavid du Colombier {
989ef1f84bSDavid du Colombier 	int f, n;
999ef1f84bSDavid du Colombier 
1009ef1f84bSDavid du Colombier 	f = open(name, OWRITE);
1019ef1f84bSDavid du Colombier 	if(f < 0)
1029ef1f84bSDavid du Colombier 		return -1;
1039ef1f84bSDavid du Colombier 	n = write(f, buf, len);
1049ef1f84bSDavid du Colombier 	close(f);
1059ef1f84bSDavid du Colombier 	return (n != len) ? -1 : 0;
1069ef1f84bSDavid du Colombier }
1079ef1f84bSDavid du Colombier 
1089ef1f84bSDavid du Colombier void
setenv(char * name,char * val)1099ef1f84bSDavid du Colombier setenv(char *name, char *val)
1109ef1f84bSDavid du Colombier {
1119ef1f84bSDavid du Colombier 	int f;
1129ef1f84bSDavid du Colombier 	char ename[64];
1139ef1f84bSDavid du Colombier 
1149ef1f84bSDavid du Colombier 	snprint(ename, sizeof ename, "#e/%s", name);
1159ef1f84bSDavid du Colombier 	f = create(ename, 1, 0666);
1169ef1f84bSDavid du Colombier 	if(f < 0){
1179ef1f84bSDavid du Colombier 		fprint(2, "create %s: %r\n", ename);
1189ef1f84bSDavid du Colombier 		return;
1199ef1f84bSDavid du Colombier 	}
1209ef1f84bSDavid du Colombier 	write(f, val, strlen(val));
1219ef1f84bSDavid du Colombier 	close(f);
1229ef1f84bSDavid du Colombier }
1239ef1f84bSDavid du Colombier 
1249ef1f84bSDavid du Colombier void
srvcreate(char * name,int fd)1259ef1f84bSDavid du Colombier srvcreate(char *name, int fd)
1269ef1f84bSDavid du Colombier {
1279ef1f84bSDavid du Colombier 	char *srvname;
1289ef1f84bSDavid du Colombier 	int f;
1299ef1f84bSDavid du Colombier 	char buf[64];
1309ef1f84bSDavid du Colombier 
1319ef1f84bSDavid du Colombier 	srvname = strrchr(name, '/');
1329ef1f84bSDavid du Colombier 	if(srvname)
1339ef1f84bSDavid du Colombier 		srvname++;
1349ef1f84bSDavid du Colombier 	else
1359ef1f84bSDavid du Colombier 		srvname = name;
1369ef1f84bSDavid du Colombier 
1379ef1f84bSDavid du Colombier 	snprint(buf, sizeof buf, "#s/%s", srvname);
1389ef1f84bSDavid du Colombier 	f = create(buf, 1, 0666);
1399ef1f84bSDavid du Colombier 	if(f < 0)
1409ef1f84bSDavid du Colombier 		fatal(buf);
141*1928e073SDavid du Colombier 	snprint(buf, sizeof buf, "%d", fd);
1429ef1f84bSDavid du Colombier 	if(write(f, buf, strlen(buf)) != strlen(buf))
1439ef1f84bSDavid du Colombier 		fatal("write");
1449ef1f84bSDavid du Colombier 	close(f);
1459ef1f84bSDavid du Colombier }
1469ef1f84bSDavid du Colombier 
1479ef1f84bSDavid du Colombier void
catchint(void * a,char * note)1489ef1f84bSDavid du Colombier catchint(void *a, char *note)
1499ef1f84bSDavid du Colombier {
1509ef1f84bSDavid du Colombier 	USED(a);
1519ef1f84bSDavid du Colombier 	if(strcmp(note, "alarm") == 0)
1529ef1f84bSDavid du Colombier 		noted(NCONT);
1539ef1f84bSDavid du Colombier 	noted(NDFLT);
1549ef1f84bSDavid du Colombier }
1559ef1f84bSDavid du Colombier 
1569ef1f84bSDavid du Colombier int
outin(char * prompt,char * def,int len)1579ef1f84bSDavid du Colombier outin(char *prompt, char *def, int len)
1589ef1f84bSDavid du Colombier {
1599ef1f84bSDavid du Colombier 	int n;
1609ef1f84bSDavid du Colombier 	char buf[256];
1619ef1f84bSDavid du Colombier 
1629ef1f84bSDavid du Colombier 	if(len >= sizeof buf)
1639ef1f84bSDavid du Colombier 		len = sizeof(buf)-1;
1649ef1f84bSDavid du Colombier 
1659ef1f84bSDavid du Colombier 	if(cpuflag){
1669ef1f84bSDavid du Colombier 		notify(catchint);
1679ef1f84bSDavid du Colombier 		alarm(15*1000);
1689ef1f84bSDavid du Colombier 	}
1699ef1f84bSDavid du Colombier 	print("%s[%s]: ", prompt, *def ? def : "no default");
1709ef1f84bSDavid du Colombier 	memset(buf, 0, sizeof buf);
1719ef1f84bSDavid du Colombier 	n = read(0, buf, len);
1729ef1f84bSDavid du Colombier 	if(cpuflag){
1739ef1f84bSDavid du Colombier 		alarm(0);
1749ef1f84bSDavid du Colombier 		notify(0);
1759ef1f84bSDavid du Colombier 	}
1769ef1f84bSDavid du Colombier 
1779ef1f84bSDavid du Colombier 	if(n < 0){
1789ef1f84bSDavid du Colombier 		print("\n");
1799ef1f84bSDavid du Colombier 		return 1;
1809ef1f84bSDavid du Colombier 	}
1819ef1f84bSDavid du Colombier 	if(n > 1){
1829ef1f84bSDavid du Colombier 		buf[n-1] = 0;
1839ef1f84bSDavid du Colombier 		strcpy(def, buf);
1849ef1f84bSDavid du Colombier 	}
1859ef1f84bSDavid du Colombier 	return n;
1869ef1f84bSDavid du Colombier }
187