source: MondoRescue/branches/3.3/mindi-busybox/init/init.c@ 3647

Last change on this file since 3647 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 41.2 KB
RevLine 
[821]1/* vi: set sw=4 ts=4: */
2/*
3 * Mini init implementation for busybox
4 *
5 * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
6 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
7 * Adjusted by so many folks, it's impossible to keep track.
8 *
[2725]9 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
[821]10 */
11
[2725]12//config:config INIT
13//config: bool "init"
14//config: default y
15//config: select FEATURE_SYSLOG
16//config: help
17//config: init is the first program run when the system boots.
18//config:
[3621]19//config:config LINUXRC
20//config: bool "Support running init from within an initrd (not initramfs)"
21//config: default y
22//config: select FEATURE_SYSLOG
23//config: help
24//config: Legacy support for running init under the old-style initrd. Allows
25//config: the name linuxrc to act as init, and it doesn't assume init is PID 1.
26//config:
27//config: This does not apply to initramfs, which runs /init as PID 1 and
28//config: requires no special support.
29//config:
[2725]30//config:config FEATURE_USE_INITTAB
31//config: bool "Support reading an inittab file"
32//config: default y
[3621]33//config: depends on INIT || LINUXRC
[2725]34//config: help
35//config: Allow init to read an inittab file when the system boot.
36//config:
37//config:config FEATURE_KILL_REMOVED
38//config: bool "Support killing processes that have been removed from inittab"
39//config: default n
40//config: depends on FEATURE_USE_INITTAB
41//config: help
42//config: When respawn entries are removed from inittab and a SIGHUP is
43//config: sent to init, this option will make init kill the processes
44//config: that have been removed.
45//config:
46//config:config FEATURE_KILL_DELAY
47//config: int "How long to wait between TERM and KILL (0 - send TERM only)" if FEATURE_KILL_REMOVED
48//config: range 0 1024
49//config: default 0
50//config: depends on FEATURE_KILL_REMOVED
51//config: help
52//config: With nonzero setting, init sends TERM, forks, child waits N
53//config: seconds, sends KILL and exits. Setting it too high is unwise
54//config: (child will hang around for too long and could actually kill
55//config: the wrong process!)
56//config:
57//config:config FEATURE_INIT_SCTTY
58//config: bool "Run commands with leading dash with controlling tty"
59//config: default y
[3621]60//config: depends on INIT || LINUXRC
[2725]61//config: help
62//config: If this option is enabled, init will try to give a controlling
63//config: tty to any command which has leading hyphen (often it's "-/bin/sh").
64//config: More precisely, init will do "ioctl(STDIN_FILENO, TIOCSCTTY, 0)".
65//config: If device attached to STDIN_FILENO can be a ctty but is not yet
66//config: a ctty for other session, it will become this process' ctty.
67//config: This is not the traditional init behavour, but is often what you want
68//config: in an embedded system where the console is only accessed during
69//config: development or for maintenance.
70//config: NB: using cttyhack applet may work better.
71//config:
72//config:config FEATURE_INIT_SYSLOG
73//config: bool "Enable init to write to syslog"
74//config: default y
[3621]75//config: depends on INIT || LINUXRC
[2725]76//config:
77//config:config FEATURE_EXTRA_QUIET
78//config: bool "Be _extra_ quiet on boot"
79//config: default y
[3621]80//config: depends on INIT || LINUXRC
[2725]81//config: help
82//config: Prevent init from logging some messages to the console during boot.
83//config:
84//config:config FEATURE_INIT_COREDUMPS
85//config: bool "Support dumping core for child processes (debugging only)"
86//config: default y
[3621]87//config: depends on INIT || LINUXRC
[2725]88//config: help
89//config: If this option is enabled and the file /.init_enable_core
90//config: exists, then init will call setrlimit() to allow unlimited
91//config: core file sizes. If this option is disabled, processes
92//config: will not generate any core files.
93//config:
94//config:config INIT_TERMINAL_TYPE
95//config: string "Initial terminal type"
96//config: default "linux"
[3621]97//config: depends on INIT || LINUXRC
[2725]98//config: help
99//config: This is the initial value set by init for the TERM environment
100//config: variable. This variable is used by programs which make use of
101//config: extended terminal capabilities.
102//config:
103//config: Note that on Linux, init attempts to detect serial terminal and
104//config: sets TERM to "vt102" if one is found.
[3621]105//config:
106//config:config FEATURE_INIT_MODIFY_CMDLINE
107//config: bool "Modify the command-line to \"init\""
108//config: default y
109//config: depends on INIT || LINUXRC
110//config: help
111//config: When launched as PID 1 and after parsing its arguments, init
112//config: wipes all the arguments but argv[0] and rewrites argv[0] to
113//config: contain only "init", so that its command-line appears solely as
114//config: "init" in tools such as ps.
115//config: If this option is set to Y, init will keep its original behavior,
116//config: otherwise, all the arguments including argv[0] will be preserved,
117//config: be they parsed or ignored by init.
118//config: The original command-line used to launch init can then be
119//config: retrieved in /proc/1/cmdline on Linux, for example.
[2725]120
[3621]121//applet:IF_INIT(APPLET(init, BB_DIR_SBIN, BB_SUID_DROP))
122//applet:IF_LINUXRC(APPLET_ODDNAME(linuxrc, init, BB_DIR_ROOT, BB_SUID_DROP, linuxrc))
123
124//kbuild:lib-$(CONFIG_INIT) += init.o
125//kbuild:lib-$(CONFIG_LINUXRC) += init.o
126
[3232]127#define DEBUG_SEGV_HANDLER 0
128
[1765]129#include "libbb.h"
[2725]130#include <syslog.h>
131#include <sys/resource.h>
132#ifdef __linux__
[3232]133# include <linux/vt.h>
134# include <sys/sysinfo.h>
[2725]135#endif
136#include "reboot.h" /* reboot() constants */
[821]137
[3232]138#if DEBUG_SEGV_HANDLER
139# undef _GNU_SOURCE
140# define _GNU_SOURCE 1
141# undef __USE_GNU
142# define __USE_GNU 1
143# include <execinfo.h>
144# include <sys/ucontext.h>
145#endif
146
[2725]147/* Used only for sanitizing purposes in set_sane_term() below. On systems where
148 * the baud rate is stored in a separate field, we can safely disable them. */
149#ifndef CBAUD
150# define CBAUD 0
151# define CBAUDEX 0
[821]152#endif
153
[2725]154/* Was a CONFIG_xxx option. A lot of people were building
155 * not fully functional init by switching it on! */
156#define DEBUG_INIT 0
157
[1765]158#define CONSOLE_NAME_SIZE 32
[821]159
[2725]160/* Default sysinit script. */
[821]161#ifndef INIT_SCRIPT
[3621]162# define INIT_SCRIPT "/etc/init.d/rcS"
[821]163#endif
164
[2725]165/* Each type of actions can appear many times. They will be
166 * handled in order. RESTART is an exception, only 1st is used.
167 */
168/* Start these actions first and wait for completion */
169#define SYSINIT 0x01
170/* Start these after SYSINIT and wait for completion */
171#define WAIT 0x02
172/* Start these after WAIT and *dont* wait for completion */
173#define ONCE 0x04
174/*
175 * NB: while SYSINIT/WAIT/ONCE are being processed,
176 * SIGHUP ("reread /etc/inittab") will be processed only after
177 * each group of actions. If new inittab adds, say, a SYSINIT action,
178 * it will not be run, since init is already "past SYSINIT stage".
179 */
180/* Start these after ONCE are started, restart on exit */
181#define RESPAWN 0x08
182/* Like RESPAWN, but wait for <Enter> to be pressed on tty */
183#define ASKFIRST 0x10
184/*
185 * Start these on SIGINT, and wait for completion.
186 * Then go back to respawning RESPAWN and ASKFIRST actions.
187 * NB: kernel sends SIGINT to us if Ctrl-Alt-Del was pressed.
188 */
189#define CTRLALTDEL 0x20
190/*
191 * Start these before killing all processes in preparation for
192 * running RESTART actions or doing low-level halt/reboot/poweroff
193 * (initiated by SIGUSR1/SIGTERM/SIGUSR2).
194 * Wait for completion before proceeding.
195 */
196#define SHUTDOWN 0x40
197/*
198 * exec() on SIGQUIT. SHUTDOWN actions are started and waited for,
199 * then all processes are killed, then init exec's 1st RESTART action,
200 * replacing itself by it. If no RESTART action specified,
201 * SIGQUIT has no effect.
202 */
203#define RESTART 0x80
[821]204
205
[2725]206/* A linked list of init_actions, to be read from inittab */
[821]207struct init_action {
[1765]208 struct init_action *next;
[821]209 pid_t pid;
[2725]210 uint8_t action_type;
[1765]211 char terminal[CONSOLE_NAME_SIZE];
[3621]212 char command[1];
[821]213};
214
215static struct init_action *init_action_list = NULL;
216
[1765]217static const char *log_console = VC_5;
[821]218
219enum {
[1765]220 L_LOG = 0x1,
221 L_CONSOLE = 0x2,
[821]222};
223
224/* Print a message to the specified device.
[2725]225 * "where" may be bitwise-or'd from L_LOG | L_CONSOLE
226 * NB: careful, we can be called after vfork!
227 */
228#define dbg_message(...) do { if (DEBUG_INIT) message(__VA_ARGS__); } while (0)
229static void message(int where, const char *fmt, ...)
[821]230 __attribute__ ((format(printf, 2, 3)));
[2725]231static void message(int where, const char *fmt, ...)
[821]232{
[1765]233 va_list arguments;
[2725]234 unsigned l;
[1765]235 char msg[128];
236
[821]237 msg[0] = '\r';
[1765]238 va_start(arguments, fmt);
[2725]239 l = 1 + vsnprintf(msg + 1, sizeof(msg) - 2, fmt, arguments);
[3621]240 if (l > sizeof(msg) - 2)
241 l = sizeof(msg) - 2;
[1765]242 va_end(arguments);
[821]243
[1765]244#if ENABLE_FEATURE_INIT_SYSLOG
[2725]245 msg[l] = '\0';
246 if (where & L_LOG) {
247 /* Log the message to syslogd */
[1765]248 openlog(applet_name, 0, LOG_DAEMON);
[2725]249 /* don't print "\r" */
250 syslog(LOG_INFO, "%s", msg + 1);
[821]251 closelog();
252 }
253 msg[l++] = '\n';
[1765]254 msg[l] = '\0';
[821]255#else
[2725]256 {
257 static int log_fd = -1;
258
259 msg[l++] = '\n';
260 msg[l] = '\0';
261 /* Take full control of the log tty, and never close it.
262 * It's mine, all mine! Muhahahaha! */
263 if (log_fd < 0) {
264 if (!log_console) {
265 log_fd = STDERR_FILENO;
[1765]266 } else {
[2725]267 log_fd = device_open(log_console, O_WRONLY | O_NONBLOCK | O_NOCTTY);
268 if (log_fd < 0) {
269 bb_error_msg("can't log to %s", log_console);
270 where = L_CONSOLE;
271 } else {
272 close_on_exec_on(log_fd);
273 }
[1765]274 }
[821]275 }
[2725]276 if (where & L_LOG) {
277 full_write(log_fd, msg, l);
278 if (log_fd == STDERR_FILENO)
279 return; /* don't print dup messages */
280 }
[821]281 }
282#endif
283
[2725]284 if (where & L_CONSOLE) {
[1765]285 /* Send console messages to console so people will see them. */
[2725]286 full_write(STDERR_FILENO, msg, l);
[821]287 }
288}
289
[2725]290static void console_init(void)
291{
292#ifdef VT_OPENQRY
293 int vtno;
294#endif
295 char *s;
296
297 s = getenv("CONSOLE");
298 if (!s)
299 s = getenv("console");
300 if (s) {
301 int fd = open(s, O_RDWR | O_NONBLOCK | O_NOCTTY);
302 if (fd >= 0) {
303 dup2(fd, STDIN_FILENO);
304 dup2(fd, STDOUT_FILENO);
305 xmove_fd(fd, STDERR_FILENO);
306 }
307 dbg_message(L_LOG, "console='%s'", s);
308 } else {
309 /* Make sure fd 0,1,2 are not closed
310 * (so that they won't be used by future opens) */
311 bb_sanitize_stdio();
312// Users report problems
313// /* Make sure init can't be blocked by writing to stderr */
314// fcntl(STDERR_FILENO, F_SETFL, fcntl(STDERR_FILENO, F_GETFL) | O_NONBLOCK);
315 }
316
317 s = getenv("TERM");
318#ifdef VT_OPENQRY
319 if (ioctl(STDIN_FILENO, VT_OPENQRY, &vtno) != 0) {
320 /* Not a linux terminal, probably serial console.
321 * Force the TERM setting to vt102
322 * if TERM is set to linux (the default) */
323 if (!s || strcmp(s, "linux") == 0)
324 putenv((char*)"TERM=vt102");
325 if (!ENABLE_FEATURE_INIT_SYSLOG)
326 log_console = NULL;
327 } else
328#endif
329 if (!s)
330 putenv((char*)"TERM=" CONFIG_INIT_TERMINAL_TYPE);
331}
332
333/* Set terminal settings to reasonable defaults.
334 * NB: careful, we can be called after vfork! */
[1765]335static void set_sane_term(void)
[821]336{
337 struct termios tty;
338
339 tcgetattr(STDIN_FILENO, &tty);
340
341 /* set control chars */
342 tty.c_cc[VINTR] = 3; /* C-c */
343 tty.c_cc[VQUIT] = 28; /* C-\ */
344 tty.c_cc[VERASE] = 127; /* C-? */
345 tty.c_cc[VKILL] = 21; /* C-u */
346 tty.c_cc[VEOF] = 4; /* C-d */
347 tty.c_cc[VSTART] = 17; /* C-q */
348 tty.c_cc[VSTOP] = 19; /* C-s */
349 tty.c_cc[VSUSP] = 26; /* C-z */
350
[2725]351#ifdef __linux__
352 /* use line discipline 0 */
[821]353 tty.c_line = 0;
[2725]354#endif
[821]355
356 /* Make it be sane */
[2725]357#ifndef CRTSCTS
358# define CRTSCTS 0
359#endif
360 /* added CRTSCTS to fix Debian bug 528560 */
361 tty.c_cflag &= CBAUD | CBAUDEX | CSIZE | CSTOPB | PARENB | PARODD | CRTSCTS;
[821]362 tty.c_cflag |= CREAD | HUPCL | CLOCAL;
363
364 /* input modes */
365 tty.c_iflag = ICRNL | IXON | IXOFF;
366
367 /* output modes */
368 tty.c_oflag = OPOST | ONLCR;
369
370 /* local modes */
[2725]371 tty.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE | IEXTEN;
[821]372
[2725]373 tcsetattr_stdin_TCSANOW(&tty);
[821]374}
375
[2725]376/* Open the new terminal device.
377 * NB: careful, we can be called after vfork! */
378static int open_stdio_to_tty(const char* tty_name)
[821]379{
[1765]380 /* empty tty_name means "use init's tty", else... */
381 if (tty_name[0]) {
[2725]382 int fd;
383
384 close(STDIN_FILENO);
385 /* fd can be only < 0 or 0: */
386 fd = device_open(tty_name, O_RDWR);
387 if (fd) {
388 message(L_LOG | L_CONSOLE, "can't open %s: %s",
[1765]389 tty_name, strerror(errno));
[2725]390 return 0; /* failure */
[1765]391 }
[2725]392 dup2(STDIN_FILENO, STDOUT_FILENO);
393 dup2(STDIN_FILENO, STDERR_FILENO);
[821]394 }
[1765]395 set_sane_term();
[2725]396 return 1; /* success */
[821]397}
398
[2725]399static void reset_sighandlers_and_unblock_sigs(void)
[821]400{
[2725]401 bb_signals(0
402 + (1 << SIGUSR1)
403 + (1 << SIGUSR2)
404 + (1 << SIGTERM)
405 + (1 << SIGQUIT)
406 + (1 << SIGINT)
407 + (1 << SIGHUP)
408 + (1 << SIGTSTP)
409 + (1 << SIGSTOP)
410 , SIG_DFL);
411 sigprocmask_allsigs(SIG_UNBLOCK);
412}
[821]413
[2725]414/* Wrapper around exec:
[3621]415 * Takes string.
[2725]416 * If chars like '>' detected, execs '[-]/bin/sh -c "exec ......."'.
417 * Otherwise splits words on whitespace, deals with leading dash,
418 * and uses plain exec().
419 * NB: careful, we can be called after vfork!
420 */
421static void init_exec(const char *command)
422{
[3621]423 /* +8 allows to write VLA sizes below more efficiently: */
424 unsigned command_size = strlen(command) + 8;
425 /* strlen(command) + strlen("exec ")+1: */
426 char buf[command_size];
427 /* strlen(command) / 2 + 4: */
428 char *cmd[command_size / 2];
429 int dash;
[821]430
[3621]431 dash = (command[0] == '-' /* maybe? && command[1] == '/' */);
[3232]432 command += dash;
433
[1765]434 /* See if any special /bin/sh requiring characters are present */
[2725]435 if (strpbrk(command, "~`!$^&*()=|\\{}[];\"'<>?") != NULL) {
[3232]436 sprintf(buf, "exec %s", command); /* excluding "-" */
[2725]437 /* NB: LIBBB_DEFAULT_LOGIN_SHELL define has leading dash */
438 cmd[0] = (char*)(LIBBB_DEFAULT_LOGIN_SHELL + !dash);
[1765]439 cmd[1] = (char*)"-c";
[2725]440 cmd[2] = buf;
[1765]441 cmd[3] = NULL;
[3232]442 command = LIBBB_DEFAULT_LOGIN_SHELL + 1;
[1765]443 } else {
444 /* Convert command (char*) into cmd (char**, one word per string) */
[2725]445 char *word, *next;
446 int i = 0;
[3232]447 next = strcpy(buf, command - dash); /* command including "-" */
448 command = next + dash;
[2725]449 while ((word = strsep(&next, " \t")) != NULL) {
450 if (*word != '\0') { /* not two spaces/tabs together? */
451 cmd[i] = word;
[1765]452 i++;
[821]453 }
454 }
[1765]455 cmd[i] = NULL;
456 }
[2725]457 /* If we saw leading "-", it is interactive shell.
458 * Try harder to give it a controlling tty.
[3232]459 */
460 if (ENABLE_FEATURE_INIT_SCTTY && dash) {
[2725]461 /* _Attempt_ to make stdin a controlling tty. */
[3232]462 ioctl(STDIN_FILENO, TIOCSCTTY, 0 /*only try, don't steal*/);
[2725]463 }
[3232]464 /* Here command never contains the dash, cmd[0] might */
465 BB_EXECVP(command, cmd);
466 message(L_LOG | L_CONSOLE, "can't run '%s': %s", command, strerror(errno));
[2725]467 /* returns if execvp fails */
468}
[821]469
[2725]470/* Used only by run_actions */
471static pid_t run(const struct init_action *a)
472{
473 pid_t pid;
[821]474
[2725]475 /* Careful: don't be affected by a signal in vforked child */
476 sigprocmask_allsigs(SIG_BLOCK);
477 if (BB_MMU && (a->action_type & ASKFIRST))
478 pid = fork();
479 else
480 pid = vfork();
481 if (pid < 0)
482 message(L_LOG | L_CONSOLE, "can't fork");
483 if (pid) {
484 sigprocmask_allsigs(SIG_UNBLOCK);
485 return pid; /* Parent or error */
486 }
[821]487
[2725]488 /* Child */
[821]489
[2725]490 /* Reset signal handlers that were set by the parent process */
491 reset_sighandlers_and_unblock_sigs();
[821]492
[2725]493 /* Create a new session and make ourself the process group leader */
494 setsid();
495
496 /* Open the new terminal device */
497 if (!open_stdio_to_tty(a->terminal))
498 _exit(EXIT_FAILURE);
499
500 /* NB: on NOMMU we can't wait for input in child, so
501 * "askfirst" will work the same as "respawn". */
502 if (BB_MMU && (a->action_type & ASKFIRST)) {
[1765]503 static const char press_enter[] ALIGN1 =
504#ifdef CUSTOMIZED_BANNER
505#include CUSTOMIZED_BANNER
[821]506#endif
[1765]507 "\nPlease press Enter to activate this console. ";
508 char c;
509 /*
510 * Save memory by not exec-ing anything large (like a shell)
511 * before the user wants it. This is critical if swap is not
512 * enabled and the system has low memory. Generally this will
513 * be run on the second virtual console, and the first will
514 * be allowed to start a shell or whatever an init script
515 * specifies.
516 */
[2725]517 dbg_message(L_LOG, "waiting for enter to start '%s'"
[1765]518 "(pid %d, tty '%s')\n",
[2725]519 a->command, getpid(), a->terminal);
520 full_write(STDOUT_FILENO, press_enter, sizeof(press_enter) - 1);
521 while (safe_read(STDIN_FILENO, &c, 1) == 1 && c != '\n')
522 continue;
[1765]523 }
[821]524
[2725]525 /*
526 * When a file named /.init_enable_core exists, setrlimit is called
527 * before processes are spawned to set core file size as unlimited.
528 * This is for debugging only. Don't use this is production, unless
529 * you want core dumps lying about....
530 */
531 if (ENABLE_FEATURE_INIT_COREDUMPS) {
532 if (access("/.init_enable_core", F_OK) == 0) {
[1765]533 struct rlimit limit;
534 limit.rlim_cur = RLIM_INFINITY;
535 limit.rlim_max = RLIM_INFINITY;
536 setrlimit(RLIMIT_CORE, &limit);
[821]537 }
[1765]538 }
[2725]539
540 /* Log the process name and args */
541 message(L_LOG, "starting pid %d, tty '%s': '%s'",
[3232]542 getpid(), a->terminal, a->command);
[2725]543
[1765]544 /* Now run it. The new program will take over this PID,
545 * so nothing further in init.c should be run. */
[2725]546 init_exec(a->command);
[1765]547 /* We're still here? Some error happened. */
548 _exit(-1);
[821]549}
550
[2725]551static struct init_action *mark_terminated(pid_t pid)
[821]552{
[2725]553 struct init_action *a;
[821]554
[2725]555 if (pid > 0) {
[3621]556 update_utmp_DEAD_PROCESS(pid);
[2725]557 for (a = init_action_list; a; a = a->next) {
558 if (a->pid == pid) {
559 a->pid = 0;
560 return a;
561 }
562 }
563 }
564 return NULL;
565}
566
567static void waitfor(pid_t pid)
568{
569 /* waitfor(run(x)): protect against failed fork inside run() */
570 if (pid <= 0)
571 return;
572
573 /* Wait for any child (prevent zombies from exiting orphaned processes)
574 * but exit the loop only when specified one has exited. */
[821]575 while (1) {
[2725]576 pid_t wpid = wait(NULL);
577 mark_terminated(wpid);
578 /* Unsafe. SIGTSTP handler might have wait'ed it already */
579 /*if (wpid == pid) break;*/
580 /* More reliable: */
581 if (kill(pid, 0))
[821]582 break;
[2725]583 }
584}
585
586/* Run all commands of a particular type */
587static void run_actions(int action_type)
588{
589 struct init_action *a;
590
591 for (a = init_action_list; a; a = a->next) {
592 if (!(a->action_type & action_type))
593 continue;
594
595 if (a->action_type & (SYSINIT | WAIT | ONCE | CTRLALTDEL | SHUTDOWN)) {
596 pid_t pid = run(a);
597 if (a->action_type & (SYSINIT | WAIT | CTRLALTDEL | SHUTDOWN))
598 waitfor(pid);
599 }
600 if (a->action_type & (RESPAWN | ASKFIRST)) {
601 /* Only run stuff with pid == 0. If pid != 0,
602 * it is already running
603 */
604 if (a->pid == 0)
605 a->pid = run(a);
606 }
607 }
608}
609
610static void new_init_action(uint8_t action_type, const char *command, const char *cons)
611{
612 struct init_action *a, **nextp;
613
614 /* Scenario:
615 * old inittab:
616 * ::shutdown:umount -a -r
617 * ::shutdown:swapoff -a
618 * new inittab:
619 * ::shutdown:swapoff -a
620 * ::shutdown:umount -a -r
621 * On reload, we must ensure entries end up in correct order.
622 * To achieve that, if we find a matching entry, we move it
623 * to the end.
624 */
625 nextp = &init_action_list;
626 while ((a = *nextp) != NULL) {
[3232]627 /* Don't enter action if it's already in the list.
[2725]628 * This prevents losing running RESPAWNs.
629 */
630 if (strcmp(a->command, command) == 0
631 && strcmp(a->terminal, cons) == 0
632 ) {
633 /* Remove from list */
634 *nextp = a->next;
635 /* Find the end of the list */
636 while (*nextp != NULL)
637 nextp = &(*nextp)->next;
638 a->next = NULL;
[3232]639 goto append;
[821]640 }
[2725]641 nextp = &a->next;
[821]642 }
[2725]643
[3621]644 a = xzalloc(sizeof(*a) + strlen(command));
[3232]645
[2725]646 /* Append to the end of the list */
[3232]647 append:
[2725]648 *nextp = a;
649 a->action_type = action_type;
[3621]650 strcpy(a->command, command);
[2725]651 safe_strncpy(a->terminal, cons, sizeof(a->terminal));
[3621]652 dbg_message(L_LOG | L_CONSOLE, "command='%s' action=%x tty='%s'\n",
[2725]653 a->command, a->action_type, a->terminal);
[821]654}
655
[2725]656/* NOTE that if CONFIG_FEATURE_USE_INITTAB is NOT defined,
657 * then parse_inittab() simply adds in some default
[3621]658 * actions (i.e., runs INIT_SCRIPT and then starts a pair
[2725]659 * of "askfirst" shells). If CONFIG_FEATURE_USE_INITTAB
660 * _is_ defined, but /etc/inittab is missing, this
661 * results in the same set of default behaviors.
662 */
663static void parse_inittab(void)
[821]664{
[2725]665#if ENABLE_FEATURE_USE_INITTAB
666 char *token[4];
667 parser_t *parser = config_open2("/etc/inittab", fopen_for_read);
[821]668
[2725]669 if (parser == NULL)
670#endif
671 {
672 /* No inittab file - set up some default behavior */
[3621]673 /* Sysinit */
674 new_init_action(SYSINIT, INIT_SCRIPT, "");
675 /* Askfirst shell on tty1-4 */
676 new_init_action(ASKFIRST, bb_default_login_shell, "");
677//TODO: VC_1 instead of ""? "" is console -> ctty problems -> angry users
678 new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
679 new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
680 new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
[2725]681 /* Reboot on Ctrl-Alt-Del */
682 new_init_action(CTRLALTDEL, "reboot", "");
683 /* Umount all filesystems on halt/reboot */
684 new_init_action(SHUTDOWN, "umount -a -r", "");
685 /* Swapoff on halt/reboot */
[3621]686 new_init_action(SHUTDOWN, "swapoff -a", "");
687 /* Restart init when a QUIT is received */
[2725]688 new_init_action(RESTART, "init", "");
689 return;
690 }
691
692#if ENABLE_FEATURE_USE_INITTAB
693 /* optional_tty:ignored_runlevel:action:command
694 * Delims are not to be collapsed and need exactly 4 tokens
695 */
696 while (config_read(parser, token, 4, 0, "#:",
697 PARSE_NORMAL & ~(PARSE_TRIM | PARSE_COLLAPSE))) {
698 /* order must correspond to SYSINIT..RESTART constants */
699 static const char actions[] ALIGN1 =
700 "sysinit\0""wait\0""once\0""respawn\0""askfirst\0"
701 "ctrlaltdel\0""shutdown\0""restart\0";
702 int action;
703 char *tty = token[0];
704
705 if (!token[3]) /* less than 4 tokens */
706 goto bad_entry;
707 action = index_in_strings(actions, token[2]);
708 if (action < 0 || !token[3][0]) /* token[3]: command */
709 goto bad_entry;
710 /* turn .*TTY -> /dev/TTY */
711 if (tty[0]) {
712 tty = concat_path_file("/dev/", skip_dev_pfx(tty));
[821]713 }
[2725]714 new_init_action(1 << action, token[3], tty);
715 if (tty[0])
716 free(tty);
717 continue;
718 bad_entry:
719 message(L_LOG | L_CONSOLE, "Bad inittab entry at line %d",
720 parser->lineno);
[821]721 }
[2725]722 config_close(parser);
723#endif
[821]724}
725
[2725]726static void pause_and_low_level_reboot(unsigned magic) NORETURN;
727static void pause_and_low_level_reboot(unsigned magic)
[821]728{
729 pid_t pid;
[2725]730
731 /* Allow time for last message to reach serial console, etc */
732 sleep(1);
733
734 /* We have to fork here, since the kernel calls do_exit(EXIT_SUCCESS)
735 * in linux/kernel/sys.c, which can cause the machine to panic when
736 * the init process exits... */
[1765]737 pid = vfork();
738 if (pid == 0) { /* child */
[821]739 reboot(magic);
[2725]740 _exit(EXIT_SUCCESS);
[821]741 }
[2725]742 while (1)
743 sleep(1);
[821]744}
745
[2725]746static void run_shutdown_and_kill_processes(void)
[821]747{
[2725]748 /* Run everything to be run at "shutdown". This is done _prior_
[821]749 * to killing everything, in case people wish to use scripts to
750 * shut things down gracefully... */
751 run_actions(SHUTDOWN);
752
[1765]753 message(L_CONSOLE | L_LOG, "The system is going down NOW!");
754
[821]755 /* Send signals to every process _except_ pid 1 */
756 kill(-1, SIGTERM);
[2725]757 message(L_CONSOLE | L_LOG, "Sent SIG%s to all processes", "TERM");
[1765]758 sync();
[821]759 sleep(1);
760
761 kill(-1, SIGKILL);
[2725]762 message(L_CONSOLE, "Sent SIG%s to all processes", "KILL");
[1765]763 sync();
[2725]764 /*sleep(1); - callers take care about making a pause */
[821]765}
766
[2725]767/* Signal handling by init:
768 *
769 * For process with PID==1, on entry kernel sets all signals to SIG_DFL
770 * and unmasks all signals. However, for process with PID==1,
771 * default action (SIG_DFL) on any signal is to ignore it,
772 * even for special signals SIGKILL and SIGCONT.
773 * Also, any signal can be caught or blocked.
774 * (but SIGSTOP is still handled specially, at least in 2.6.20)
775 *
776 * We install two kinds of handlers, "immediate" and "delayed".
777 *
778 * Immediate handlers execute at any time, even while, say, sysinit
779 * is running.
780 *
781 * Delayed handlers just set a flag variable. The variable is checked
782 * in the main loop and acted upon.
783 *
784 * halt/poweroff/reboot and restart have immediate handlers.
785 * They only traverse linked list of struct action's, never modify it,
786 * this should be safe to do even in signal handler. Also they
787 * never return.
788 *
789 * SIGSTOP and SIGTSTP have immediate handlers. They just wait
790 * for SIGCONT to happen.
791 *
792 * SIGHUP has a delayed handler, because modifying linked list
793 * of struct action's from a signal handler while it is manipulated
794 * by the program may be disastrous.
795 *
796 * Ctrl-Alt-Del has a delayed handler. Not a must, but allowing
797 * it to happen even somewhere inside "sysinit" would be a bit awkward.
798 *
799 * There is a tiny probability that SIGHUP and Ctrl-Alt-Del will collide
800 * and only one will be remembered and acted upon.
801 */
[821]802
[3621]803/* The SIGPWR/SIGUSR[12]/SIGTERM handler */
[2725]804static void halt_reboot_pwoff(int sig) NORETURN;
805static void halt_reboot_pwoff(int sig)
[821]806{
[1765]807 const char *m;
[2725]808 unsigned rb;
[821]809
[2725]810 /* We may call run() and it unmasks signals,
811 * including the one masked inside this signal handler.
812 * Testcase which would start multiple reboot scripts:
813 * while true; do reboot; done
814 * Preventing it:
815 */
816 reset_sighandlers_and_unblock_sigs();
[821]817
[2725]818 run_shutdown_and_kill_processes();
819
[1765]820 m = "halt";
821 rb = RB_HALT_SYSTEM;
[821]822 if (sig == SIGTERM) {
823 m = "reboot";
824 rb = RB_AUTOBOOT;
825 } else if (sig == SIGUSR2) {
826 m = "poweroff";
827 rb = RB_POWER_OFF;
828 }
[2725]829 message(L_CONSOLE, "Requesting system %s", m);
830 pause_and_low_level_reboot(rb);
831 /* not reached */
[821]832}
833
[2725]834/* Handler for QUIT - exec "restart" action,
835 * else (no such action defined) do nothing */
[3621]836static void exec_restart_action(void)
[821]837{
[2725]838 struct init_action *a;
[821]839
[2725]840 for (a = init_action_list; a; a = a->next) {
841 if (!(a->action_type & RESTART))
842 continue;
[821]843
[2725]844 /* Starting from here, we won't return.
845 * Thus don't need to worry about preserving errno
846 * and such.
847 */
[821]848
[2725]849 reset_sighandlers_and_unblock_sigs();
[821]850
[2725]851 run_shutdown_and_kill_processes();
[821]852
[2725]853#ifdef RB_ENABLE_CAD
854 /* Allow Ctrl-Alt-Del to reboot the system.
855 * This is how kernel sets it up for init, we follow suit.
856 */
857 reboot(RB_ENABLE_CAD); /* misnomer */
858#endif
[821]859
[2725]860 if (open_stdio_to_tty(a->terminal)) {
861 dbg_message(L_CONSOLE, "Trying to re-exec %s", a->command);
862 /* Theoretically should be safe.
863 * But in practice, kernel bugs may leave
864 * unkillable processes, and wait() may block forever.
865 * Oh well. Hoping "new" init won't be too surprised
866 * by having children it didn't create.
867 */
868 //while (wait(NULL) > 0)
869 // continue;
870 init_exec(a->command);
[821]871 }
[2725]872 /* Open or exec failed */
873 pause_and_low_level_reboot(RB_HALT_SYSTEM);
874 /* not reached */
[821]875 }
876}
877
[2725]878/* The SIGSTOP/SIGTSTP handler
879 * NB: inside it, all signals except SIGCONT are masked
880 * via appropriate setup in sigaction().
881 */
882static void stop_handler(int sig UNUSED_PARAM)
[821]883{
[2725]884 smallint saved_bb_got_signal;
885 int saved_errno;
[821]886
[2725]887 saved_bb_got_signal = bb_got_signal;
888 saved_errno = errno;
889 signal(SIGCONT, record_signo);
890
891 while (1) {
892 pid_t wpid;
893
894 if (bb_got_signal == SIGCONT)
[821]895 break;
[2725]896 /* NB: this can accidentally wait() for a process
897 * which we waitfor() elsewhere! waitfor() must have
898 * code which is resilient against this.
899 */
900 wpid = wait_any_nohang(NULL);
901 mark_terminated(wpid);
902 sleep(1);
[821]903 }
[2725]904
905 signal(SIGCONT, SIG_DFL);
906 errno = saved_errno;
907 bb_got_signal = saved_bb_got_signal;
[821]908}
909
[2725]910#if ENABLE_FEATURE_USE_INITTAB
911static void reload_inittab(void)
[821]912{
[2725]913 struct init_action *a, **nextp;
[821]914
[2725]915 message(L_LOG, "reloading /etc/inittab");
[821]916
[2725]917 /* Disable old entries */
918 for (a = init_action_list; a; a = a->next)
919 a->action_type = 0;
[821]920
[2725]921 /* Append new entries, or modify existing entries
922 * (incl. setting a->action_type) if cmd and device name
923 * match new ones. End result: only entries with
924 * a->action_type == 0 are stale.
925 */
926 parse_inittab();
[821]927
[2725]928#if ENABLE_FEATURE_KILL_REMOVED
929 /* Kill stale entries */
930 /* Be nice and send SIGTERM first */
931 for (a = init_action_list; a; a = a->next)
932 if (a->action_type == 0 && a->pid != 0)
933 kill(a->pid, SIGTERM);
934 if (CONFIG_FEATURE_KILL_DELAY) {
935 /* NB: parent will wait in NOMMU case */
936 if ((BB_MMU ? fork() : vfork()) == 0) { /* child */
937 sleep(CONFIG_FEATURE_KILL_DELAY);
938 for (a = init_action_list; a; a = a->next)
939 if (a->action_type == 0 && a->pid != 0)
940 kill(a->pid, SIGKILL);
941 _exit(EXIT_SUCCESS);
[821]942 }
[2725]943 }
944#endif
[821]945
[2725]946 /* Remove stale entries and SYSINIT entries.
947 * We never rerun SYSINIT entries anyway,
[3621]948 * removing them too saves a few bytes
949 */
[2725]950 nextp = &init_action_list;
951 while ((a = *nextp) != NULL) {
[3621]952 /*
953 * Why pid == 0 check?
954 * Process can be removed from inittab and added *later*.
955 * If we delete its entry but process still runs,
956 * duplicate is spawned when the entry is re-added.
957 */
958 if ((a->action_type & ~SYSINIT) == 0 && a->pid == 0) {
[2725]959 *nextp = a->next;
960 free(a);
[821]961 } else {
[2725]962 nextp = &a->next;
[821]963 }
[2725]964 }
[821]965
[2725]966 /* Not needed: */
967 /* run_actions(RESPAWN | ASKFIRST); */
968 /* - we return to main loop, which does this automagically */
[821]969}
[2725]970#endif
[821]971
[2725]972static int check_delayed_sigs(void)
[821]973{
[2725]974 int sigs_seen = 0;
[821]975
[2725]976 while (1) {
977 smallint sig = bb_got_signal;
[821]978
[2725]979 if (!sig)
980 return sigs_seen;
981 bb_got_signal = 0;
982 sigs_seen = 1;
983#if ENABLE_FEATURE_USE_INITTAB
984 if (sig == SIGHUP)
985 reload_inittab();
986#endif
987 if (sig == SIGINT)
988 run_actions(CTRLALTDEL);
[3621]989 if (sig == SIGQUIT) {
990 exec_restart_action();
991 /* returns only if no restart action defined */
992 }
993 if ((1 << sig) & (0
994#ifdef SIGPWR
995 + (1 << SIGPWR)
996#endif
997 + (1 << SIGUSR1)
998 + (1 << SIGUSR2)
999 + (1 << SIGTERM)
1000 )) {
1001 halt_reboot_pwoff(sig);
1002 }
[821]1003 }
1004}
1005
[3232]1006#if DEBUG_SEGV_HANDLER
1007static
1008void handle_sigsegv(int sig, siginfo_t *info, void *ucontext)
1009{
1010 long ip;
1011 ucontext_t *uc;
1012
1013 uc = ucontext;
1014 ip = uc->uc_mcontext.gregs[REG_EIP];
1015 fdprintf(2, "signal:%d address:0x%lx ip:0x%lx\n",
1016 sig,
1017 /* this is void*, but using %p would print "(null)"
1018 * even for ptrs which are not exactly 0, but, say, 0x123:
1019 */
1020 (long)info->si_addr,
1021 ip);
1022 {
1023 /* glibc extension */
1024 void *array[50];
1025 int size;
1026 size = backtrace(array, 50);
1027 backtrace_symbols_fd(array, size, 2);
1028 }
1029 for (;;) sleep(9999);
1030}
1031#endif
1032
[3621]1033static void sleep_much(void)
1034{
1035 sleep(30 * 24*60*60);
1036}
1037
[2725]1038int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
1039int init_main(int argc UNUSED_PARAM, char **argv)
[821]1040{
[2725]1041 if (argv[1] && strcmp(argv[1], "-q") == 0) {
[1765]1042 return kill(1, SIGHUP);
[821]1043 }
1044
[3232]1045#if DEBUG_SEGV_HANDLER
1046 {
1047 struct sigaction sa;
1048 memset(&sa, 0, sizeof(sa));
1049 sa.sa_sigaction = handle_sigsegv;
1050 sa.sa_flags = SA_SIGINFO;
1051 sigaction(SIGSEGV, &sa, NULL);
1052 sigaction(SIGILL, &sa, NULL);
1053 sigaction(SIGFPE, &sa, NULL);
1054 sigaction(SIGBUS, &sa, NULL);
1055 }
1056#endif
1057
[2725]1058 if (!DEBUG_INIT) {
1059 /* Expect to be invoked as init with PID=1 or be invoked as linuxrc */
1060 if (getpid() != 1
[3621]1061 && (!ENABLE_LINUXRC || applet_name[0] != 'l') /* not linuxrc? */
[2725]1062 ) {
1063 bb_error_msg_and_die("must be run as PID 1");
1064 }
1065#ifdef RB_DISABLE_CAD
1066 /* Turn off rebooting via CTL-ALT-DEL - we get a
1067 * SIGINT on CAD so we can shut things down gracefully... */
1068 reboot(RB_DISABLE_CAD); /* misnomer */
[821]1069#endif
[2725]1070 }
[821]1071
[2725]1072 /* If, say, xmalloc would ever die, we don't want to oops kernel
1073 * by exiting.
[3621]1074 * NB: we set die_func *after* PID 1 check and bb_show_usage.
[2725]1075 * Otherwise, for example, "init u" ("please rexec yourself"
1076 * command for sysvinit) will show help text (which isn't too bad),
1077 * *and sleep forever* (which is bad!)
1078 */
[3621]1079 die_func = sleep_much;
[1765]1080
[821]1081 /* Figure out where the default console should be */
1082 console_init();
[1765]1083 set_sane_term();
[2725]1084 xchdir("/");
[821]1085 setsid();
[1765]1086
[2725]1087 /* Make sure environs is set to something sane */
1088 putenv((char *) "HOME=/");
1089 putenv((char *) bb_PATH_root_path);
1090 putenv((char *) "SHELL=/bin/sh");
1091 putenv((char *) "USER=root"); /* needed? why? */
[1765]1092
[2725]1093 if (argv[1])
1094 xsetenv("RUNLEVEL", argv[1]);
1095
1096#if !ENABLE_FEATURE_EXTRA_QUIET
[821]1097 /* Hello world */
[2725]1098 message(L_CONSOLE | L_LOG, "init started: %s", bb_banner);
1099#endif
[821]1100
[3621]1101#if 0
1102/* It's 2013, does anyone really still depend on this? */
1103/* If you do, consider adding swapon to sysinit actions then! */
[2725]1104/* struct sysinfo is linux-specific */
[3621]1105# ifdef __linux__
[821]1106 /* Make sure there is enough memory to do something useful. */
[3621]1107 /*if (ENABLE_SWAPONOFF) - WRONG: we may have non-bbox swapon*/ {
[821]1108 struct sysinfo info;
1109
[2725]1110 if (sysinfo(&info) == 0
1111 && (info.mem_unit ? info.mem_unit : 1) * (long long)info.totalram < 1024*1024
1112 ) {
[1765]1113 message(L_CONSOLE, "Low memory, forcing swapon");
[821]1114 /* swapon -a requires /proc typically */
[1765]1115 new_init_action(SYSINIT, "mount -t proc proc /proc", "");
[821]1116 /* Try to turn on swap */
[1765]1117 new_init_action(SYSINIT, "swapon -a", "");
[821]1118 run_actions(SYSINIT); /* wait and removing */
1119 }
1120 }
[3621]1121# endif
[2725]1122#endif
[821]1123
1124 /* Check if we are supposed to be in single user mode */
[2725]1125 if (argv[1]
1126 && (strcmp(argv[1], "single") == 0 || strcmp(argv[1], "-s") == 0 || LONE_CHAR(argv[1], '1'))
[1765]1127 ) {
[2725]1128 /* ??? shouldn't we set RUNLEVEL="b" here? */
[821]1129 /* Start a shell on console */
1130 new_init_action(RESPAWN, bb_default_login_shell, "");
1131 } else {
[2725]1132 /* Not in single user mode - see what inittab says */
[821]1133
1134 /* NOTE that if CONFIG_FEATURE_USE_INITTAB is NOT defined,
1135 * then parse_inittab() simply adds in some default
[3621]1136 * actions (i.e., INIT_SCRIPT and a pair
1137 * of "askfirst" shells) */
[821]1138 parse_inittab();
1139 }
1140
[1765]1141#if ENABLE_SELINUX
[821]1142 if (getenv("SELINUX_INIT") == NULL) {
1143 int enforce = 0;
1144
[1765]1145 putenv((char*)"SELINUX_INIT=YES");
[821]1146 if (selinux_init_load_policy(&enforce) == 0) {
[1765]1147 BB_EXECVP(argv[0], argv);
[821]1148 } else if (enforce > 0) {
1149 /* SELinux in enforcing mode but load_policy failed */
[2725]1150 message(L_CONSOLE, "can't load SELinux Policy. "
[1765]1151 "Machine is in enforcing mode. Halting now.");
[2725]1152 return EXIT_FAILURE;
[821]1153 }
1154 }
[2725]1155#endif
[821]1156
[3621]1157 if (ENABLE_FEATURE_INIT_MODIFY_CMDLINE) {
1158 /* Make the command line just say "init" - that's all, nothing else */
1159 strncpy(argv[0], "init", strlen(argv[0]));
1160 /* Wipe argv[1]-argv[N] so they don't clutter the ps listing */
1161 while (*++argv)
1162 nuke_str(*argv);
1163 }
[821]1164
[2725]1165 /* Set up signal handlers */
1166 if (!DEBUG_INIT) {
1167 struct sigaction sa;
1168
1169 /* Stop handler must allow only SIGCONT inside itself */
1170 memset(&sa, 0, sizeof(sa));
1171 sigfillset(&sa.sa_mask);
1172 sigdelset(&sa.sa_mask, SIGCONT);
1173 sa.sa_handler = stop_handler;
1174 /* NB: sa_flags doesn't have SA_RESTART.
1175 * It must be able to interrupt wait().
1176 */
1177 sigaction_set(SIGTSTP, &sa); /* pause */
1178 /* Does not work as intended, at least in 2.6.20.
1179 * SIGSTOP is simply ignored by init:
1180 */
1181 sigaction_set(SIGSTOP, &sa); /* pause */
1182
[3621]1183 /* These signals must interrupt wait(),
[2725]1184 * setting handler without SA_RESTART flag.
1185 */
[3621]1186 bb_signals_recursive_norestart(0
1187 + (1 << SIGINT) /* Ctrl-Alt-Del */
1188 + (1 << SIGQUIT) /* re-exec another init */
1189#ifdef SIGPWR
1190 + (1 << SIGPWR) /* halt */
1191#endif
1192 + (1 << SIGUSR1) /* halt */
1193 + (1 << SIGTERM) /* reboot */
1194 + (1 << SIGUSR2) /* poweroff */
1195#if ENABLE_FEATURE_USE_INITTAB
1196 + (1 << SIGHUP) /* reread /etc/inittab */
1197#endif
1198 , record_signo);
[2725]1199 }
1200
[821]1201 /* Now run everything that needs to be run */
1202 /* First run the sysinit command */
1203 run_actions(SYSINIT);
[2725]1204 check_delayed_sigs();
[821]1205 /* Next run anything that wants to block */
1206 run_actions(WAIT);
[2725]1207 check_delayed_sigs();
[821]1208 /* Next run anything to be run only once */
1209 run_actions(ONCE);
1210
[2725]1211 /* Now run the looping stuff for the rest of forever.
1212 */
[821]1213 while (1) {
[2725]1214 int maybe_WNOHANG;
[821]1215
[2725]1216 maybe_WNOHANG = check_delayed_sigs();
[821]1217
[2725]1218 /* (Re)run the respawn/askfirst stuff */
1219 run_actions(RESPAWN | ASKFIRST);
1220 maybe_WNOHANG |= check_delayed_sigs();
1221
1222 /* Don't consume all CPU time - sleep a bit */
[821]1223 sleep(1);
[2725]1224 maybe_WNOHANG |= check_delayed_sigs();
[821]1225
[2725]1226 /* Wait for any child process(es) to exit.
1227 *
1228 * If check_delayed_sigs above reported that a signal
1229 * was caught, wait will be nonblocking. This ensures
1230 * that if SIGHUP has reloaded inittab, respawn and askfirst
1231 * actions will not be delayed until next child death.
1232 */
1233 if (maybe_WNOHANG)
1234 maybe_WNOHANG = WNOHANG;
1235 while (1) {
1236 pid_t wpid;
1237 struct init_action *a;
1238
1239 /* If signals happen _in_ the wait, they interrupt it,
1240 * bb_signals_recursive_norestart set them up that way
1241 */
1242 wpid = waitpid(-1, NULL, maybe_WNOHANG);
1243 if (wpid <= 0)
1244 break;
1245
1246 a = mark_terminated(wpid);
1247 if (a) {
1248 message(L_LOG, "process '%s' (pid %d) exited. "
1249 "Scheduling for restart.",
1250 a->command, wpid);
[821]1251 }
[2725]1252 /* See if anyone else is waiting to be reaped */
1253 maybe_WNOHANG = WNOHANG;
[821]1254 }
[2725]1255 } /* while (1) */
[821]1256}
[2725]1257
1258//usage:#define linuxrc_trivial_usage NOUSAGE_STR
1259//usage:#define linuxrc_full_usage ""
1260
1261//usage:#define init_trivial_usage
1262//usage: ""
1263//usage:#define init_full_usage "\n\n"
[3621]1264//usage: "Init is the first process started during boot. It never exits."
1265//usage: IF_FEATURE_USE_INITTAB(
1266//usage: "\n""It (re)spawns children according to /etc/inittab."
1267//usage: )
1268//usage: IF_NOT_FEATURE_USE_INITTAB(
1269//usage: "\n""This version of init doesn't use /etc/inittab,"
1270//usage: "\n""has fixed set of processed to run."
1271//usage: )
[2725]1272//usage:
1273//usage:#define init_notes_usage
1274//usage: "This version of init is designed to be run only by the kernel.\n"
1275//usage: "\n"
1276//usage: "BusyBox init doesn't support multiple runlevels. The runlevels field of\n"
1277//usage: "the /etc/inittab file is completely ignored by BusyBox init. If you want\n"
1278//usage: "runlevels, use sysvinit.\n"
1279//usage: "\n"
1280//usage: "BusyBox init works just fine without an inittab. If no inittab is found,\n"
1281//usage: "it has the following default behavior:\n"
1282//usage: "\n"
1283//usage: " ::sysinit:/etc/init.d/rcS\n"
1284//usage: " ::askfirst:/bin/sh\n"
1285//usage: " ::ctrlaltdel:/sbin/reboot\n"
1286//usage: " ::shutdown:/sbin/swapoff -a\n"
1287//usage: " ::shutdown:/bin/umount -a -r\n"
1288//usage: " ::restart:/sbin/init\n"
1289//usage: " tty2::askfirst:/bin/sh\n"
1290//usage: " tty3::askfirst:/bin/sh\n"
1291//usage: " tty4::askfirst:/bin/sh\n"
1292//usage: "\n"
1293//usage: "If you choose to use an /etc/inittab file, the inittab entry format is as follows:\n"
1294//usage: "\n"
1295//usage: " <id>:<runlevels>:<action>:<process>\n"
1296//usage: "\n"
1297//usage: " <id>:\n"
1298//usage: "\n"
1299//usage: " WARNING: This field has a non-traditional meaning for BusyBox init!\n"
1300//usage: " The id field is used by BusyBox init to specify the controlling tty for\n"
1301//usage: " the specified process to run on. The contents of this field are\n"
1302//usage: " appended to \"/dev/\" and used as-is. There is no need for this field to\n"
1303//usage: " be unique, although if it isn't you may have strange results. If this\n"
[3621]1304//usage: " field is left blank, then the init's stdin/out will be used.\n"
[2725]1305//usage: "\n"
1306//usage: " <runlevels>:\n"
1307//usage: "\n"
1308//usage: " The runlevels field is completely ignored.\n"
1309//usage: "\n"
1310//usage: " <action>:\n"
1311//usage: "\n"
1312//usage: " Valid actions include: sysinit, respawn, askfirst, wait,\n"
1313//usage: " once, restart, ctrlaltdel, and shutdown.\n"
1314//usage: "\n"
1315//usage: " The available actions can be classified into two groups: actions\n"
1316//usage: " that are run only once, and actions that are re-run when the specified\n"
1317//usage: " process exits.\n"
1318//usage: "\n"
1319//usage: " Run only-once actions:\n"
1320//usage: "\n"
1321//usage: " 'sysinit' is the first item run on boot. init waits until all\n"
1322//usage: " sysinit actions are completed before continuing. Following the\n"
1323//usage: " completion of all sysinit actions, all 'wait' actions are run.\n"
1324//usage: " 'wait' actions, like 'sysinit' actions, cause init to wait until\n"
1325//usage: " the specified task completes. 'once' actions are asynchronous,\n"
1326//usage: " therefore, init does not wait for them to complete. 'restart' is\n"
1327//usage: " the action taken to restart the init process. By default this should\n"
1328//usage: " simply run /sbin/init, but can be a script which runs pivot_root or it\n"
1329//usage: " can do all sorts of other interesting things. The 'ctrlaltdel' init\n"
1330//usage: " actions are run when the system detects that someone on the system\n"
1331//usage: " console has pressed the CTRL-ALT-DEL key combination. Typically one\n"
1332//usage: " wants to run 'reboot' at this point to cause the system to reboot.\n"
1333//usage: " Finally the 'shutdown' action specifies the actions to taken when\n"
1334//usage: " init is told to reboot. Unmounting filesystems and disabling swap\n"
1335//usage: " is a very good here.\n"
1336//usage: "\n"
1337//usage: " Run repeatedly actions:\n"
1338//usage: "\n"
1339//usage: " 'respawn' actions are run after the 'once' actions. When a process\n"
1340//usage: " started with a 'respawn' action exits, init automatically restarts\n"
1341//usage: " it. Unlike sysvinit, BusyBox init does not stop processes from\n"
1342//usage: " respawning out of control. The 'askfirst' actions acts just like\n"
1343//usage: " respawn, except that before running the specified process it\n"
1344//usage: " displays the line \"Please press Enter to activate this console.\"\n"
1345//usage: " and then waits for the user to press enter before starting the\n"
1346//usage: " specified process.\n"
1347//usage: "\n"
1348//usage: " Unrecognized actions (like initdefault) will cause init to emit an\n"
1349//usage: " error message, and then go along with its business. All actions are\n"
1350//usage: " run in the order they appear in /etc/inittab.\n"
1351//usage: "\n"
1352//usage: " <process>:\n"
1353//usage: "\n"
1354//usage: " Specifies the process to be executed and its command line.\n"
1355//usage: "\n"
1356//usage: "Example /etc/inittab file:\n"
1357//usage: "\n"
1358//usage: " # This is run first except when booting in single-user mode\n"
1359//usage: " #\n"
1360//usage: " ::sysinit:/etc/init.d/rcS\n"
1361//usage: " \n"
1362//usage: " # /bin/sh invocations on selected ttys\n"
1363//usage: " #\n"
1364//usage: " # Start an \"askfirst\" shell on the console (whatever that may be)\n"
1365//usage: " ::askfirst:-/bin/sh\n"
1366//usage: " # Start an \"askfirst\" shell on /dev/tty2-4\n"
1367//usage: " tty2::askfirst:-/bin/sh\n"
1368//usage: " tty3::askfirst:-/bin/sh\n"
1369//usage: " tty4::askfirst:-/bin/sh\n"
1370//usage: " \n"
1371//usage: " # /sbin/getty invocations for selected ttys\n"
1372//usage: " #\n"
1373//usage: " tty4::respawn:/sbin/getty 38400 tty4\n"
1374//usage: " tty5::respawn:/sbin/getty 38400 tty5\n"
1375//usage: " \n"
1376//usage: " \n"
1377//usage: " # Example of how to put a getty on a serial line (for a terminal)\n"
1378//usage: " #\n"
1379//usage: " #::respawn:/sbin/getty -L ttyS0 9600 vt100\n"
1380//usage: " #::respawn:/sbin/getty -L ttyS1 9600 vt100\n"
1381//usage: " #\n"
1382//usage: " # Example how to put a getty on a modem line\n"
1383//usage: " #::respawn:/sbin/getty 57600 ttyS2\n"
1384//usage: " \n"
1385//usage: " # Stuff to do when restarting the init process\n"
1386//usage: " ::restart:/sbin/init\n"
1387//usage: " \n"
1388//usage: " # Stuff to do before rebooting\n"
1389//usage: " ::ctrlaltdel:/sbin/reboot\n"
1390//usage: " ::shutdown:/bin/umount -a -r\n"
1391//usage: " ::shutdown:/sbin/swapoff -a\n"
Note: See TracBrowser for help on using the repository browser.