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