Annotation of lucent/sys/src/9/boot/boot.c, revision 1.1

1.1     ! root        1: #include <u.h>
        !             2: #include <libc.h>
        !             3: #include <auth.h>
        !             4: #include "../boot/boot.h"
        !             5: 
        !             6: #define DEFSYS "bootes"
        !             7: typedef struct Net     Net;
        !             8: typedef struct Flavor  Flavor;
        !             9: 
        !            10: int    printcol;
        !            11: 
        !            12: char   cputype[NAMELEN];
        !            13: char   terminal[NAMELEN];
        !            14: char   sys[2*NAMELEN];
        !            15: char   username[NAMELEN];
        !            16: char   bootfile[3*NAMELEN];
        !            17: char   conffile[NAMELEN];
        !            18: 
        !            19: int mflag;
        !            20: int fflag;
        !            21: int kflag;
        !            22: int afd = -1;
        !            23: 
        !            24: static void    swapproc(void);
        !            25: static Method  *rootserver(char*);
        !            26: 
        !            27: static int
        !            28: rconv(void *o, Fconv *fp)
        !            29: {
        !            30:        char s[ERRLEN];
        !            31: 
        !            32:        USED(o);
        !            33: 
        !            34:        s[0] = 0;
        !            35:        errstr(s);
        !            36:        strconv(s, fp);
        !            37:        return 0;
        !            38: }
        !            39: 
        !            40: void
        !            41: boot(int argc, char *argv[])
        !            42: {
        !            43:        int fd;
        !            44:        Method *mp;
        !            45:        char cmd[64];
        !            46:        char flags[6];
        !            47:        int islocal, ishybrid;
        !            48:        char rootdir[3*NAMELEN];
        !            49: 
        !            50:        sleep(1000);
        !            51: 
        !            52:        fmtinstall('r', rconv);
        !            53: 
        !            54:        open("#c/cons", OREAD);
        !            55:        open("#c/cons", OWRITE);
        !            56:        open("#c/cons", OWRITE);
        !            57: /*     print("argc=%d\n", argc);
        !            58:        for(fd = 0; fd < argc; fd++)
        !            59:                print("%s ", argv[fd]);
        !            60:        print("\n");/**/
        !            61: 
        !            62:        ARGBEGIN{
        !            63:        case 'u':
        !            64:                strcpy(username, ARGF());
        !            65:                break;
        !            66:        case 'k':
        !            67:                kflag = 1;
        !            68:                break;
        !            69:        case 'm':
        !            70:                mflag = 1;
        !            71:                break;
        !            72:        case 'f':
        !            73:                fflag = 1;
        !            74:                break;
        !            75:        }ARGEND
        !            76: 
        !            77:        readfile("#e/cputype", cputype, sizeof(cputype));
        !            78:        readfile("#e/terminal", terminal, sizeof(terminal));
        !            79:        getconffile(conffile, terminal);
        !            80: 
        !            81:        /*
        !            82:         *  pick a method and initialize it
        !            83:         */
        !            84:        mp = rootserver(argc ? *argv : 0);
        !            85:        (*mp->config)(mp);
        !            86:        islocal = strcmp(mp->name, "local") == 0;
        !            87:        ishybrid = (mp->name[0] == 'h' || mp->name[0] == 'H') &&
        !            88:                        strcmp(&mp->name[1], "ybrid") == 0;
        !            89: 
        !            90:        /*
        !            91:         *  get/set key or password
        !            92:         */
        !            93:        (*pword)(islocal, mp);
        !            94: 
        !            95:        /*
        !            96:         *  connect to the root file system
        !            97:         */
        !            98:        fd = (*mp->connect)();
        !            99:        if(fd < 0)
        !           100:                fatal("can't connect to file server");
        !           101:        if(!islocal && !ishybrid){
        !           102:                if(cfs)
        !           103:                        fd = (*cfs)(fd);
        !           104:                doauthenticate(fd, mp);
        !           105:        }
        !           106:        srvcreate("boot", fd);
        !           107: 
        !           108:        /*
        !           109:         *  create the name space
        !           110:         */
        !           111:        if(bind("/", "/", MREPL) < 0)
        !           112:                fatal("bind");
        !           113:        if(mount(fd, "/", MAFTER|MCREATE, "") < 0)
        !           114:                fatal("mount");
        !           115:        close(fd);
        !           116: 
        !           117:        /*
        !           118:         *  hack to let us have the logical root in a
        !           119:         *  subdirectory - useful when we're the 'second'
        !           120:         *  OS along with some other like DOS.
        !           121:         */
        !           122:        readfile("#e/rootdir", rootdir, sizeof(rootdir));
        !           123:        if(rootdir[0])
        !           124:                if(bind(rootdir, "/", MREPL|MCREATE) >= 0)
        !           125:                        bind("#/", "/", MBEFORE);
        !           126: 
        !           127:        /*
        !           128:         *  if a local file server exists and it's not
        !           129:         *  running, start it and mount it onto /n/kfs
        !           130:         */
        !           131:        if(access("#s/kfs", 0) < 0){
        !           132:                for(mp = method; mp->name; mp++){
        !           133:                        if(strcmp(mp->name, "local") != 0)
        !           134:                                continue;
        !           135:                        (*mp->config)(mp);
        !           136:                        fd = (*mp->connect)();
        !           137:                        if(fd < 0)
        !           138:                                break;
        !           139:                        mount(fd, "/n/kfs", MAFTER|MCREATE, "") ;
        !           140:                        close(fd);
        !           141:                        break;
        !           142:                }
        !           143:        }
        !           144: 
        !           145:        settime(islocal);
        !           146:        close(afd);
        !           147:        swapproc();
        !           148:        remove("#e/password");
        !           149: 
        !           150:        sprint(cmd, "/%s/init", cputype);
        !           151:        sprint(flags, "-%s%s", cpuflag ? "c" : "t", mflag ? "m" : "");
        !           152:        execl(cmd, "init", flags, 0);
        !           153:        fatal(cmd);
        !           154: }
        !           155: 
        !           156: /*
        !           157:  *  ask user from whence cometh the root file system
        !           158:  */
        !           159: Method*
        !           160: rootserver(char *arg)
        !           161: {
        !           162:        char prompt[256];
        !           163:        char reply[64];
        !           164:        Method *mp;
        !           165:        char *cp, *goodarg;
        !           166:        int n, j;
        !           167: 
        !           168:        goodarg = 0;
        !           169:        mp = method;
        !           170:        n = sprint(prompt, "root is from (%s", mp->name);
        !           171:        if(arg && strncmp(arg, mp->name, strlen(mp->name)) == 0)
        !           172:                goodarg = arg;
        !           173:        for(mp++; mp->name; mp++){
        !           174:                n += sprint(prompt+n, ", %s", mp->name);
        !           175:                if(arg && strncmp(arg, mp->name, strlen(mp->name)) == 0)
        !           176:                        goodarg = arg;
        !           177:        }
        !           178:        sprint(prompt+n, ")");
        !           179: 
        !           180:        if(goodarg)
        !           181:                strcpy(reply, goodarg);
        !           182:        else {
        !           183:                strcpy(reply, method->name);
        !           184:        }
        !           185:        for(;;){
        !           186:                outin(cpuflag, prompt, reply, sizeof(reply));
        !           187:                cp = strchr(reply, '!');
        !           188:                if(cp)
        !           189:                        j = cp - reply;
        !           190:                else
        !           191:                        j = strlen(reply);
        !           192:                for(mp = method; mp->name; mp++)
        !           193:                        if(strncmp(reply, mp->name, j) == 0){
        !           194:                                if(cp)
        !           195:                                        strcpy(sys, cp+1);
        !           196:                                return mp;
        !           197:                        }
        !           198:                if(mp->name == 0)
        !           199:                        continue;
        !           200:        }
        !           201:        return 0;               /* not reached */
        !           202: }
        !           203: 
        !           204: static void
        !           205: swapproc(void)
        !           206: {
        !           207:        int fd;
        !           208: 
        !           209:        fd = open("#c/swap", OWRITE);
        !           210:        if(fd < 0){
        !           211:                warning("opening #c/swap");
        !           212:                return;
        !           213:        }
        !           214:        if(write(fd, "start", 5) <= 0)
        !           215:                warning("starting swap kproc");
        !           216: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.