|
|
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:
23: static void swapproc(void);
24: static Method *rootserver(char*);
25:
26: static int
27: rconv(void *o, Fconv *fp)
28: {
29: char s[ERRLEN];
30:
31: USED(o);
32:
33: s[0] = 0;
34: errstr(s);
35: strconv(s, fp);
36: return 0;
37: }
38:
39: void
40: dosboot(int argc, char *argv[])
41: {
42: int fd;
43: Method *mp;
44: char cmd[64];
45: char flags[6];
46: int islocal;
47: char rootdir[3*NAMELEN];
48:
49: sleep(1000);
50:
51: fmtinstall('r', rconv);
52:
53: open("#c/cons", OREAD);
54: open("#c/cons", OWRITE);
55: open("#c/cons", OWRITE);
56: /* print("argc=%d\n", argc);
57: for(fd = 0; fd < argc; fd++)
58: print("%s ", argv[fd]);
59: print("\n");/**/
60:
61: ARGBEGIN{
62: }ARGEND
63:
64: readfile("#e/cputype", cputype, sizeof(cputype));
65: readfile("#e/terminal", terminal, sizeof(terminal));
66: getconffile(conffile, terminal);
67:
68: /*
69: * pick a method and initialize it
70: */
71: mp = rootserver(argc ? *argv : 0);
72: (*mp->config)(mp);
73: islocal = strcmp(mp->name, "local") == 0;
74:
75: /* set host's owner (and uid of current process) */
76: if(writefile("#c/hostowner", "none", strlen("none")) < 0)
77: fatal("can't set user name");
78:
79: /*
80: * connect to the root file system
81: */
82: fd = (*mp->connect)();
83: if(fd < 0)
84: fatal("can't connect to file server");
85: srvcreate("boot", fd);
86:
87: /*
88: * create the name space
89: */
90: if(mount(fd, "/", MAFTER|MCREATE, "") < 0)
91: fatal("mount");
92:
93: /*
94: * hack to let us have the logical root in a
95: * subdirectory - useful when we're the 'second'
96: * OS along with some other like DOS.
97: */
98: readfile("#e/rootdir", rootdir, sizeof(rootdir));
99: if(rootdir[0]) {
100: if(bind(rootdir, "/", MREPL|MCREATE) >= 0)
101: bind("#/", "/", MBEFORE);
102: }
103: close(fd);
104:
105: settime(islocal);
106: swapproc();
107: remove("#e/password"); /* just in case */
108:
109: sprint(cmd, "/%s/init", cputype);
110: sprint(flags, "-%s%s", cpuflag ? "c" : "t", mflag ? "m" : "");
111: execl(cmd, "init", flags, 0);
112: fatal(cmd);
113: }
114:
115: /*
116: * ask user from whence cometh the root file system
117: */
118: Method*
119: rootserver(char *arg)
120: {
121: char prompt[256];
122: char reply[64];
123: Method *mp;
124: char *cp, *goodarg;
125: int n, j;
126:
127: goodarg = 0;
128: mp = method;
129: n = sprint(prompt, "root is from (%s", mp->name);
130: if(arg && strncmp(arg, mp->name, strlen(mp->name)) == 0)
131: goodarg = arg;
132: for(mp++; mp->name; mp++){
133: n += sprint(prompt+n, ", %s", mp->name);
134: if(arg && strncmp(arg, mp->name, strlen(mp->name)) == 0)
135: goodarg = arg;
136: }
137: sprint(prompt+n, ")");
138:
139: if(goodarg)
140: strcpy(reply, goodarg);
141: else {
142: strcpy(reply, method->name);
143: }
144: for(;;){
145: if(goodarg == 0)
146: outin(cpuflag, prompt, reply, sizeof(reply));
147: cp = strchr(reply, '!');
148: if(cp)
149: j = cp - reply;
150: else
151: j = strlen(reply);
152: for(mp = method; mp->name; mp++)
153: if(strncmp(reply, mp->name, j) == 0){
154: if(cp)
155: strcpy(sys, cp+1);
156: return mp;
157: }
158: if(mp->name == 0)
159: continue;
160: }
161: return 0; /* not reached */
162: }
163:
164: static void
165: swapproc(void)
166: {
167: int fd;
168:
169: fd = open("#c/swap", OWRITE);
170: if(fd < 0){
171: warning("opening #c/swap");
172: return;
173: }
174: if(write(fd, "start", 5) <= 0)
175: warning("starting swap kproc");
176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.