xref: /plan9-contrib/sys/src/9k/boot/embed.c (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1*9ef1f84bSDavid du Colombier #include <u.h>
2*9ef1f84bSDavid du Colombier #include <libc.h>
3*9ef1f84bSDavid du Colombier #include <../boot/boot.h>
4*9ef1f84bSDavid du Colombier 
5*9ef1f84bSDavid du Colombier static char *paqfile;
6*9ef1f84bSDavid du Colombier 
7*9ef1f84bSDavid du Colombier void
configembed(Method * m)8*9ef1f84bSDavid du Colombier configembed(Method *m)
9*9ef1f84bSDavid du Colombier {
10*9ef1f84bSDavid du Colombier 	if(*sys == '/' || *sys == '#'){
11*9ef1f84bSDavid du Colombier 		/*
12*9ef1f84bSDavid du Colombier 		 *  if the user specifies the disk in the boot cmd or
13*9ef1f84bSDavid du Colombier 		 * 'root is from' prompt, use it
14*9ef1f84bSDavid du Colombier 		 */
15*9ef1f84bSDavid du Colombier 		paqfile = sys;
16*9ef1f84bSDavid du Colombier 	} else if(m->arg){
17*9ef1f84bSDavid du Colombier 		/*
18*9ef1f84bSDavid du Colombier 		 *  a default is supplied when the kernel is made
19*9ef1f84bSDavid du Colombier 		 */
20*9ef1f84bSDavid du Colombier 		paqfile = m->arg;
21*9ef1f84bSDavid du Colombier 	}
22*9ef1f84bSDavid du Colombier }
23*9ef1f84bSDavid du Colombier 
24*9ef1f84bSDavid du Colombier int
connectembed(void)25*9ef1f84bSDavid du Colombier connectembed(void)
26*9ef1f84bSDavid du Colombier {
27*9ef1f84bSDavid du Colombier 	int i, p[2];
28*9ef1f84bSDavid du Colombier 	Dir *dir;
29*9ef1f84bSDavid du Colombier 	char **arg, **argp;
30*9ef1f84bSDavid du Colombier 
31*9ef1f84bSDavid du Colombier 	dir = dirstat("/boot/paqfs");
32*9ef1f84bSDavid du Colombier 	if(dir == nil)
33*9ef1f84bSDavid du Colombier 		return -1;
34*9ef1f84bSDavid du Colombier 	free(dir);
35*9ef1f84bSDavid du Colombier 
36*9ef1f84bSDavid du Colombier 	dir = dirstat(paqfile);
37*9ef1f84bSDavid du Colombier 	if(dir == nil || dir->mode & DMDIR)
38*9ef1f84bSDavid du Colombier 		return -1;
39*9ef1f84bSDavid du Colombier 	free(dir);
40*9ef1f84bSDavid du Colombier 
41*9ef1f84bSDavid du Colombier 	print("paqfs...");
42*9ef1f84bSDavid du Colombier 	if(bind("#c", "/dev", MREPL) < 0)
43*9ef1f84bSDavid du Colombier 		fatal("bind #c");
44*9ef1f84bSDavid du Colombier 	if(bind("#p", "/proc", MREPL) < 0)
45*9ef1f84bSDavid du Colombier 		fatal("bind #p");
46*9ef1f84bSDavid du Colombier 	if(pipe(p)<0)
47*9ef1f84bSDavid du Colombier 		fatal("pipe");
48*9ef1f84bSDavid du Colombier 	switch(fork()){
49*9ef1f84bSDavid du Colombier 	case -1:
50*9ef1f84bSDavid du Colombier 		fatal("fork");
51*9ef1f84bSDavid du Colombier 	case 0:
52*9ef1f84bSDavid du Colombier 		arg = malloc((bargc+5)*sizeof(char*));
53*9ef1f84bSDavid du Colombier 		argp = arg;
54*9ef1f84bSDavid du Colombier 		*argp++ = "/boot/paqfs";
55*9ef1f84bSDavid du Colombier 		*argp++ = "-iv";
56*9ef1f84bSDavid du Colombier 		*argp++ = paqfile;
57*9ef1f84bSDavid du Colombier 		for(i=1; i<bargc; i++)
58*9ef1f84bSDavid du Colombier 			*argp++ = bargv[i];
59*9ef1f84bSDavid du Colombier 		*argp = 0;
60*9ef1f84bSDavid du Colombier 
61*9ef1f84bSDavid du Colombier 		dup(p[0], 0);
62*9ef1f84bSDavid du Colombier 		dup(p[1], 1);
63*9ef1f84bSDavid du Colombier 		close(p[0]);
64*9ef1f84bSDavid du Colombier 		close(p[1]);
65*9ef1f84bSDavid du Colombier 		exec("/boot/paqfs", arg);
66*9ef1f84bSDavid du Colombier 		fatal("can't exec paqfs");
67*9ef1f84bSDavid du Colombier 	default:
68*9ef1f84bSDavid du Colombier 		break;
69*9ef1f84bSDavid du Colombier 	}
70*9ef1f84bSDavid du Colombier 	waitpid();
71*9ef1f84bSDavid du Colombier 
72*9ef1f84bSDavid du Colombier 	close(p[1]);
73*9ef1f84bSDavid du Colombier 	return p[0];
74*9ef1f84bSDavid du Colombier }
75