8 void setenv(char*, char*);
9 void cpenv(char*, char*);
11 int procopen(int, char*, int);
12 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 fprint(2, "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");
58 user = readenv("#c/user");
59 systemname = readenv("#c/sysname");
62 iscpu = strcmp(service, "cpu")==0;
64 if(iscpu && manual == 0)
68 fprint(2, "\ninit: starting /bin/rc\n");
77 static int interrupted;
80 pinhead(void*, char *msg)
83 if(strcmp(msg, "interrupt") == 0)
86 fprint(2, "init got note '%s'\n", msg);
91 fexec(void (*execfn)(void))
100 fprint(2, "init: exec error: %r\n");
103 fprint(2, "init: fork error: %r\n");
106 fd = procopen(pid, "notepg", OWRITE);
113 if(interrupted && fd >= 0)
114 write(fd, "interrupt", 9);
117 fprint(2, "init: wait error: %r\n");
124 if(strstr(w->msg, "exec error") != 0){
125 fprint(2, "init: exit string %s\n", w->msg);
126 fprint(2, "init: sleeping because exec failed\n");
131 fprint(2, "init: rc exit status: %s\n", w->msg);
143 execl("/bin/rc", "rc", "-c", cmd, nil);
144 else if(manual || iscpu)
145 execl("/bin/rc", "rc", nil);
146 else if(strcmp(service, "terminal") == 0)
147 execl("/bin/rc", "rc", "-c", ". /rc/bin/termrc; home=/usr/$user; cd; . ./lib/profile", nil);
149 execl("/bin/rc", "rc", nil);
155 execl("/bin/rc", "rc", "-c", "/rc/bin/cpurc", nil);
165 f = open(name, OREAD);
167 fprint(2, "init: can't open %s: %r\n", name);
172 fprint(2, "init: can't stat %s: %r\n", name);
178 if(len == 0) /* device files can be zero length but have contents */
182 fprint(2, "init: can't malloc %s: %r\n", name);
186 len = read(f, val, len);
189 fprint(2, "init: can't read %s: %r\n", name);
201 val = readfile(name);
208 setenv(char *name, char *val)
212 fd = create(name, OWRITE, 0644);
214 fprint(2, "init: can't create %s: %r\n", name);
216 write(fd, val, strlen(val));
222 cpenv(char *from, char *to)
226 val = readfile(from);
234 * clean up after /boot
241 for(i = 3; i < 30; i++)
246 procopen(int pid, char *name, int mode)
251 snprint(buf, sizeof(buf), "#p/%d/%s", pid, name);
252 fd = open(buf, mode);
254 fprint(2, "init: warning: can't open %s: %r\n", name);