7 void setenv(char*, char*);
8 void cpenv(char*, char*);
10 int procopen(int, char*, int);
11 void fexec(void(*)(void));
23 main(int argc, char *argv[])
45 fd = procopen(getpid(), "ctl", OWRITE);
47 if(write(fd, "pri 10", 6) != 6)
48 fprint(2, "init: warning: can't set priority: %r\n");
52 cpu = readenv("#e/cputype");
53 setenv("#e/objtype", cpu);
54 setenv("#e/service", service);
55 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 fprint(2, "\ninit: starting /bin/rc\n");
76 static int interrupted;
79 pinhead(void*, char *msg)
82 if(strcmp(msg, "interrupt") == 0)
85 fprint(2, "init got note '%s'\n", msg);
90 fexec(void (*execfn)(void))
99 fprint(2, "init: exec error: %r\n");
102 fprint(2, "init: fork error: %r\n");
105 fd = procopen(pid, "notepg", OWRITE);
112 if(interrupted && fd >= 0)
113 write(fd, "interrupt", 9);
116 fprint(2, "init: wait error: %r\n");
123 if(strstr(w->msg, "exec error") != 0){
124 fprint(2, "init: exit string %s\n", w->msg);
125 fprint(2, "init: sleeping because exec failed\n");
130 fprint(2, "init: rc exit status: %s\n", w->msg);
142 execl("/bin/rc", "rc", "-c", cmd, nil);
143 else if(manual || iscpu)
144 execl("/bin/rc", "rc", nil);
145 else if(strcmp(service, "terminal") == 0)
146 execl("/bin/rc", "rc", "-c", ". /rc/bin/termrc; home=/usr/$user; cd && . ./lib/profile", nil);
148 execl("/bin/rc", "rc", nil);
154 execl("/bin/rc", "rc", "-c", "/rc/bin/cpurc", nil);
164 f = open(name, OREAD);
166 fprint(2, "init: can't open %s: %r\n", name);
171 fprint(2, "init: can't stat %s: %r\n", name);
177 if(len == 0) /* device files can be zero length but have contents */
181 fprint(2, "init: can't malloc %s: %r\n", name);
185 len = read(f, val, len);
188 fprint(2, "init: can't read %s: %r\n", name);
200 val = readfile(name);
207 setenv(char *name, char *val)
211 fd = create(name, OWRITE, 0644);
213 fprint(2, "init: can't create %s: %r\n", name);
215 write(fd, val, strlen(val));
221 cpenv(char *from, char *to)
225 val = readfile(from);
233 * clean up after /boot
240 for(i = 3; i < 30; i++)
245 procopen(int pid, char *name, int mode)
250 snprint(buf, sizeof(buf), "#p/%d/%s", pid, name);
251 fd = open(buf, mode);
253 fprint(2, "init: warning: can't open %s: %r\n", name);