|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.