xref: /plan9/sys/src/9/boot/local.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <../boot/boot.h>
43e12c5d1SDavid du Colombier 
5*219b2ee8SDavid du Colombier static char diskname[2*NAMELEN];
63e12c5d1SDavid du Colombier static char *disk;
73e12c5d1SDavid du Colombier 
8*219b2ee8SDavid du Colombier /*
9*219b2ee8SDavid du Colombier  *  This is complete black magic to guess what physical disk the file
10*219b2ee8SDavid du Colombier  *  system is on.  The reason for all the variation is because the
11*219b2ee8SDavid du Colombier  *  info comes in totally different forms from each type of system.
12*219b2ee8SDavid du Colombier  */
133e12c5d1SDavid du Colombier void
143e12c5d1SDavid du Colombier configlocal(Method *mp)
153e12c5d1SDavid du Colombier {
16*219b2ee8SDavid du Colombier 	char *p;
17*219b2ee8SDavid du Colombier 	int n;
18*219b2ee8SDavid du Colombier 
19*219b2ee8SDavid du Colombier 	if(*sys == '/' || *sys == '#'){
20*219b2ee8SDavid du Colombier 		/*
21*219b2ee8SDavid du Colombier 		 *  if the user specifies the disk in the boot cmd or
22*219b2ee8SDavid du Colombier 		 * 'root is from' prompt, use it
23*219b2ee8SDavid du Colombier 		 */
243e12c5d1SDavid du Colombier 		disk = sys;
25*219b2ee8SDavid du Colombier 	} else if(strncmp(argv0, "dksc(0,", 7) == 0){
26*219b2ee8SDavid du Colombier 		/*
27*219b2ee8SDavid du Colombier 		 *  on many mips arg0 of the boot command specifies the
28*219b2ee8SDavid du Colombier 		 *  scsi logical unit number
29*219b2ee8SDavid du Colombier 		 */
30*219b2ee8SDavid du Colombier 		p = strchr(argv0, ',');
31*219b2ee8SDavid du Colombier 		n = strtoul(p+1, 0, 10);
32*219b2ee8SDavid du Colombier 		sprint(diskname, "#w%d/sd%dfs", n, n);
33*219b2ee8SDavid du Colombier 		disk = diskname;
34*219b2ee8SDavid du Colombier 	} else if(mp->arg){
35*219b2ee8SDavid du Colombier 		/*
36*219b2ee8SDavid du Colombier 		 *  a default is supplied when the kernel is made
37*219b2ee8SDavid du Colombier 		 */
383e12c5d1SDavid du Colombier 		disk = mp->arg;
39*219b2ee8SDavid du Colombier 	} else if(*bootdisk){
40*219b2ee8SDavid du Colombier 		/*
41*219b2ee8SDavid du Colombier 		 *  an environment variable from a pc's plan9.ini or
42*219b2ee8SDavid du Colombier 		 *  from the mips nvram or generated by the kernel
43*219b2ee8SDavid du Colombier 		 *  is the last resort.
44*219b2ee8SDavid du Colombier 		 */
45*219b2ee8SDavid du Colombier 		disk = bootdisk;
46*219b2ee8SDavid du Colombier 	}
47*219b2ee8SDavid du Colombier 
48*219b2ee8SDavid du Colombier 	/* if we've decided on one, pass it on to all programs */
49*219b2ee8SDavid du Colombier 	if(disk)
50*219b2ee8SDavid du Colombier 		setenv("bootdisk", disk);
51*219b2ee8SDavid du Colombier 
523e12c5d1SDavid du Colombier 	USED(mp);
533e12c5d1SDavid du Colombier }
543e12c5d1SDavid du Colombier 
553e12c5d1SDavid du Colombier int
563e12c5d1SDavid du Colombier authlocal(void)
573e12c5d1SDavid du Colombier {
583e12c5d1SDavid du Colombier 	return -1;
593e12c5d1SDavid du Colombier }
603e12c5d1SDavid du Colombier 
613e12c5d1SDavid du Colombier int
623e12c5d1SDavid du Colombier connectlocal(void)
633e12c5d1SDavid du Colombier {
643e12c5d1SDavid du Colombier 	int p[2];
653e12c5d1SDavid du Colombier 	char d[DIRLEN];
663e12c5d1SDavid du Colombier 	char partition[2*NAMELEN];
67*219b2ee8SDavid du Colombier 	char *args[16], **argp;
68*219b2ee8SDavid du Colombier 	char *dfl;
693e12c5d1SDavid du Colombier 
70*219b2ee8SDavid du Colombier 	dfl = "/fs";
713e12c5d1SDavid du Colombier 
72*219b2ee8SDavid du Colombier 	sprint(partition, "%sfs", disk);
733e12c5d1SDavid du Colombier 	if(stat(partition, d) < 0){
74*219b2ee8SDavid du Colombier 		strcpy(partition, disk);
75*219b2ee8SDavid du Colombier 		if(stat(partition, d) < 0) {
763e12c5d1SDavid du Colombier 			return -1;
773e12c5d1SDavid du Colombier 		}
78*219b2ee8SDavid du Colombier 	}
793e12c5d1SDavid du Colombier 
803e12c5d1SDavid du Colombier 	print("fs...");
813e12c5d1SDavid du Colombier 	if(bind("#c", "/dev", MREPL) < 0)
823e12c5d1SDavid du Colombier 		fatal("bind #c");
833e12c5d1SDavid du Colombier 	if(bind("#p", "/proc", MREPL) < 0)
843e12c5d1SDavid du Colombier 		fatal("bind #p");
853e12c5d1SDavid du Colombier 	if(pipe(p)<0)
863e12c5d1SDavid du Colombier 		fatal("pipe");
873e12c5d1SDavid du Colombier 	switch(fork()){
883e12c5d1SDavid du Colombier 	case -1:
893e12c5d1SDavid du Colombier 		fatal("fork");
903e12c5d1SDavid du Colombier 	case 0:
913e12c5d1SDavid du Colombier 		dup(p[0], 0);
923e12c5d1SDavid du Colombier 		dup(p[1], 1);
933e12c5d1SDavid du Colombier 		close(p[0]);
943e12c5d1SDavid du Colombier 		close(p[1]);
95*219b2ee8SDavid du Colombier 		argp = args;
96*219b2ee8SDavid du Colombier 		*argp++ = "fs";
97*219b2ee8SDavid du Colombier 		*argp++ = "-f";
98*219b2ee8SDavid du Colombier 		*argp++ = partition;
99*219b2ee8SDavid du Colombier 		*argp++ = "-s";
100*219b2ee8SDavid du Colombier 		*argp = 0;
101*219b2ee8SDavid du Colombier 		exec(dfl, args);
1023e12c5d1SDavid du Colombier 		fatal("can't exec fs");
1033e12c5d1SDavid du Colombier 	default:
1043e12c5d1SDavid du Colombier 		break;
1053e12c5d1SDavid du Colombier 	}
1063e12c5d1SDavid du Colombier 
1073e12c5d1SDavid du Colombier 	close(p[1]);
1083e12c5d1SDavid du Colombier 	return p[0];
1093e12c5d1SDavid du Colombier }
110