7 void setenv(char*, char*);
8 void cpenv(char*, char*);
10 int procopen(int, char*, int);
11 void fexec(void(*)(void));
24 main(int argc, char *argv[])
46 fd = procopen(getpid(), "ctl", OWRITE);
48 if(write(fd, "pri 10", 6) != 6)
49 print("init: warning: can't set priority: %r\n");
53 cpu = readenv("#e/cputype");
54 setenv("#e/objtype", cpu);
55 setenv("#e/service", service);
56 cpenv("/adm/timezone/local", "#e/timezone");
57 user = readenv("#c/user");
58 systemname = readenv("#c/sysname");
61 iscpu = strcmp(service, "cpu")==0;
63 if(iscpu && manual == 0)
67 print("\ninit: starting /bin/rc\n");
80 char crypted[DESKEYLEN];
84 print("\n%s password:", systemname);
85 for(i=0; i<sizeof typed; i++){
86 if(read(0, typed+i, 1) != 1){
87 print("init: can't read password; insecure\n");
97 if(passtokey(crypted, typed) == 0)
100 if(read(fd, key, DESKEYLEN) != DESKEYLEN){
101 print("init: can't read key; insecure\n");
104 if(memcmp(crypted, key, sizeof key))
106 /* clean up memory */
107 memset(crypted, 0, sizeof crypted);
108 memset(key, 0, sizeof key);
114 static int interrupted;
117 pinhead(void*, char *msg)
120 if(strcmp(msg, "interrupt") == 0)
123 fprint(2, "init got note '%s'\n", msg);
128 fexec(void (*execfn)(void))
137 print("init: exec error: %r\n");
140 print("init: fork error: %r\n");
143 fd = procopen(pid, "notepg", OWRITE);
150 if(interrupted && fd >= 0)
151 write(fd, "interrupt", 9);
154 print("init: wait error: %r\n");
161 if(strstr(w->msg, "exec error") != 0){
162 print("init: exit string %s\n", w->msg);
163 print("init: sleeping because exec failed\n");
169 print("init: rc exit status: %s\n", w->msg);
181 execl("/bin/rc", "rc", "-c", cmd, nil);
182 else if(manual || iscpu)
183 execl("/bin/rc", "rc", nil);
184 else if(strcmp(service, "terminal") == 0)
185 execl("/bin/rc", "rc", "-c", ". /rc/bin/termrc; home=/usr/$user; cd; . lib/profile", nil);
187 execl("/bin/rc", "rc", nil);
193 execl("/bin/rc", "rc", "-c", "/rc/bin/cpurc", nil);
203 f = open(name, OREAD);
205 print("init: can't open %s: %r\n", name);
210 print("init: can't stat %s: %r\n", name);
215 if(len == 0) /* device files can be zero length but have contents */
219 print("init: can't malloc %s: %r\n", name);
222 len = read(f, val, len);
225 print("init: can't read %s: %r\n", name);
233 setenv(char *var, char *val)
237 fd = create(var, OWRITE, 0644);
239 print("init: can't open %s\n", var);
247 cpenv(char *file, char *var)
252 fd = open(file, OREAD);
254 print("init: can't open %s\n", file);
256 i = read(fd, buf, sizeof(buf)-1);
258 print("init: can't read %s: %r\n", file);
268 * clean up after /boot
275 for(i = 3; i < 30; i++)
280 procopen(int pid, char *name, int mode)
285 snprint(buf, sizeof(buf), "#p/%d/%s", pid, name);
286 fd = open(buf, mode);
288 print("init: warning: can't open %s: %r\n", name);