xref: /plan9/sys/src/9/boot/embed.c (revision 6a9fc400c33447ef5e1cda7185cb4de2c8e8010e)
13ff48bf5SDavid du Colombier #include <u.h>
23ff48bf5SDavid du Colombier #include <libc.h>
33ff48bf5SDavid du Colombier #include <../boot/boot.h>
43ff48bf5SDavid du Colombier 
53ff48bf5SDavid du Colombier static char *paqfile;
63ff48bf5SDavid du Colombier 
73ff48bf5SDavid du Colombier void
configembed(Method * m)83ff48bf5SDavid du Colombier configembed(Method *m)
93ff48bf5SDavid du Colombier {
103ff48bf5SDavid du Colombier 	if(*sys == '/' || *sys == '#'){
113ff48bf5SDavid du Colombier 		/*
123ff48bf5SDavid du Colombier 		 *  if the user specifies the disk in the boot cmd or
133ff48bf5SDavid du Colombier 		 * 'root is from' prompt, use it
143ff48bf5SDavid du Colombier 		 */
153ff48bf5SDavid du Colombier 		paqfile = sys;
163ff48bf5SDavid du Colombier 	} else if(m->arg){
173ff48bf5SDavid du Colombier 		/*
183ff48bf5SDavid du Colombier 		 *  a default is supplied when the kernel is made
193ff48bf5SDavid du Colombier 		 */
203ff48bf5SDavid du Colombier 		paqfile = m->arg;
213ff48bf5SDavid du Colombier 	}
223ff48bf5SDavid du Colombier }
233ff48bf5SDavid du Colombier 
243ff48bf5SDavid du Colombier int
connectembed(void)253ff48bf5SDavid du Colombier connectembed(void)
263ff48bf5SDavid du Colombier {
273ff48bf5SDavid du Colombier 	int i, p[2];
283ff48bf5SDavid du Colombier 	Dir *dir;
293ff48bf5SDavid du Colombier 	char **arg, **argp;
303ff48bf5SDavid du Colombier 
31*6a9fc400SDavid du Colombier 	dir = dirstat("/boot/paqfs");
323ff48bf5SDavid du Colombier 	if(dir == nil)
333ff48bf5SDavid du Colombier 		return -1;
343ff48bf5SDavid du Colombier 	free(dir);
353ff48bf5SDavid du Colombier 
363ff48bf5SDavid du Colombier 	dir = dirstat(paqfile);
373ff48bf5SDavid du Colombier 	if(dir == nil || dir->mode & DMDIR)
383ff48bf5SDavid du Colombier 		return -1;
393ff48bf5SDavid du Colombier 	free(dir);
403ff48bf5SDavid du Colombier 
413ff48bf5SDavid du Colombier 	print("paqfs...");
423ff48bf5SDavid du Colombier 	if(bind("#c", "/dev", MREPL) < 0)
433ff48bf5SDavid du Colombier 		fatal("bind #c");
443ff48bf5SDavid du Colombier 	if(bind("#p", "/proc", MREPL) < 0)
453ff48bf5SDavid du Colombier 		fatal("bind #p");
463ff48bf5SDavid du Colombier 	if(pipe(p)<0)
473ff48bf5SDavid du Colombier 		fatal("pipe");
483ff48bf5SDavid du Colombier 	switch(fork()){
493ff48bf5SDavid du Colombier 	case -1:
503ff48bf5SDavid du Colombier 		fatal("fork");
513ff48bf5SDavid du Colombier 	case 0:
523ff48bf5SDavid du Colombier 		arg = malloc((bargc+5)*sizeof(char*));
533ff48bf5SDavid du Colombier 		argp = arg;
54*6a9fc400SDavid du Colombier 		*argp++ = "/boot/paqfs";
553ff48bf5SDavid du Colombier 		*argp++ = "-iv";
563ff48bf5SDavid du Colombier 		*argp++ = paqfile;
573ff48bf5SDavid du Colombier 		for(i=1; i<bargc; i++)
583ff48bf5SDavid du Colombier 			*argp++ = bargv[i];
593ff48bf5SDavid du Colombier 		*argp = 0;
603ff48bf5SDavid du Colombier 
613ff48bf5SDavid du Colombier 		dup(p[0], 0);
623ff48bf5SDavid du Colombier 		dup(p[1], 1);
633ff48bf5SDavid du Colombier 		close(p[0]);
643ff48bf5SDavid du Colombier 		close(p[1]);
65*6a9fc400SDavid du Colombier 		exec("/boot/paqfs", arg);
663ff48bf5SDavid du Colombier 		fatal("can't exec paqfs");
673ff48bf5SDavid du Colombier 	default:
683ff48bf5SDavid du Colombier 		break;
693ff48bf5SDavid du Colombier 	}
703ff48bf5SDavid du Colombier 	waitpid();
713ff48bf5SDavid du Colombier 
723ff48bf5SDavid du Colombier 	close(p[1]);
733ff48bf5SDavid du Colombier 	return p[0];
743ff48bf5SDavid du Colombier }
75