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