123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #include <u.h>
- #include <libc.h>
- #include <../boot/boot.h>
- static char diskname[64];
- static char *disk;
- static char **args;
- void
- configlocal(Method *mp)
- {
- char *p;
- int n;
- if(*sys == '/' || *sys == '#'){
- /*
- * if the user specifies the disk in the boot cmd or
- * 'root is from' prompt, use it
- */
- disk = sys;
- } else if(strncmp(argv0, "dksc(0,", 7) == 0){
- /*
- * on many mips arg0 of the boot command specifies the
- * scsi logical unit number
- */
- p = strchr(argv0, ',');
- n = strtoul(p+1, 0, 10);
- sprint(diskname, "#w%d/sd%dfs", n, n);
- disk = diskname;
- } else if(mp->arg){
- /*
- * a default is supplied when the kernel is made
- */
- disk = mp->arg;
- } else if(*bootdisk){
- /*
- * an environment variable from a pc's plan9.ini or
- * from the mips nvram or generated by the kernel
- * is the last resort.
- */
- disk = bootdisk;
- }
- /* if we've decided on one, pass it on to all programs */
- if(disk)
- setenv("bootdisk", disk);
- USED(mp);
- }
- int
- connectlocal(void)
- {
- int i, p[2];
- Dir *dir;
- char partition[64];
- char *dev;
- char **arg, **argp;
- ulong mode;
- if(stat("/boot/kfs", statbuf, sizeof statbuf) < 0)
- return -1;
- dev = disk ? disk : bootdisk;
- snprint(partition, sizeof partition, "%sfs", dev);
- dir = dirstat(partition);
- if(dir == nil){
- strcpy(partition, dev);
- dir = dirstat(partition);
- if(dir == nil)
- return -1;
- }
- mode = dir->mode;
- free(dir);
- if(mode & DMDIR)
- return -1;
- print("kfs...");
- if(bind("#c", "/dev", MREPL) < 0)
- fatal("bind #c");
- if(bind("#p", "/proc", MREPL) < 0)
- fatal("bind #p");
- if(pipe(p)<0)
- fatal("pipe");
- switch(fork()){
- case -1:
- fatal("fork");
- case 0:
- arg = malloc((bargc+5)*sizeof(char*));
- argp = arg;
- *argp++ = "kfs";
- *argp++ = "-f";
- *argp++ = partition;
- *argp++ = "-s";
- for(i=1; i<bargc; i++)
- *argp++ = bargv[i];
- *argp = 0;
- dup(p[0], 0);
- dup(p[1], 1);
- close(p[0]);
- close(p[1]);
- exec("/boot/kfs", arg);
- fatal("can't exec kfs");
- default:
- break;
- }
- waitpid();
- close(p[1]);
- return p[0];
- }
|