plan 9 kernel history: overview | file list | diff list

1990/0504/power/boot.c (diff list | history)

1990/0227/sys/src/9/power/boot.c:16,271990/0324/sys/src/9/power/boot.c:16,27 (short | long)
1990/0227    
} Address; 
 
Address addr[] = { 
1990/0324    
	{ "bitbootes", "bitconnect" }, 
1990/0227    
	{ "ross", "connect 020701005eff" }, 
	{ "bootes", "connect 080069020205" }, 
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
	{ "bitbootes", "bitconnect" }, 
	{ 0 } 
}; 
 
1990/0227/sys/src/9/power/boot.c:98,1061990/0324/sys/src/9/power/boot.c:98,106
1990/0227    
	close(fu); 
 
	if(strcmp(scmd, "bitconnect") == 0){ 
		fd = open("#b/bit", ORDWR); 
1990/0324    
		fd = open("#3/bit3", ORDWR); 
1990/0227    
		if(fd < 0) 
			error("opening #b/bit"); 
1990/0324    
			error("opening #3/bit3"); 
1990/0227    
		goto Mesg; 
	} 
 
1990/0324/sys/src/9/power/boot.c:3,141990/0427/sys/src/9/power/boot.c:3,24 (short | long)
1990/0227    
 
#include <fcall.h> 
 
1990/0427    
#define DEFSYS "bitbootes" 
#define DEFFILE "/mips/9" 
 
1990/0227    
Fcall	hdr; 
char	buf[100]; 
char	srv[100]; 
1990/0427    
char	*sys; 
char	*scmd; 
char	*bootfile; 
1990/0227    
 
void	error(char *); 
1990/0427    
char	sbuf[2*NAMELEN]; 
char	buf[4*1024]; 
1990/0227    
 
1990/0427    
int fd; 
int cfd; 
int efd; 
 
 
1990/0227    
typedef 
struct address { 
	char *name; 
1990/0324/sys/src/9/power/boot.c:25,1061990/0427/sys/src/9/power/boot.c:35,131
1990/0227    
	{ 0 } 
}; 
 
#define DEFUSER "bootes" 
1990/0427    
/* 
 *  predeclared 
 */ 
char	*lookup(char *); 
int	outin(char *, char *, char *, int); 
void	prerror(char *); 
void	error(char *); 
void	boot(int); 
1990/0227    
 
char * 
lookup(char *arg) 
1990/0427    
/* 
 *  usage: 9b [-a] [server] [file] 
 * 
 *  default server is `bitbootes', default file is `/sys/src/9/mips/9' 
 */ 
main(int argc, char *argv[]) 
1990/0227    
{ 
	Address *a; 
1990/0427    
	int i; 
	int manual=0; 
1990/0227    
 
	if(strcmp(arg, "?")==0 || strcmp(arg, "help")==0){ 
		for(a = addr; a->name; a++) 
			print("%s\n", a->name); 
		return 0; 
1990/0427    
	open("#c/cons", 0); 
	open("#c/cons", 1); 
	open("#c/cons", 1); 
 
	print("boot.c staring\n"); 
 
	argv++; 
	argc--;	 
 
	while(argc > 0){ 
		if(argv[0][0] == '-'){ 
			if(argv[0][1] == 'm') 
				manual = 1; 
			argc--; 
			argv++; 
		} else 
			break; 
1990/0227    
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			return a->cmd; 
1990/0427    
 
	sys = DEFSYS; 
	bootfile = DEFFILE; 
	switch(argc){ 
	case 1: 
		bootfile = argv[0]; 
		break; 
	case 2: 
		bootfile = argv[0]; 
		sys = argv[1]; 
		break; 
1990/0227    
	} 
	return 0; 
1990/0427    
 
	boot(manual); 
	for(;;){ 
		if(fd > 0) 
			close(fd); 
		if(cfd > 0) 
			close(cfd); 
		if(efd > 0) 
			close(efd); 
		fd = cfd = efd = 0; 
		boot(1); 
	} 
1990/0227    
} 
 
main(int argc, char *argv[]) 
1990/0427    
void 
boot(int ask) 
1990/0227    
{ 
	int cfd, fd, n, fu, f; 
	char buf[NAMELEN]; 
	char *scmd; 
1990/0427    
	int n, f; 
1990/0227    
 
	open("#c/cons", 0); 
	open("#c/cons", 1); 
	open("#c/cons", 1); 
1990/0427    
	if(!ask) 
		scmd = lookup(sys); 
	else { 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
		scmd = lookup(sys); 
	} 
	if(scmd == 0){ 
		fprint(2, "boot: %s unknown\n", sys); 
		return; 
	} 
1990/0227    
 
	/* 
	 *  get server 
	 */ 
	do{ 
		do{ 
			print("server[%s]: ", addr[0].name); 
			n = read(0, srv, sizeof srv); 
		}while(n==0); 
		if(n < 0) 
			error("can't read #c/cons; please reboot"); 
		if(n == 1) 
			strcpy(srv, addr[0].name); 
		else 
			srv[n-1] = 0; 
		scmd = lookup(srv); 
	}while(scmd == 0); 
1990/0427    
	print("Connecting to server %s\n", sys); 
1990/0227    
 
	/* 
	 *  get user.  if the user typed cr to the server question, skip 
	 *  the user question and just use the default. 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0227    
	 */ 
	if(n != 1){ 
		do{ 
			print("user[%s]: ", DEFUSER); 
			n = read(0, buf, sizeof buf); 
		}while(n==0); 
		if(n < 0) 
			error("can't read #c/cons; please reboot"); 
		if(n == 1) 
			strcpy(buf, DEFUSER); 
		else 
			buf[n-1] = 0; 
	}else 
		strcpy(buf, DEFUSER); 
                 
	fu = create("#c/user", 1, 0600); 
	if(fu < 0) 
		error("#c/user"); 
	n = strlen(buf); 
	if(write(fu, buf, n) != n) 
		error("user write"); 
	close(fu); 
                 
	if(strcmp(scmd, "bitconnect") == 0){ 
1990/0324    
		fd = open("#3/bit3", ORDWR); 
1990/0227    
		if(fd < 0) 
1990/0324    
			error("opening #3/bit3"); 
1990/0427    
		if(fd < 0){ 
			prerror("opening #3/bit3"); 
			return; 
		} 
1990/0227    
		goto Mesg; 
	} 
 
1990/0324/sys/src/9/power/boot.c:108,1701990/0427/sys/src/9/power/boot.c:133,224
1990/0227    
	 *  grab a lance channel, make it recognize ether type 0x900, 
	 *  and push the nonet ethernet multiplexor onto it. 
	 */ 
	cfd = open("#l/1/ctl", 2); 
	if(cfd < 0) 
		error("opening #l/1/ctl"); 
	if(write(cfd, "connect 0x900", sizeof("connect 0x900")-1)<0) 
		error("connect 0x900"); 
	if(write(cfd, "push noether", sizeof("push noether")-1)<0) 
		error("push noether"); 
1990/0427    
	efd = open("#l/1/ctl", 2); 
	if(efd < 0){ 
		prerror("opening #l/1/ctl"); 
		return; 
	} 
	if(write(efd, "connect 0x900", sizeof("connect 0x900")-1)<0){ 
		prerror("connect 0x900"); 
		return; 
	} 
	if(write(efd, "push noether", sizeof("push noether")-1)<0){ 
		prerror("push noether"); 
		return; 
	} 
1990/0227    
 
	/* 
	 *  grab a nonet channel and call up the ross file server 
	 */ 
	fd = open("#n/1/data", 2); 
	if(fd < 0) 
		error("opening #n/1/data"); 
1990/0427    
	if(fd < 0) { 
		prerror("opening #n/1/data"); 
		return; 
	} 
1990/0227    
	cfd = open("#n/1/ctl", 2); 
	if(cfd < 0) 
		error("opening #n/1/ctl"); 
	if(write(cfd, scmd, strlen(scmd))<0) 
		error(scmd); 
1990/0427    
	if(cfd < 0){ 
		prerror("opening #n/1/ctl"); 
		return; 
	} 
	if(write(cfd, scmd, strlen(scmd))<0){ 
		prerror(scmd); 
		return; 
	} 
1990/0227    
 
    Mesg: 
	print("nop..."); 
	hdr.type = Tnop; 
	n = convS2M(&hdr, buf); 
	if(write(fd, buf, n) != n) 
		error("write nop"); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		print("n = %d\n", n); 
		prerror("write nop"); 
		return; 
	} 
1990/0227    
	n = read(fd, buf, sizeof buf); 
	if(n <= 0) 
		error("read nop"); 
1990/0427    
	if(n <= 0){ 
		prerror("read nop"); 
		return; 
	} 
1990/0227    
	if(convM2S(buf, &hdr, n) == 0) { 
		print("n = %d; buf = %.2x %.2x %.2x %.2x\n", 
			n, buf[0], buf[1], buf[2], buf[3]); 
		error("format nop"); 
1990/0427    
		prerror("format nop"); 
		return; 
1990/0227    
	} 
	if(hdr.type != Rnop) 
		error("not Rnop"); 
1990/0427    
	if(hdr.type != Rnop){ 
		prerror("not Rnop"); 
		return; 
	} 
1990/0227    
 
	print("session..."); 
	hdr.type = Tsession; 
	hdr.lang = 'v'; 
	n = convS2M(&hdr, buf); 
	if(write(fd, buf, n) != n) 
		error("write session"); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
		return; 
	} 
1990/0227    
	n = read(fd, buf, sizeof buf); 
	if(n <= 0) 
		error("read session"); 
	if(convM2S(buf, &hdr, n) == 0) 
		error("format session"); 
	if(hdr.type != Rsession) 
		error("not Rsession"); 
1990/0427    
	if(n <= 0){ 
		prerror("read session"); 
		return; 
	} 
	if(convM2S(buf, &hdr, n) == 0){ 
		prerror("format session"); 
		return; 
	} 
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
		return; 
	} 
1990/0227    
	if(hdr.err){ 
		print("error %d;", hdr.err); 
		error("remote error"); 
1990/0427    
		prerror("remote error"); 
		return; 
1990/0227    
	} 
 
	print("post..."); 
	sprint(buf, "#s/%s", srv); 
1990/0427    
	sprint(buf, "#s/%s", sys); 
1990/0227    
	f = create(buf, 1, 0666); 
	if(f < 0) 
		error("create"); 
1990/0324/sys/src/9/power/boot.c:172,1781990/0427/sys/src/9/power/boot.c:226,231
1990/0227    
	if(write(f, buf, strlen(buf)) != strlen(buf)) 
		error("write"); 
	close(f); 
	sprint(buf, "#s/%s", srv); 
	f = create("#s/boot", 1, 0666); 
	if(f < 0) 
		error("create"); 
1990/0324/sys/src/9/power/boot.c:180,1861990/0427/sys/src/9/power/boot.c:233,239
1990/0227    
	if(write(f, buf, strlen(buf)) != strlen(buf)) 
		error("write"); 
	close(f); 
	                 
1990/0427    
 
1990/0227    
	print("mount..."); 
	if(bind("/", "/", MREPL) < 0) 
		error("bind"); 
1990/0324/sys/src/9/power/boot.c:191,1971990/0427/sys/src/9/power/boot.c:244,265
1990/0227    
	error("/mips/init"); 
} 
 
1990/0427    
/* 
 *  print error 
 */ 
1990/0227    
void 
1990/0427    
prerror(char *s) 
{ 
	char buf[64]; 
 
	errstr(0, buf); 
	fprint(2, "boot: %s: %s\n", s, buf); 
} 
 
/* 
 *  print error and exit 
 */ 
void 
1990/0227    
error(char *s) 
{ 
	char buf[64]; 
1990/0324/sys/src/9/power/boot.c:199,2021990/0427/sys/src/9/power/boot.c:267,311
1990/0227    
	errstr(0, buf); 
	fprint(2, "boot: %s: %s\n", s, buf); 
	exits(0); 
1990/0427    
} 
 
/* 
 *  lookup the address for a system 
 */ 
char * 
lookup(char *arg) 
{ 
	Address *a; 
 
	if(strcmp(arg, "?")==0 || strcmp(arg, "help")==0){ 
		for(a = addr; a->name; a++) 
			print("%s\n", a->name); 
		return 0; 
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			return a->cmd; 
	} 
	return 0; 
} 
 
/* 
 *  prompt and get input 
 */ 
int 
outin(char *prompt, char *def, char *buf, int len) 
{ 
	int n; 
 
	do{ 
		print("%s[%s]: ", prompt, def); 
		n = read(0, buf, len); 
	}while(n==0); 
	if(n < 0) 
		error("can't read #c/cons; please reboot"); 
	if(n == 1) 
		strcpy(buf, def); 
	else 
		buf[n-1] = 0; 
	return n; 
1990/0227    
} 
1990/0427/sys/src/9/power/boot.c:58,641990/0430/sys/src/9/power/boot.c:58,63 (short | long)
1990/0427    
	open("#c/cons", 1); 
	open("#c/cons", 1); 
 
	print("boot.c staring\n"); 
 
	argv++; 
	argc--;	 
1990/0430/sys/src/9/power/boot.c:18,241990/0504/sys/src/9/power/boot.c:18,23 (short | long)
1990/0427    
int cfd; 
int efd; 
 
                 
1990/0227    
typedef 
struct address { 
	char *name; 
1990/0430/sys/src/9/power/boot.c:47,531990/0504/sys/src/9/power/boot.c:46,52
1990/0427    
/* 
 *  usage: 9b [-a] [server] [file] 
 * 
 *  default server is `bitbootes', default file is `/sys/src/9/mips/9' 
1990/0504    
 *  default server is `bitbootes', default file is `/mips/9' 
1990/0427    
 */ 
main(int argc, char *argv[]) 
1990/0227    
{ 
1990/0430/sys/src/9/power/boot.c:58,631990/0504/sys/src/9/power/boot.c:57,68
1990/0427    
	open("#c/cons", 1); 
	open("#c/cons", 1); 
 
1990/0504    
	i = create("#e/sysname", 1, 0666); 
	if(i < 0) 
		error("sysname"); 
	if(write(i, argv[0], strlen(argv[0])) <= 0) 
		error("sysname"); 
	close(i); 
1990/0427    
 
	argv++; 
	argc--;	 
1990/0430/sys/src/9/power/boot.c:114,1211990/0504/sys/src/9/power/boot.c:119,124
1990/0427    
		return; 
	} 
1990/0227    
 
1990/0427    
	print("Connecting to server %s\n", sys); 
1990/0227    
                 
	/* 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0227    
	 */ 
1990/0430/sys/src/9/power/boot.c:239,2451990/0504/sys/src/9/power/boot.c:242,253
1990/0227    
	if(mount(fd, "/", MAFTER|MCREATE, "") < 0) 
		error("mount"); 
	print("success\n"); 
	execl("/mips/init", "init", 0); 
1990/0504    
	close(fd); 
 
	if(ask) 
		execl("/mips/init", "init", 0); 
	else 
		execl("/mips/init", "init", "-m", 0); 
1990/0227    
	error("/mips/init"); 
} 
 
1990/0504/sys/src/9/power/boot.c:245,2531990/06111/sys/src/9/power/boot.c:245,253 (short | long)
1990/0504    
	close(fd); 
 
	if(ask) 
		execl("/mips/init", "init", 0); 
	else 
		execl("/mips/init", "init", "-m", 0); 
1990/06111    
	else 
		execl("/mips/init", "init", 0); 
1990/0227    
	error("/mips/init"); 
} 
 
1990/06111/sys/src/9/power/boot.c:152,1651990/0704/sys/src/9/power/boot.c:152,165 (short | long)
1990/0227    
	/* 
	 *  grab a nonet channel and call up the ross file server 
	 */ 
	fd = open("#n/1/data", 2); 
1990/0704    
	fd = open("#n/2/data", 2); 
1990/0427    
	if(fd < 0) { 
		prerror("opening #n/1/data"); 
1990/0704    
		prerror("opening #n/2/data"); 
1990/0427    
		return; 
	} 
1990/0227    
	cfd = open("#n/1/ctl", 2); 
1990/0704    
	cfd = open("#n/2/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
		prerror("opening #n/1/ctl"); 
1990/0704    
		prerror("opening #n/2/ctl"); 
1990/0427    
		return; 
	} 
	if(write(cfd, scmd, strlen(scmd))<0){ 
1990/0704/sys/src/9/power/boot.c:22,361990/0721/sys/src/9/power/boot.c:22,37 (short | long)
1990/0227    
struct address { 
	char *name; 
	char *cmd; 
1990/0721    
	char *srvname; 
1990/0227    
} Address; 
 
Address addr[] = { 
1990/0324    
	{ "bitbootes", "bitconnect" }, 
1990/0227    
	{ "ross", "connect 020701005eff" }, 
	{ "bootes", "connect 080069020205" }, 
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1990/0721    
	{ "bitbootes", "bitconnect", "bit!bootes" }, 
	{ "ross", "connect 020701005eff", "nonet!ross" }, 
	{ "bootes", "connect 080069020205", "nonet!bootes" }, 
	{ "helix", "connect 080069020427", "nonet!helix" }, 
	{ "spindle", "connect 0800690202df", "nonet!spindle" }, 
	{ "r70", "connect 08002b04265d", "nonet!r70" }, 
1990/0227    
	{ 0 } 
}; 
 
1990/0704/sys/src/9/power/boot.c:37,431990/0721/sys/src/9/power/boot.c:38,44
1990/0427    
/* 
 *  predeclared 
 */ 
char	*lookup(char *); 
1990/0721    
Address* lookup(char *); 
1990/0427    
int	outin(char *, char *, char *, int); 
void	prerror(char *); 
void	error(char *); 
1990/0704/sys/src/9/power/boot.c:106,1231990/0721/sys/src/9/power/boot.c:107,124
1990/0427    
boot(int ask) 
1990/0227    
{ 
1990/0427    
	int n, f; 
1990/0721    
	Address *a; 
1990/0227    
 
1990/0427    
	if(!ask) 
		scmd = lookup(sys); 
	else { 
1990/0721    
	if(ask){ 
1990/0427    
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
		scmd = lookup(sys); 
	} 
	if(scmd == 0){ 
1990/0721    
	a = lookup(sys); 
	if(a == 0){ 
1990/0427    
		fprint(2, "boot: %s unknown\n", sys); 
		return; 
	} 
1990/0721    
	scmd = a->cmd; 
1990/0227    
 
	/* 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0704/sys/src/9/power/boot.c:148,1631990/0721/sys/src/9/power/boot.c:149,168
1990/0427    
		prerror("push noether"); 
		return; 
	} 
1990/0721    
	if(write(efd, "config nonet", sizeof("config nonet")-1)<0){ 
		prerror("config nonet"); 
		return; 
	} 
1990/0227    
 
	/* 
	 *  grab a nonet channel and call up the ross file server 
	 */ 
1990/0704    
	fd = open("#n/2/data", 2); 
1990/0721    
	fd = open("#nnonet/2/data", 2); 
1990/0427    
	if(fd < 0) { 
1990/0704    
		prerror("opening #n/2/data"); 
1990/0427    
		return; 
	} 
1990/0704    
	cfd = open("#n/2/ctl", 2); 
1990/0721    
	cfd = open("#nnonet/2/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
1990/0704    
		prerror("opening #n/2/ctl"); 
1990/0427    
		return; 
1990/0704/sys/src/9/power/boot.c:220,2261990/0721/sys/src/9/power/boot.c:225,231
1990/0227    
	} 
 
	print("post..."); 
1990/0427    
	sprint(buf, "#s/%s", sys); 
1990/0721    
	sprint(buf, "#s/%s", a->srvname); 
1990/0227    
	f = create(buf, 1, 0666); 
	if(f < 0) 
		error("create"); 
1990/0704/sys/src/9/power/boot.c:279,2851990/0721/sys/src/9/power/boot.c:284,290
1990/0427    
/* 
 *  lookup the address for a system 
 */ 
char * 
1990/0721    
Address * 
1990/0427    
lookup(char *arg) 
{ 
	Address *a; 
1990/0704/sys/src/9/power/boot.c:291,2971990/0721/sys/src/9/power/boot.c:296,302
1990/0427    
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			return a->cmd; 
1990/0721    
			return a; 
1990/0427    
	} 
	return 0; 
} 
1990/0721/sys/src/9/power/boot.c:159,1701990/0722/sys/src/9/power/boot.c:159,170 (short | long)
1990/0227    
	 */ 
1990/0721    
	fd = open("#nnonet/2/data", 2); 
1990/0427    
	if(fd < 0) { 
1990/0704    
		prerror("opening #n/2/data"); 
1990/0722    
		prerror("opening #nnonet/2/data"); 
1990/0427    
		return; 
	} 
1990/0721    
	cfd = open("#nnonet/2/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
1990/0704    
		prerror("opening #n/2/ctl"); 
1990/0722    
		prerror("opening #nnonet/2/ctl"); 
1990/0427    
		return; 
	} 
	if(write(cfd, scmd, strlen(scmd))<0){ 
1990/0722/sys/src/9/power/boot.c:1,61990/11211/sys/src/9/power/boot.c:1,5 (short | long)
1990/0227    
#include <u.h> 
#include <libc.h> 
                 
#include <fcall.h> 
 
1990/0427    
#define DEFSYS "bitbootes" 
1990/0722/sys/src/9/power/boot.c:175,1801990/11211/sys/src/9/power/boot.c:174,180
1990/0227    
    Mesg: 
	print("nop..."); 
	hdr.type = Tnop; 
1990/11211    
	hdr.tag = ~0; 
1990/0227    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		print("n = %d\n", n); 
1990/0722/sys/src/9/power/boot.c:196,2051990/11211/sys/src/9/power/boot.c:196,209
1990/0427    
		prerror("not Rnop"); 
		return; 
	} 
1990/11211    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
		return; 
	} 
1990/0227    
 
	print("session..."); 
	hdr.type = Tsession; 
	hdr.lang = 'v'; 
1990/11211    
	hdr.tag = ~0; 
1990/0227    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
1990/0722/sys/src/9/power/boot.c:214,2281990/11211/sys/src/9/power/boot.c:218,235
1990/0427    
		prerror("format session"); 
		return; 
	} 
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
1990/11211    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
1990/0427    
		return; 
	} 
1990/0227    
	if(hdr.err){ 
		print("error %d;", hdr.err); 
1990/0427    
		prerror("remote error"); 
1990/11211    
	if(hdr.type == Rerror){ 
		fprint(2, "boot: error %s\n", hdr.ename); 
1990/0427    
		return; 
1990/0227    
	} 
1990/11211    
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
		return; 
	} 
1990/0227    
 
	print("post..."); 
1990/0721    
	sprint(buf, "#s/%s", a->srvname); 
1990/0722/sys/src/9/power/boot.c:244,2591990/11211/sys/src/9/power/boot.c:251,266
1990/0227    
	print("mount..."); 
	if(bind("/", "/", MREPL) < 0) 
		error("bind"); 
	if(mount(fd, "/", MAFTER|MCREATE, "") < 0) 
1990/11211    
	if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) 
1990/0227    
		error("mount"); 
	print("success\n"); 
1990/0504    
	close(fd); 
 
	if(ask) 
		execl("/mips/init", "init", "-m", 0); 
1990/11211    
		execl("/mips/Ninit", "Ninit", "-m", 0); 
1990/06111    
	else 
		execl("/mips/init", "init", 0); 
1990/0227    
	error("/mips/init"); 
1990/11211    
		execl("/mips/Ninit", "Ninit", 0); 
	error("/mips/Ninit"); 
1990/0227    
} 
 
1990/0427    
/* 
1990/0722/sys/src/9/power/boot.c:264,2701990/11211/sys/src/9/power/boot.c:271,277
1990/0427    
{ 
	char buf[64]; 
 
	errstr(0, buf); 
1990/11211    
	errstr(buf); 
1990/0427    
	fprint(2, "boot: %s: %s\n", s, buf); 
} 
 
1990/0722/sys/src/9/power/boot.c:276,2821990/11211/sys/src/9/power/boot.c:283,289
1990/0227    
{ 
	char buf[64]; 
 
	errstr(0, buf); 
1990/11211    
	errstr(buf); 
1990/0227    
	fprint(2, "boot: %s: %s\n", s, buf); 
	exits(0); 
1990/0427    
} 
1990/11211/sys/src/9/power/boot.c:257,2661990/1122/sys/src/9/power/boot.c:257,266 (short | long)
1990/0504    
	close(fd); 
 
	if(ask) 
1990/11211    
		execl("/mips/Ninit", "Ninit", "-m", 0); 
1990/1122    
		execl("/mips/init", "init", "-m", 0); 
1990/06111    
	else 
1990/11211    
		execl("/mips/Ninit", "Ninit", 0); 
	error("/mips/Ninit"); 
1990/1122    
		execl("/mips/init", "init", 0); 
	error("/mips/init"); 
1990/0227    
} 
 
1990/0427    
/* 
1990/1122/sys/src/9/power/boot.c:2,81990/1127/sys/src/9/power/boot.c:2,8 (short | long)
1990/0227    
#include <libc.h> 
#include <fcall.h> 
 
1990/0427    
#define DEFSYS "bitbootes" 
1990/1127    
#define DEFSYS "bit!bootes" 
1990/0427    
#define DEFFILE "/mips/9" 
 
1990/0227    
Fcall	hdr; 
1990/1122/sys/src/9/power/boot.c:21,361990/1127/sys/src/9/power/boot.c:21,34
1990/0227    
struct address { 
	char *name; 
	char *cmd; 
1990/0721    
	char *srvname; 
1990/0227    
} Address; 
 
Address addr[] = { 
1990/0721    
	{ "bitbootes", "bitconnect", "bit!bootes" }, 
	{ "ross", "connect 020701005eff", "nonet!ross" }, 
	{ "bootes", "connect 080069020205", "nonet!bootes" }, 
	{ "helix", "connect 080069020427", "nonet!helix" }, 
	{ "spindle", "connect 0800690202df", "nonet!spindle" }, 
	{ "r70", "connect 08002b04265d", "nonet!r70" }, 
1990/1127    
	{ "ross", "connect 020701005eff" }, 
	{ "bootes", "connect 080069020205" }, 
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1990/0227    
	{ 0 } 
}; 
 
1990/1122/sys/src/9/power/boot.c:37,471990/1127/sys/src/9/power/boot.c:35,47
1990/0427    
/* 
 *  predeclared 
 */ 
1990/0721    
Address* lookup(char *); 
1990/0427    
int	outin(char *, char *, char *, int); 
void	prerror(char *); 
void	error(char *); 
void	boot(int); 
1990/1127    
int	dkdial(char *); 
int	nonetdial(char *); 
int	bitdial(char *); 
1990/0227    
 
1990/0427    
/* 
 *  usage: 9b [-a] [server] [file] 
1990/1122/sys/src/9/power/boot.c:95,1771990/1127/sys/src/9/power/boot.c:95,267
1990/0427    
			close(fd); 
		if(cfd > 0) 
			close(cfd); 
		if(efd > 0) 
			close(efd); 
		fd = cfd = efd = 0; 
1990/1127    
		fd = cfd = 0; 
1990/0427    
		boot(1); 
	} 
1990/0227    
} 
 
1990/0427    
void 
boot(int ask) 
1990/1127    
int 
bitdial(char *arg) 
1990/0227    
{ 
1990/0427    
	int n, f; 
1990/1127    
	return open("#3/bit3", ORDWR); 
} 
 
int 
nonetdial(char *arg) 
{ 
	int efd, cfd, fd; 
1990/0721    
	Address *a; 
1990/1127    
	static int mounted; 
1990/0227    
 
1990/0721    
	if(ask){ 
1990/0427    
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
1990/1127    
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
			break; 
1990/0427    
	} 
1990/0721    
	a = lookup(sys); 
	if(a == 0){ 
1990/0427    
		fprint(2, "boot: %s unknown\n", sys); 
		return; 
1990/1127    
	if(a->name == 0){ 
		print("can't convert nonet address to ether address\n"); 
		return -1; 
1990/0427    
	} 
1990/0721    
	scmd = a->cmd; 
1990/0227    
 
	/* 
1990/0427    
	 *  for the bit, we skip all the ether goo 
1990/0227    
	 */ 
	if(strcmp(scmd, "bitconnect") == 0){ 
1990/0324    
		fd = open("#3/bit3", ORDWR); 
1990/0427    
		if(fd < 0){ 
			prerror("opening #3/bit3"); 
			return; 
1990/1127    
	if(!mounted){ 
		/* 
		 *  grab a lance channel, make it recognize ether type 0x900, 
		 *  and push the nonet ethernet multiplexor onto it. 
		 */ 
		efd = open("#l/1/ctl", 2); 
		if(efd < 0){ 
			prerror("opening #l/1/ctl"); 
			return -1; 
1990/0427    
		} 
1990/0227    
		goto Mesg; 
1990/1127    
		if(write(efd, "connect 0x900", sizeof("connect 0x900")-1)<0){ 
			close(efd); 
			prerror("connect 0x900"); 
			return -1; 
		} 
		if(write(efd, "push noether", sizeof("push noether")-1)<0){ 
			close(efd); 
			prerror("push noether"); 
			return -1; 
		} 
		if(write(efd, "config nonet", sizeof("config nonet")-1)<0){ 
			close(efd); 
			prerror("config nonet"); 
			return -1; 
		} 
		mounted = 1; 
1990/0227    
	} 
 
	/* 
	 *  grab a lance channel, make it recognize ether type 0x900, 
	 *  and push the nonet ethernet multiplexor onto it. 
1990/1127    
	 *  grab a nonet channel and call up the file server 
1990/0227    
	 */ 
1990/0427    
	efd = open("#l/1/ctl", 2); 
	if(efd < 0){ 
		prerror("opening #l/1/ctl"); 
		return; 
1990/1127    
	fd = open("#nnonet/2/data", 2); 
	if(fd < 0) { 
		prerror("opening #nnonet/2/data"); 
		return -1; 
1990/0427    
	} 
	if(write(efd, "connect 0x900", sizeof("connect 0x900")-1)<0){ 
		prerror("connect 0x900"); 
		return; 
1990/1127    
	cfd = open("#nnonet/2/ctl", 2); 
	if(cfd < 0){ 
		close(fd); 
		fd = -1; 
		prerror("opening #nnonet/2/ctl"); 
		return -1; 
1990/0427    
	} 
	if(write(efd, "push noether", sizeof("push noether")-1)<0){ 
		prerror("push noether"); 
		return; 
1990/1127    
	if(write(cfd, a->cmd, strlen(a->cmd))<0){ 
		close(cfd); 
		close(fd); 
		fd = cfd = -1; 
		prerror(a->cmd); 
		return -1; 
1990/0427    
	} 
1990/0721    
	if(write(efd, "config nonet", sizeof("config nonet")-1)<0){ 
		prerror("config nonet"); 
		return; 
1990/1127    
	return fd; 
} 
 
int 
dkdial(char *arg) 
{ 
	int fd; 
	char cmd[64]; 
	static int mounted; 
 
	if(!mounted){ 
		/* 
		 *  grab the hsvme and configure it for a datakit 
		 */ 
		efd = open("#h/ctl", 2); 
		if(efd < 0){ 
			prerror("opening #h/ctl"); 
			return -1; 
		} 
		if(write(efd, "push dkmux", sizeof("push dkmux")-1)<0){ 
			close(efd); 
			prerror("push dkmux"); 
			return -1; 
		} 
		if(write(efd, "config 4 256 restart dk", sizeof("config 4 256 restart dk")-1)<0){ 
			close(efd); 
			prerror("config 4 256 restart dk"); 
			return -1; 
		} 
		mounted = 1; 
		sleep(2000);		/* wait for things to settle down */ 
1990/0721    
	} 
1990/0227    
 
	/* 
	 *  grab a nonet channel and call up the ross file server 
1990/1127    
	 *  grab a datakit channel and call up the file server 
1990/0227    
	 */ 
1990/0721    
	fd = open("#nnonet/2/data", 2); 
1990/1127    
	fd = open("#kdk/5/data", 2); 
1990/0427    
	if(fd < 0) { 
1990/0722    
		prerror("opening #nnonet/2/data"); 
1990/0427    
		return; 
1990/1127    
		prerror("opening #kdk/5/data"); 
		return -1; 
1990/0427    
	} 
1990/0721    
	cfd = open("#nnonet/2/ctl", 2); 
1990/1127    
	cfd = open("#kdk/5/ctl", 2); 
1990/0427    
	if(cfd < 0){ 
1990/0722    
		prerror("opening #nnonet/2/ctl"); 
1990/0427    
		return; 
1990/1127    
		close(fd); 
		fd = -1; 
		prerror("opening #kdk/5/ctl"); 
		return -1; 
1990/0427    
	} 
	if(write(cfd, scmd, strlen(scmd))<0){ 
		prerror(scmd); 
1990/1127    
	sprint(cmd, "connect %s", arg); 
	if(write(cfd, cmd, strlen(cmd))<0){ 
		close(cfd); 
		close(fd); 
		cfd = fd = -1; 
		prerror(cmd); 
		return -1; 
	} 
	return fd; 
} 
 
void 
boot(int ask) 
{ 
	int n, f, tries; 
	char *srvname; 
 
	if(ask){ 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
	} 
 
	for(tries = 0; tries < 5; tries++){ 
		fd = -1; 
		if(strncmp(sys, "bit!", 4) == 0) 
			fd = bitdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
		else if(strncmp(sys, "nonet!", 5) == 0) 
			fd = nonetdial(srvname = &sys[5]); 
		else 
			fd = nonetdial(srvname = sys); 
		if(fd >= 0) 
			break; 
		print("can't connect, retrying...\n"); 
		sleep(1000); 
	} 
	if(fd < 0){ 
		print("can't connect\n"); 
1990/0427    
		return; 
	} 
1990/0227    
 
    Mesg: 
	print("nop..."); 
	hdr.type = Tnop; 
1990/11211    
	hdr.tag = ~0; 
1990/1122/sys/src/9/power/boot.c:181,1911990/1127/sys/src/9/power/boot.c:271,284
1990/0427    
		prerror("write nop"); 
		return; 
	} 
1990/1127    
  reread: 
1990/0227    
	n = read(fd, buf, sizeof buf); 
1990/0427    
	if(n <= 0){ 
		prerror("read nop"); 
		return; 
	} 
1990/1127    
	if(n == 2) 
		goto reread; 
1990/0227    
	if(convM2S(buf, &hdr, n) == 0) { 
		print("n = %d; buf = %.2x %.2x %.2x %.2x\n", 
			n, buf[0], buf[1], buf[2], buf[3]); 
1990/1122/sys/src/9/power/boot.c:232,2381990/1127/sys/src/9/power/boot.c:325,331
1990/11211    
	} 
1990/0227    
 
	print("post..."); 
1990/0721    
	sprint(buf, "#s/%s", a->srvname); 
1990/1127    
	sprint(buf, "#s/%s", srvname); 
1990/0227    
	f = create(buf, 1, 0666); 
	if(f < 0) 
		error("create"); 
1990/1122/sys/src/9/power/boot.c:286,3111990/1127/sys/src/9/power/boot.c:379,384
1990/11211    
	errstr(buf); 
1990/0227    
	fprint(2, "boot: %s: %s\n", s, buf); 
	exits(0); 
1990/0427    
} 
                 
/* 
 *  lookup the address for a system 
 */ 
1990/0721    
Address * 
1990/0427    
lookup(char *arg) 
{ 
	Address *a; 
                 
	if(strcmp(arg, "?")==0 || strcmp(arg, "help")==0){ 
		for(a = addr; a->name; a++) 
			print("%s\n", a->name); 
		return 0; 
	} 
	for(a = addr; a->name; a++){ 
		if(strcmp(a->name, arg) == 0) 
1990/0721    
			return a; 
1990/0427    
	} 
	return 0; 
} 
 
/* 
1990/1127/sys/src/9/power/boot.c:6,171990/1202/sys/src/9/power/boot.c:6,16 (short | long)
1990/0427    
#define DEFFILE "/mips/9" 
 
1990/0227    
Fcall	hdr; 
1990/0427    
char	*sys; 
char	*scmd; 
char	*bootfile; 
1990/0227    
 
1990/0427    
char	sbuf[2*NAMELEN]; 
char	buf[4*1024]; 
1990/1202    
char	bootfile[5*NAMELEN]; 
char	sys[NAMELEN]; 
1990/0227    
 
1990/0427    
int fd; 
int cfd; 
1990/1127/sys/src/9/power/boot.c:35,411990/1202/sys/src/9/power/boot.c:34,40
1990/0427    
/* 
 *  predeclared 
 */ 
int	outin(char *, char *, char *, int); 
1990/1202    
int	outin(char *, char *, int); 
1990/0427    
void	prerror(char *); 
void	error(char *); 
void	boot(int); 
1990/1127/sys/src/9/power/boot.c:60,661990/1202/sys/src/9/power/boot.c:59,65
1990/0504    
	i = create("#e/sysname", 1, 0666); 
	if(i < 0) 
		error("sysname"); 
	if(write(i, argv[0], strlen(argv[0])) <= 0) 
1990/1202    
	if(write(i, argv[0], strlen(argv[0])) != strlen(argv[0])) 
1990/0504    
		error("sysname"); 
	close(i); 
1990/0427    
 
1990/1127/sys/src/9/power/boot.c:77,911990/1202/sys/src/9/power/boot.c:76,90
1990/0427    
			break; 
1990/0227    
	} 
1990/0427    
 
	sys = DEFSYS; 
	bootfile = DEFFILE; 
1990/1202    
	strcpy(sys, DEFSYS); 
	strcpy(bootfile, DEFFILE); 
1990/0427    
	switch(argc){ 
	case 1: 
		bootfile = argv[0]; 
1990/1202    
		strcpy(bootfile, argv[0]); 
1990/0427    
		break; 
	case 2: 
		bootfile = argv[0]; 
		sys = argv[1]; 
1990/1202    
		strcpy(bootfile, argv[0]); 
		strcpy(sys, argv[1]); 
1990/0427    
		break; 
1990/0227    
	} 
1990/0427    
 
1990/1127/sys/src/9/power/boot.c:238,2451990/1202/sys/src/9/power/boot.c:237,243
1990/1127    
	char *srvname; 
 
	if(ask){ 
		outin("server", sys, sbuf, sizeof(sbuf)); 
		sys = sbuf; 
1990/1202    
		outin("server", sys, sizeof(sys)); 
1990/1127    
	} 
 
	for(tries = 0; tries < 5; tries++){ 
1990/1127/sys/src/9/power/boot.c:248,2551990/1202/sys/src/9/power/boot.c:246,253
1990/1127    
			fd = bitdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
		else if(strncmp(sys, "nonet!", 5) == 0) 
			fd = nonetdial(srvname = &sys[5]); 
1990/1202    
		else if(strncmp(sys, "nonet!", 6) == 0) 
			fd = nonetdial(srvname = &sys[6]); 
1990/1127    
		else 
			fd = nonetdial(srvname = sys); 
		if(fd >= 0) 
1990/1127/sys/src/9/power/boot.c:385,3931990/1202/sys/src/9/power/boot.c:383,393
1990/0427    
 *  prompt and get input 
 */ 
int 
outin(char *prompt, char *def, char *buf, int len) 
1990/1202    
int 
outin(char *prompt, char *def, int len) 
1990/0427    
{ 
	int n; 
1990/1202    
	char buf[256]; 
1990/0427    
 
	do{ 
		print("%s[%s]: ", prompt, def); 
1990/1127/sys/src/9/power/boot.c:395,4031990/1202/sys/src/9/power/boot.c:395,403
1990/0427    
	}while(n==0); 
	if(n < 0) 
		error("can't read #c/cons; please reboot"); 
	if(n == 1) 
		strcpy(buf, def); 
	else 
1990/1202    
	if(n != 1){ 
1990/0427    
		buf[n-1] = 0; 
1990/1202    
		strcpy(def, buf); 
	} 
1990/0427    
	return n; 
1990/0227    
} 
1990/1202/sys/src/9/power/boot.c:5,101991/0108/sys/src/9/power/boot.c:5,13 (short | long)
1990/1127    
#define DEFSYS "bit!bootes" 
1990/0427    
#define DEFFILE "/mips/9" 
 
1991/0108    
char	*net; 
char	*netdev; 
 
1990/0227    
Fcall	hdr; 
1990/0427    
char	*scmd; 
1990/0227    
 
1990/1202/sys/src/9/power/boot.c:171,1761991/0108/sys/src/9/power/boot.c:174,181
1990/1127    
		prerror(a->cmd); 
		return -1; 
1990/0427    
	} 
1991/0108    
	net = "nonet"; 
	netdev = "#nnonet"; 
1990/1127    
	return fd; 
} 
 
1990/1202/sys/src/9/power/boot.c:227,2321991/0108/sys/src/9/power/boot.c:232,239
1990/1127    
		prerror(cmd); 
		return -1; 
	} 
1991/0108    
	net = "dk"; 
	netdev = "#kdk"; 
1990/1127    
	return fd; 
} 
 
1990/1202/sys/src/9/power/boot.c:346,3511991/0108/sys/src/9/power/boot.c:353,372
1990/0227    
		error("mount"); 
	print("success\n"); 
1990/0504    
	close(fd); 
1991/0108    
 
	if(net){ 
		char buf[128]; 
 
		fd = create("#e/bootnet", 1, 0666); 
		if(fd >= 0){ 
			if(write(fd, net, strlen(net)) != strlen(net)) 
				error("writing bootnet"); 
			close(fd); 
			sprint(buf, "/net/%s", net); 
			if(bind(netdev, buf, MREPL) < 0) 
				error("binding bootnet"); 
		} 
	} 
1990/0504    
 
	if(ask) 
1990/1122    
		execl("/mips/init", "init", "-m", 0); 
1991/0108/sys/src/9/power/boot.c:242,2471991/01151/sys/src/9/power/boot.c:242,249 (short | long)
1990/1127    
{ 
	int n, f, tries; 
	char *srvname; 
1991/01151    
	Dir dir; 
	char dirbuf[DIRLEN]; 
1990/1127    
 
	if(ask){ 
1990/1202    
		outin("server", sys, sizeof(sys)); 
1991/0108/sys/src/9/power/boot.c:351,3581991/01151/sys/src/9/power/boot.c:353,373
1990/0227    
		error("bind"); 
1990/11211    
	if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) 
1990/0227    
		error("mount"); 
1991/01151    
 
	/* 
	 * set the time from the access time of the root of the file server, 
	 * accessible as /.. 
	 */ 
	print("time..."); 
	if(stat("/..", dirbuf) < 0) 
		error("stat"); 
	convM2D(dirbuf, &dir); 
	f = open("#c/time", OWRITE); 
	sprint(dirbuf, "%ld", dir.atime); 
	write(f, dirbuf, strlen(dirbuf)); 
	close(f); 
 
1990/0227    
	print("success\n"); 
1990/0504    
	close(fd); 
1991/0108    
 
	if(net){ 
		char buf[128]; 
1991/01151/sys/src/9/power/boot.c:369,3861991/0131/sys/src/9/power/boot.c:369,385 (short | long)
1991/01151    
 
1990/0227    
	print("success\n"); 
1991/0108    
 
1991/0131    
	if(netdev){ 
		char buf[64]; 
		sprint(buf, "/net/%s", net); 
		bind(netdev, buf, MREPL); 
		bind(netdev, "/net/net", MREPL); 
	} 
1991/0108    
	if(net){ 
		char buf[128]; 
                 
		fd = create("#e/bootnet", 1, 0666); 
		if(fd >= 0){ 
			if(write(fd, net, strlen(net)) != strlen(net)) 
				error("writing bootnet"); 
			close(fd); 
			sprint(buf, "/net/%s", net); 
			if(bind(netdev, buf, MREPL) < 0) 
				error("binding bootnet"); 
		} 
1991/0131    
		char buf[64]; 
		sprint(buf, "/lib/netaddr.%s", net); 
		print("binding %s onto /lib/netaddr.net\n", buf); 
		bind(buf, "/lib/netaddr.net", MREPL); 
1991/0108    
	} 
1990/0504    
 
	if(ask) 
1991/0131/sys/src/9/power/boot.c:44,491991/0304/sys/src/9/power/boot.c:44,50 (short | long)
1990/1127    
int	dkdial(char *); 
int	nonetdial(char *); 
int	bitdial(char *); 
1991/0304    
int	preamble(int); 
1990/0227    
 
1990/0427    
/* 
 *  usage: 9b [-a] [server] [file] 
1991/0131/sys/src/9/power/boot.c:237,2741991/0304/sys/src/9/power/boot.c:238,295
1990/1127    
	return fd; 
} 
 
void 
boot(int ask) 
1991/0304    
int 
hotdial(char *arg) 
1990/1127    
{ 
	int n, f, tries; 
	char *srvname; 
1991/01151    
	Dir dir; 
	char dirbuf[DIRLEN]; 
1991/0304    
	int fd; 
	char srvdir[100]; 
	Waitmsg m; 
1990/1127    
 
	if(ask){ 
1990/1202    
		outin("server", sys, sizeof(sys)); 
1991/0304    
	/* 
	 * The killer: gotta get a hotrodboot running, so dial up 
	 * on datakit and load it. 
	 */ 
	fd = dkdial(arg); 
	if(fd < 0) 
		return -1; 
	if(!preamble(fd)){ 
		close(fd); 
		return -1; 
1990/1127    
	} 
                 
	for(tries = 0; tries < 5; tries++){ 
		fd = -1; 
		if(strncmp(sys, "bit!", 4) == 0) 
			fd = bitdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
1990/1202    
		else if(strncmp(sys, "nonet!", 6) == 0) 
			fd = nonetdial(srvname = &sys[6]); 
1990/1127    
		else 
			fd = nonetdial(srvname = sys); 
		if(fd >= 0) 
			break; 
		print("can't connect, retrying...\n"); 
		sleep(1000); 
1991/0304    
	/* 
	 * use /dev; it's local 
	 */ 
	if(mount(fd, "/dev", MREPL, "", "") < 0) 
		error("mount"); 
	switch(fork()){ 
	case 0: 
		/* 
		 * child: get hotrodboot running 
		 */ 
		execl("/dev/mips/bin/hotrodboot", "hotrodboot", "/dev/hobbit/hot", 0); 
		error("execl hotrodboot"); 
	case -1: 
		error("fork"); 
1990/1127    
	} 
	if(fd < 0){ 
		print("can't connect\n"); 
1990/0427    
		return; 
	} 
1991/0304    
	/* 
	 * parent: wait, then sleep a while 
	 */ 
	wait(&m); 
	if(m.msg[0]) 
		error(m.msg); 
	fprint(2, "sleep 3 seconds\n"); 
	sleep(3*1000); 
	fprint(2, "go for it....\n"); 
	return open("#H/hotrod", ORDWR); 
} 
1990/0227    
 
1991/0304    
 
 
int 
preamble(int fd) 
{ 
	int n; 
 
1990/0227    
	print("nop..."); 
	hdr.type = Tnop; 
1990/11211    
	hdr.tag = ~0; 
1991/0131/sys/src/9/power/boot.c:276,2881991/0304/sys/src/9/power/boot.c:297,309
1990/0427    
	if(write(fd, buf, n) != n){ 
		print("n = %d\n", n); 
		prerror("write nop"); 
		return; 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/1127    
  reread: 
1990/0227    
	n = read(fd, buf, sizeof buf); 
1990/0427    
	if(n <= 0){ 
		prerror("read nop"); 
		return; 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/1127    
	if(n == 2) 
		goto reread; 
1991/0131/sys/src/9/power/boot.c:290,3041991/0304/sys/src/9/power/boot.c:311,325
1990/0227    
		print("n = %d; buf = %.2x %.2x %.2x %.2x\n", 
			n, buf[0], buf[1], buf[2], buf[3]); 
1990/0427    
		prerror("format nop"); 
		return; 
1991/0304    
		return 0; 
1990/0227    
	} 
1990/0427    
	if(hdr.type != Rnop){ 
		prerror("not Rnop"); 
		return; 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/11211    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
		return; 
1991/0304    
		return 0; 
1990/11211    
	} 
1990/0227    
 
	print("session..."); 
1991/0131/sys/src/9/power/boot.c:307,3351991/0304/sys/src/9/power/boot.c:328,395
1990/0227    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
		return; 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/0227    
	n = read(fd, buf, sizeof buf); 
1990/0427    
	if(n <= 0){ 
		prerror("read session"); 
		return; 
1991/0304    
		return 0; 
1990/0427    
	} 
	if(convM2S(buf, &hdr, n) == 0){ 
		prerror("format session"); 
		return; 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/11211    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
1990/0427    
		return; 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/11211    
	if(hdr.type == Rerror){ 
		fprint(2, "boot: error %s\n", hdr.ename); 
1990/0427    
		return; 
1991/0304    
		return 0; 
1990/0227    
	} 
1990/11211    
	if(hdr.type != Rsession){ 
		prerror("not Rsession"); 
1991/0304    
		return 0; 
	} 
	return 1; 
} 
 
void 
boot(int ask) 
{ 
	int n, f, tries; 
	char *srvname; 
	Dir dir; 
	char dirbuf[DIRLEN]; 
 
	if(ask){ 
		outin("server", sys, sizeof(sys)); 
	} 
 
	for(tries = 0; tries < 5; tries++){ 
		fd = -1; 
		if(strncmp(sys, "bit!", 4) == 0) 
			fd = bitdial(srvname = &sys[4]); 
		if(strncmp(sys, "hot!", 4) == 0) 
			fd = hotdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
		else if(strncmp(sys, "nonet!", 6) == 0) 
			fd = nonetdial(srvname = &sys[6]); 
		else 
			fd = nonetdial(srvname = sys); 
		if(fd >= 0) 
			break; 
		print("can't connect, retrying...\n"); 
		sleep(1000); 
	} 
	if(fd < 0){ 
		print("can't connect\n"); 
1990/11211    
		return; 
	} 
1991/0304    
 
	if(!preamble(fd)) 
		return; 
1990/0227    
 
	print("post..."); 
1990/1127    
	sprint(buf, "#s/%s", srvname); 
1991/0304/sys/src/9/power/boot.c:370,3761991/0315/sys/src/9/power/boot.c:370,376 (short | long)
1991/0304    
		fd = -1; 
		if(strncmp(sys, "bit!", 4) == 0) 
			fd = bitdial(srvname = &sys[4]); 
		if(strncmp(sys, "hot!", 4) == 0) 
1991/0315    
		else if(strncmp(sys, "hot!", 4) == 0) 
1991/0304    
			fd = hotdial(srvname = &sys[4]); 
		else if(strncmp(sys, "dk!", 3) == 0) 
			fd = dkdial(srvname = &sys[3]); 
1991/0315/sys/src/9/power/boot.c:27,331991/0327/sys/src/9/power/boot.c:27,33 (short | long)
1990/0227    
 
Address addr[] = { 
1990/1127    
	{ "ross", "connect 020701005eff" }, 
	{ "bootes", "connect 080069020205" }, 
1991/0327    
	{ "bootes", "connect 0800690203f3" }, 
1990/1127    
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1991/0327/sys/src/9/power/boot.c:442,4511991/0418/sys/src/9/power/boot.c:442,462 (short | long)
1991/0131    
		bind(buf, "/lib/netaddr.net", MREPL); 
1991/0108    
	} 
1990/0504    
 
	if(ask) 
1991/0418    
	if(ask){ 
1990/1122    
		execl("/mips/init", "init", "-m", 0); 
1990/06111    
	else 
1990/1122    
		execl("/mips/init", "init", 0); 
1991/0418    
	} else { 
		switch(fork()){ 
		case -1: 
			print("can't start connection server\n"); 
			break; 
		case 0: 
			execl("/mips/init", "init", "-d", "/bin/cs", 0); 
			error("/mips/bin/cs"); 
			break; 
		default: 
			execl("/mips/init", "init", 0); 
		} 
	} 
1990/1122    
	error("/mips/init"); 
1990/0227    
} 
 
1991/0418/sys/src/9/power/boot.c:66,711991/0430/sys/src/9/power/boot.c:66,77 (short | long)
1990/1202    
	if(write(i, argv[0], strlen(argv[0])) != strlen(argv[0])) 
1990/0504    
		error("sysname"); 
	close(i); 
1991/0430    
	i = create("#e/terminal", 1, 0666); 
	if(i < 0) 
		error("terminal"); 
	if(write(i, "sgi power 4D", strlen("sgi power 4D")) < 0) 
		error("terminal"); 
	close(i); 
1990/0427    
 
	argv++; 
	argc--;	 
1991/0430/sys/src/9/power/boot.c:451,4671991/0507/sys/src/9/power/boot.c:451,457 (short | long)
1991/0418    
	if(ask){ 
1990/1122    
		execl("/mips/init", "init", "-m", 0); 
1991/0418    
	} else { 
		switch(fork()){ 
		case -1: 
			print("can't start connection server\n"); 
			break; 
		case 0: 
			execl("/mips/init", "init", "-d", "/bin/cs", 0); 
			error("/mips/bin/cs"); 
			break; 
		default: 
			execl("/mips/init", "init", 0); 
		} 
1991/0507    
		execl("/mips/init", "init", 0); 
1991/0418    
	} 
1990/1122    
	error("/mips/init"); 
1990/0227    
} 
1991/0507/sys/src/9/power/boot.c:31,361991/0509/sys/src/9/power/boot.c:31,37 (short | long)
1990/1127    
	{ "helix", "connect 080069020427" }, 
	{ "spindle", "connect 0800690202df" }, 
	{ "r70", "connect 08002b04265d" }, 
1991/0509    
	{ "fornax", "connect 00007701d2ba" }, 
1990/0227    
	{ 0 } 
}; 
 
1991/0509/sys/src/9/power/boot.c:369,3771991/0719/sys/src/9/power/boot.c:369,376 (short | long)
1991/0304    
	Dir dir; 
	char dirbuf[DIRLEN]; 
 
	if(ask){ 
1991/0719    
	if(ask) 
1991/0304    
		outin("server", sys, sizeof(sys)); 
	} 
 
	for(tries = 0; tries < 5; tries++){ 
		fd = -1; 
1991/0719/sys/src/9/power/boot.c:485,4911991/0806/sys/src/9/power/boot.c:485,490 (short | long)
1990/0427    
 *  prompt and get input 
 */ 
int 
1990/1202    
int 
outin(char *prompt, char *def, int len) 
1990/0427    
{ 
	int n; 
1991/0806/sys/src/9/power/boot.c:299,3051991/0820/sys/src/9/power/boot.c:299,305 (short | long)
1991/0304    
 
1990/0227    
	print("nop..."); 
	hdr.type = Tnop; 
1990/11211    
	hdr.tag = ~0; 
1991/0820    
	hdr.tag = NOTAG; 
1990/0227    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		print("n = %d\n", n); 
1991/0806/sys/src/9/power/boot.c:324,3371991/0820/sys/src/9/power/boot.c:324,337
1990/0427    
		prerror("not Rnop"); 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/11211    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
1991/0820    
	if(hdr.tag != NOTAG){ 
		prerror("tag not NOTAG"); 
1991/0304    
		return 0; 
1990/11211    
	} 
1990/0227    
 
	print("session..."); 
	hdr.type = Tsession; 
1990/11211    
	hdr.tag = ~0; 
1991/0820    
	hdr.tag = NOTAG; 
1990/0227    
	n = convS2M(&hdr, buf); 
1990/0427    
	if(write(fd, buf, n) != n){ 
		prerror("write session"); 
1991/0806/sys/src/9/power/boot.c:346,3531991/0820/sys/src/9/power/boot.c:346,353
1990/0427    
		prerror("format session"); 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/11211    
	if(hdr.tag != ~0){ 
		prerror("tag not ~0"); 
1991/0820    
	if(hdr.tag != NOTAG){ 
		prerror("tag not NOTAG"); 
1991/0304    
		return 0; 
1990/0427    
	} 
1990/11211    
	if(hdr.type == Rerror){ 
Too many diffs (26 > 25). Stopping.


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)