diff options
author | iru <devnull@localhost> | 2011-04-16 17:42:16 -0300 |
---|---|---|
committer | iru <devnull@localhost> | 2011-04-16 17:42:16 -0300 |
commit | 478d1024433f8713927729f02285682af0e0cf9b (patch) | |
tree | 79f6fd59cf1a46a1eb5d5c980178b09dda705185 /sys/src/9/boot/boot.c | |
parent | 4d4fc2ca3453a4deb79b26eb62449eab94b86827 (diff) |
Initial import of the new boot(8). Change pccd and pcf to use it.
Diffstat (limited to 'sys/src/9/boot/boot.c')
-rw-r--r-- | sys/src/9/boot/boot.c | 336 |
1 files changed, 34 insertions, 302 deletions
diff --git a/sys/src/9/boot/boot.c b/sys/src/9/boot/boot.c index db181a09d..74b18a482 100644 --- a/sys/src/9/boot/boot.c +++ b/sys/src/9/boot/boot.c @@ -5,43 +5,20 @@ #include "../boot/boot.h" char cputype[64]; -char sys[2*64]; char reply[256]; int printcol; int mflag; int fflag; int kflag; -char *bargv[Nbarg]; -int bargc; - -static void swapproc(void); -static Method *rootserver(char*); -static void usbinit(void); -static void kbmap(void); - void boot(int argc, char *argv[]) { - int fd, afd; - Method *mp; - char *cmd, cmdbuf[64], *iargv[16]; - char rootbuf[64]; - int islocal, ishybrid; - char *rp, *rsp; - int iargc, n; - char buf[32]; - AuthInfo *ai; + Waitmsg *w; + int pid, i; fmtinstall('r', errfmt); - /* - * we should inherit the standard fds all referring to /dev/cons, - * but we're being paranoid. - */ - close(0); - close(1); - close(2); bind("#c", "/dev", MBEFORE); open("/dev/cons", OREAD); open("/dev/cons", OWRITE); @@ -53,12 +30,13 @@ boot(int argc, char *argv[]) bind("#ec", "/env", MREPL); bind("#e", "/env", MBEFORE|MCREATE); bind("#s", "/srv", MREPL|MCREATE); -#ifdef DEBUG - print("argc=%d\n", argc); - for(fd = 0; fd < argc; fd++) - print("%#p %s ", argv[fd], argv[fd]); - print("\n"); -#endif DEBUG + + if(Debug){ + print("argc=%d\n", argc); + for(i = 0; i < argc; i++) + print("%lux %s ", (ulong)argv[i], argv[i]); + print("\n"); + } ARGBEGIN{ case 'k': @@ -73,281 +51,35 @@ boot(int argc, char *argv[]) }ARGEND readfile("#e/cputype", cputype, sizeof(cputype)); - - /* - * set up usb keyboard, mouse and disk, if any. - */ - usbinit(); - - /* - * pick a method and initialize it - */ - if(method[0].name == nil) - fatal("no boot methods"); - mp = rootserver(argc ? *argv : 0); - (*mp->config)(mp); - islocal = strcmp(mp->name, "local") == 0; - ishybrid = strcmp(mp->name, "hybrid") == 0; - - /* - * load keymap if it's there. - */ - kbmap(); - - /* - * authentication agent - */ - authentication(cpuflag); - - /* - * connect to the root file system - */ - fd = (*mp->connect)(); - if(fd < 0) - fatal("can't connect to file server"); - if(getenv("srvold9p")) - fd = old9p(fd); - if(!islocal && !ishybrid){ - if(cfs) - fd = (*cfs)(fd); - } - print("version..."); - buf[0] = '\0'; - n = fversion(fd, 0, buf, sizeof buf); - if(n < 0) - fatal("can't init 9P"); - srvcreate("boot", fd); - - /* - * create the name space, mount the root fs - */ - if(bind("/", "/", MREPL) < 0) - fatal("bind /"); - rp = getenv("rootspec"); - if(rp == nil) - rp = ""; + setenv("bootdisk", bootdisk, 0); - afd = fauth(fd, rp); - if(afd >= 0){ - ai = auth_proxy(afd, auth_getkey, "proto=p9any role=client"); - if(ai == nil) - print("authentication failed (%r), trying mount anyways\n"); - } - if(mount(fd, afd, "/root", MREPL|MCREATE, rp) < 0) - fatal("mount /"); - rsp = rp; - rp = getenv("rootdir"); - if(rp == nil) - rp = rootdir; - if(bind(rp, "/", MAFTER|MCREATE) < 0){ - if(strncmp(rp, "/root", 5) == 0){ - fprint(2, "boot: couldn't bind $rootdir=%s to root: %r\n", rp); - fatal("second bind /"); - } - snprint(rootbuf, sizeof rootbuf, "/root/%s", rp); - rp = rootbuf; - if(bind(rp, "/", MAFTER|MCREATE) < 0){ - fprint(2, "boot: couldn't bind $rootdir=%s to root: %r\n", rp); - if(strcmp(rootbuf, "/root//plan9") == 0){ - fprint(2, "**** warning: remove rootdir=/plan9 entry from plan9.ini\n"); - rp = "/root"; - if(bind(rp, "/", MAFTER|MCREATE) < 0) - fatal("second bind /"); - }else - fatal("second bind /"); - } - } - close(fd); - setenv("rootdir", rp); - - settime(islocal, afd, rsp); - if(afd > 0) - close(afd); - swapproc(); - - cmd = getenv("init"); - if(cmd == nil){ - sprint(cmdbuf, "/%s/init -%s%s", cputype, - cpuflag ? "c" : "t", mflag ? "m" : ""); - cmd = cmdbuf; - } - iargc = tokenize(cmd, iargv, nelem(iargv)-1); - cmd = iargv[0]; - - /* make iargv[0] basename(iargv[0]) */ - if(iargv[0] = strrchr(iargv[0], '/')) - iargv[0]++; - else - iargv[0] = cmd; - - iargv[iargc] = nil; - - exec(cmd, iargv); - fatal(cmd); -} - -static Method* -findmethod(char *a) -{ - Method *mp; - int i, j; - char *cp; - - if((i = strlen(a)) == 0) - return nil; - cp = strchr(a, '!'); - if(cp) - i = cp - a; - for(mp = method; mp->name; mp++){ - j = strlen(mp->name); - if(j > i) - j = i; - if(strncmp(a, mp->name, j) == 0) - break; - } - if(mp->name) - return mp; - return nil; -} - -/* - * ask user from whence cometh the root file system - */ -static Method* -rootserver(char *arg) -{ - char prompt[256]; - Method *mp; - char *cp; - int n; - - /* look for required reply */ - readfile("#e/nobootprompt", reply, sizeof(reply)); - if(reply[0]){ - mp = findmethod(reply); - if(mp) - goto HaveMethod; - print("boot method %s not found\n", reply); - reply[0] = 0; - } - - /* make list of methods */ - mp = method; - n = sprint(prompt, "root is from (%s", mp->name); - for(mp++; mp->name; mp++) - n += sprint(prompt+n, ", %s", mp->name); - sprint(prompt+n, ")"); - - /* create default reply */ - readfile("#e/bootargs", reply, sizeof(reply)); - if(reply[0] == 0 && arg != 0) - strcpy(reply, arg); - if(reply[0]){ - mp = findmethod(reply); - if(mp == 0) - reply[0] = 0; - } - if(reply[0] == 0) - strcpy(reply, method->name); - - /* parse replies */ - do{ - outin(prompt, reply, sizeof(reply)); - mp = findmethod(reply); - }while(mp == nil); - -HaveMethod: - bargc = tokenize(reply, bargv, Nbarg-2); - bargv[bargc] = nil; - cp = strchr(reply, '!'); - if(cp) - strcpy(sys, cp+1); - return mp; -} - -static void -swapproc(void) -{ - int fd; - - fd = open("#c/swap", OWRITE); - if(fd < 0){ - warning("opening #c/swap"); - return; - } - if(write(fd, "start", 5) <= 0) - warning("starting swap kproc"); - close(fd); -} - -int -old9p(int fd) -{ - int p[2]; - - if(pipe(p) < 0) - fatal("pipe"); - - print("srvold9p..."); - switch(fork()) { + /* setup the boot namespace */ + run("/boot/mntgen", "-s", "slash", "/mnt", nil); + run("/boot/bzfs", "-f", "/boot/rootfs.bz2", "-m", "/mnt/broot", nil); + bind("/mnt/broot", "/", MAFTER); + bind("/386/bin", "/bin", MAFTER); + bind("/rc/bin", "/bin", MAFTER); + bind("/boot", "/bin", MAFTER); + + switch(pid = rfork(RFFDG|RFREND|RFPROC)){ case -1: - fatal("rfork srvold9p"); + fatal("fork error"); case 0: - dup(fd, 1); - close(fd); - dup(p[0], 0); - close(p[0]); - close(p[1]); - execl("/srvold9p", "srvold9p", "-s", 0); - fatal("exec srvold9p"); + setenv("cpuflag", cpuflag ? "1" : "0", 0); + run("/bin/rc", "/rc/bin/bootrc", nil); + break; default: - close(fd); - close(p[0]); - } - return p[1]; -} - -static void -usbinit(void) -{ - static char usbd[] = "/boot/usbd"; - - if(access("#u/usb/ctl", 0) >= 0 && bind("#u", "/dev", MAFTER) >= 0 && - access(usbd, AEXIST) >= 0) - run(usbd, nil); -} - -static void -kbmap(void) -{ - char *f; - int n, in, out; - char buf[1024]; - - f = getenv("kbmap"); - if(f == nil) - return; - if(bind("#κ", "/dev", MAFTER) < 0){ - warning("can't bind #κ"); - return; + while((w = wait()) != nil) + if(w->pid == pid) + break; + if(w == nil){ + free(w); + fatal("wait error"); + } + free(w); + break; } - in = open(f, OREAD); - if(in < 0){ - warning("can't open kbd map: %r"); - return; - } - out = open("/dev/kbmap", OWRITE); - if(out < 0) { - warning("can't open /dev/kbmap: %r"); - close(in); - return; - } - while((n = read(in, buf, sizeof(buf))) > 0) - if(write(out, buf, n) != n){ - warning("write to /dev/kbmap failed"); - break; - } - close(in); - close(out); + for(;;) + ; } |