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