7 void setenv(char*, char*);
8 void cpenv(char*, char*);
10 void fexec(void(*)(void));
23 main(int argc, char *argv[])
46 snprint(ctl, sizeof(ctl), "#p/%d/ctl", getpid());
47 fd = open(ctl, OWRITE);
49 print("init: warning: can't open %s: %r\n", ctl);
51 if(write(fd, "pri 10", 6) != 6)
52 print("init: warning: can't set priority: %r\n");
55 cpu = readenv("#e/cputype");
56 setenv("#e/objtype", cpu);
57 setenv("#e/service", service);
58 cpenv("/adm/timezone/local", "#e/timezone");
59 user = readenv("#c/user");
60 systemname = readenv("#c/sysname");
63 iscpu = strcmp(service, "cpu")==0;
65 if(iscpu && manual == 0)
69 print("\ninit: starting /bin/rc\n");
82 char crypted[DESKEYLEN];
86 print("\n%s password:", systemname);
87 for(i=0; i<sizeof typed; i++){
88 if(read(0, typed+i, 1) != 1){
89 print("init: can't read password; insecure\n");
99 if(passtokey(crypted, typed) == 0)
102 if(read(fd, key, DESKEYLEN) != DESKEYLEN){
103 print("init: can't read key; insecure\n");
106 if(memcmp(crypted, key, sizeof key))
108 /* clean up memory */
109 memset(crypted, 0, sizeof crypted);
110 memset(key, 0, sizeof key);
118 pinhead(void*, char *msg)
121 fprint(2, "init got note '%s'\n", msg);
126 fexec(void (*execfn)(void))
135 print("init: exec error: %r\n");
138 print("init: fork error: %r\n");
148 print("init: wait error: %r\n");
155 if(strstr(w->msg, "exec error") != 0){
156 print("init: exit string %s\n", w->msg);
157 print("init: sleeping because exec failed\n");
163 print("init: rc exit status: %s\n", w->msg);
173 execl("/bin/rc", "rc", "-c", cmd, nil);
174 else if(manual || iscpu)
175 execl("/bin/rc", "rc", nil);
176 else if(strcmp(service, "terminal") == 0)
177 execl("/bin/rc", "rc", "-c", ". /rc/bin/termrc; home=/usr/$user; cd; . lib/profile", nil);
179 execl("/bin/rc", "rc", nil);
185 execl("/bin/rc", "rc", "-c", "/rc/bin/cpurc", nil);
195 f = open(name, OREAD);
197 print("init: can't open %s: %r\n", name);
202 print("init: can't stat %s: %r\n", name);
207 if(len == 0) /* device files can be zero length but have contents */
211 print("init: can't malloc %s: %r\n", name);
214 len = read(f, val, len);
217 print("init: can't read %s: %r\n", name);
225 setenv(char *var, char *val)
229 fd = create(var, OWRITE, 0644);
231 print("init: can't open %s\n", var);
239 cpenv(char *file, char *var)
244 fd = open(file, OREAD);
246 print("init: can't open %s\n", file);
248 i = read(fd, buf, sizeof(buf)-1);
250 print("init: can't read %s: %r\n", file);
260 * clean up after /boot
267 for(i = 3; i < 30; i++)