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

2001/0527/boot/boot.c (diff list | history)

2001/0301/sys/src/9/boot/boot.c:4,122001/0527/sys/src/9/boot/boot.c:4,11 (short | long | prev | next)
1993/0501    
#include <fcall.h> 
1992/0318    
#include "../boot/boot.h" 
1992/0317    
 
char	cputype[NAMELEN]; 
char	sys[2*NAMELEN]; 
char	username[NAMELEN]; 
2001/0527    
char	cputype[64]; 
char	sys[2*64]; 
1994/0317    
char 	reply[256]; 
1993/0501    
int	printcol; 
int	mflag; 
2001/0301/sys/src/9/boot/boot.c:17,342001/0527/sys/src/9/boot/boot.c:16,32
1994/0317    
int	bargc; 
 
1992/0530    
static void	swapproc(void); 
1993/0501    
static void	recover(Method*); 
1992/0530    
static Method	*rootserver(char*); 
1992/0317    
 
1995/0301    
static int 
1996/0214    
rconv(va_list *arg, Fconv *fp) 
1995/0301    
{ 
	char s[ERRLEN]; 
2001/0527    
	char s[ERRMAX]; 
1995/0301    
 
1996/0214    
	USED(arg); 
1995/0301    
 
	s[0] = 0; 
	errstr(s); 
2001/0527    
	s[0] = '\0'; 
	errstr(s, sizeof s); 
1995/0301    
	strconv(s, fp); 
	return 0; 
} 
2001/0301/sys/src/9/boot/boot.c:38,472001/0527/sys/src/9/boot/boot.c:36,48
1992/0317    
{ 
	int fd; 
	Method *mp; 
2001/0217    
	char *cmd, cmdbuf[64], *iargv[16]; 
2001/0527    
	char cmd[64]; 
2000/0310    
	char rootbuf[64]; 
2001/0217    
	int islocal, ishybrid, iargc; 
2001/0527    
	char flags[6]; 
	int islocal, ishybrid; 
2000/0310    
	char *rp; 
2001/0527    
	int n; 
	char buf[32]; 
1992/0317    
 
	sleep(1000); 
 
2001/0301/sys/src/9/boot/boot.c:90,1042001/0527/sys/src/9/boot/boot.c:91,96
1992/0317    
	 */ 
1992/0318    
	(*pword)(islocal, mp); 
1992/0317    
 
1993/0501    
	switch(rfork(RFPROC|RFNAMEG|RFFDG)) { 
	case -1: 
		print("failed to start recover: %r\n"); 
		break; 
	case 0: 
		recover(mp); 
		break; 
	} 
                 
1992/0317    
	/* 
	 *  connect to the root file system 
	 */ 
2001/0301/sys/src/9/boot/boot.c:105,1112001/0527/sys/src/9/boot/boot.c:97,110
1992/0317    
	fd = (*mp->connect)(); 
	if(fd < 0) 
		fatal("can't connect to file server"); 
1993/0501    
	nop(fd); 
2001/0527    
	if(getenv("srvold9p")) 
		fd = old9p(fd); 
	print("version..."); 
	buf[0] = '\0'; 
	n = fversion(fd, 0, buf, sizeof buf); 
	if(n < 0) 
		fatal("can't init 9P"); 
	print("(%.*s)", n, buf); 
1992/0909    
	if(!islocal && !ishybrid){ 
1992/0318    
		if(cfs) 
			fd = (*cfs)(fd); 
2001/0301/sys/src/9/boot/boot.c:151,1612001/0527/sys/src/9/boot/boot.c:150,159
1992/0611    
	 *  if a local file server exists and it's not 
	 *  running, start it and mount it onto /n/kfs 
1992/0317    
	 */ 
1992/1006    
	if(access("#s/kfs", 0) < 0){ 
2001/0527    
	if(0 && access("#s/kfs", 0) < 0){	/* BUG: DISABLED UNTIL KFS SUPPORTS 9P2000 */ 
1992/0902    
		for(mp = method; mp->name; mp++){ 
			if(strcmp(mp->name, "local") != 0) 
				continue; 
2000/1019    
			bargc = 1; 
1992/0902    
			(*mp->config)(mp); 
			fd = (*mp->connect)(); 
			if(fd < 0) 
2001/0301/sys/src/9/boot/boot.c:169,1922001/0527/sys/src/9/boot/boot.c:167,175
1992/0317    
	settime(islocal); 
	swapproc(); 
 
2001/0217    
	cmd = getenv("init"); 
	if(cmd == nil){ 
		sprint(cmdbuf, "/%s/init -%s%s", cputype, 
			cpuflag ? "c" : "t", mflag ? "m" : ""); 
		cmd = cmdbuf; 
	} 
	iargc = tokenize(cmd, iargv, nelem(iargv)-1); 
	cmd = iargv[0]; 
                 
	/* make iargv[0] basename(iargv[0]) */ 
	if(iargv[0] = strrchr(iargv[0], '/')) 
		iargv[0]++; 
	else 
		iargv[0] = cmd; 
                 
	iargv[iargc] = nil; 
                 
	exec(cmd, iargv); 
2001/0527    
	sprint(cmd, "/%s/ninit", cputype); 
	sprint(flags, "-%s%s", cpuflag ? "c" : "t", mflag ? "m" : ""); 
	execl(cmd, "init", flags, 0); 
1992/0317    
	fatal(cmd); 
} 
 
2001/0301/sys/src/9/boot/boot.c:213,2462001/0527/sys/src/9/boot/boot.c:196,201
1994/0311    
	return 0; 
} 
 
2000/1107    
int 
parsecmd(char *s, char **av, int n) 
{ 
	int ac; 
                 
	n--; 
	for(ac = 0; ac < n; ac++){ 
		while(*s == ' ' || *s == '\t') 
			s++; 
		if(*s == 0 || *s == '\n' || *s == '\r') 
			break; 
		if(*s == '\''){ 
			s++; 
			av[ac] = s; 
			while(*s && *s != '\'') 
				s++; 
		} else { 
			av[ac] = s; 
			while(*s && *s != ' ' && *s != '\t') 
				s++; 
		} 
		if(*s != 0) 
			*s++ = 0; 
	} 
	av[ac] = 0; 
	return ac; 
} 
                 
1992/0317    
/* 
1992/0318    
 *  ask user from whence cometh the root file system 
1992/0317    
 */ 
2001/0301/sys/src/9/boot/boot.c:276,2822001/0527/sys/src/9/boot/boot.c:231,237
1995/02021    
		outin(prompt, reply, sizeof(reply)); 
1994/0311    
		mp = findmethod(reply); 
		if(mp){ 
2000/1107    
			bargc = parsecmd(reply, bargv, Nbarg); 
2001/0527    
			bargc = getfields(reply, bargv, Nbarg-1, 1, " "); 
1994/0311    
			cp = strchr(reply, '!'); 
			if(cp) 
				strcpy(sys, cp+1); 
2001/0301/sys/src/9/boot/boot.c:287,3302001/0527/sys/src/9/boot/boot.c:242,247
1992/0520    
	return 0;		/* not reached */ 
1992/0317    
} 
 
1993/0501    
int 
nop(int fd) 
{ 
	int n; 
	Fcall hdr; 
	char buf[128]; 
                 
	print("boot: nop..."); 
	hdr.type = Tnop; 
	hdr.tag = NOTAG; 
	n = convS2M(&hdr, buf); 
	if(write(fd, buf, n) != n){ 
		fatal("write nop"); 
		return 0; 
	} 
reread: 
	n = read(fd, buf, sizeof buf); 
	if(n <= 0){ 
		fatal("read nop"); 
		return 0; 
	} 
	if(n == 2) 
		goto reread; 
	if(convM2S(buf, &hdr, n) == 0) { 
		fatal("format nop"); 
		return 0; 
	} 
	if(hdr.type != Rnop){ 
		fatal("not Rnop"); 
		return 0; 
	} 
	if(hdr.tag != NOTAG){ 
		fatal("tag not NOTAG"); 
		return 0; 
	} 
	return 1; 
} 
                 
1992/0530    
static void 
1992/0317    
swapproc(void) 
{ 
2001/0301/sys/src/9/boot/boot.c:340,4182001/0527/sys/src/9/boot/boot.c:257,285
1993/0501    
	close(fd); 
} 
 
void 
reattach(int rec, Method *amp, char *buf) 
2001/0527    
int 
old9p(int fd) 
1993/0501    
{ 
	char *mp; 
	int fd, n, sv[2]; 
	char tmp[64], *p; 
2001/0527    
	int p[2]; 
1993/0501    
 
	mp = strchr(buf, ' '); 
	if(mp == 0) 
		goto fail; 
	*mp++ = '\0'; 
2001/0527    
	if(pipe(p) < 0) 
		fatal("pipe"); 
1993/0501    
 
	p = strrchr(buf, '/'); 
	if(p == 0) 
		goto fail; 
1994/1212    
                 
1993/0501    
	*p = '\0'; 
                 
	sprint(tmp, "%s/remote", buf); 
	fd = open(tmp, OREAD); 
	if(fd < 0) 
		goto fail; 
1994/1212    
                 
1993/0501    
	n = read(fd, tmp, sizeof(tmp)); 
	if(n < 0) 
		goto fail; 
1994/1212    
                 
1993/0501    
	close(fd); 
	tmp[n-1] = '\0'; 
                 
1994/0829    
	print("boot: Service %s!%s down, wait...\n", buf, tmp); 
1993/0501    
                 
	p = strrchr(buf, '/'); 
	if(p == 0) 
		goto fail; 
	*p = '\0'; 
                 
	while(plumb(buf, tmp, sv, 0) < 0) 
		sleep(30); 
                 
	nop(sv[1]); 
	doauthenticate(sv[1], amp); 
                 
1994/0829    
	print("\nboot: Service %s Ok\n", tmp); 
1993/0501    
                 
	n = sprint(tmp, "%d %s", sv[1], mp); 
	if(write(rec, tmp, n) < 0) { 
		errstr(tmp); 
		print("write recover: %s\n", tmp); 
2001/0527    
	print("srvold9p..."); 
	switch(fork()) { 
	case -1: 
		fatal("rfork srvold9p"); 
	case 0: 
		dup(fd, 1); 
		close(fd); 
		dup(p[0], 0); 
		close(p[0]); 
		close(p[1]); 
		execl("/srvold9p", "srvold9p", "-s", 0); 
		fatal("exec srvold9p"); 
	default: 
		close(fd); 
		close(p[0]); 
1993/0501    
	} 
	exits(0); 
fail: 
	print("recover fail: %s\n", buf); 
	exits(0); 
} 
                 
1995/1122    
static void 
1993/0501    
recover(Method *mp) 
{ 
	int fd, n; 
	char buf[256]; 
                 
	fd = open("#/./recover", ORDWR); 
	if(fd < 0) 
		exits(0); 
                 
	for(;;) { 
		n = read(fd, buf, sizeof(buf)); 
		if(n < 0) 
			exits(0); 
		buf[n] = '\0'; 
                 
		if(fork() == 0) 
			reattach(fd, mp, buf); 
	} 
2001/0527    
	return p[1];	 
1992/0317    
} 


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