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