aboutsummaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-01-08 12:30:49 +0000
committerRon Yorston <rmy@pobox.com>2020-01-08 12:30:49 +0000
commita9271a8e97e6e7be5285330d5f19352decabf807 (patch)
treebf3c4464c369a15a46454792dac167505f74769f /init
parentb0b7ab792bc1f45963f4b84b94faaf05054e1613 (diff)
parent9ec836c033fc6e55e80f3309b3e05acdf09bb297 (diff)
downloadbusybox-w32-a9271a8e97e6e7be5285330d5f19352decabf807.tar.gz
busybox-w32-a9271a8e97e6e7be5285330d5f19352decabf807.tar.bz2
busybox-w32-a9271a8e97e6e7be5285330d5f19352decabf807.zip
Merge branch 'busybox' into merge
Diffstat (limited to 'init')
-rw-r--r--init/init.c295
1 files changed, 127 insertions, 168 deletions
diff --git a/init/init.c b/init/init.c
index 0f3c5fa4d..28775a65c 100644
--- a/init/init.c
+++ b/init/init.c
@@ -145,13 +145,6 @@
145# include <sys/ucontext.h> 145# include <sys/ucontext.h>
146#endif 146#endif
147 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 148/* Was a CONFIG_xxx option. A lot of people were building
156 * not fully functional init by switching it on! */ 149 * not fully functional init by switching it on! */
157#define DEBUG_INIT 0 150#define DEBUG_INIT 0
@@ -217,6 +210,8 @@ struct globals {
217#if !ENABLE_FEATURE_INIT_SYSLOG 210#if !ENABLE_FEATURE_INIT_SYSLOG
218 const char *log_console; 211 const char *log_console;
219#endif 212#endif
213 sigset_t delayed_sigset;
214 struct timespec zero_ts;
220} FIX_ALIASING; 215} FIX_ALIASING;
221#define G (*(struct globals*)bb_common_bufsiz1) 216#define G (*(struct globals*)bb_common_bufsiz1)
222#define INIT_G() do { \ 217#define INIT_G() do { \
@@ -347,7 +342,8 @@ static void set_sane_term(void)
347{ 342{
348 struct termios tty; 343 struct termios tty;
349 344
350 tcgetattr(STDIN_FILENO, &tty); 345 if (tcgetattr(STDIN_FILENO, &tty) != 0)
346 return;
351 347
352 /* set control chars */ 348 /* set control chars */
353 tty.c_cc[VINTR] = 3; /* C-c */ 349 tty.c_cc[VINTR] = 3; /* C-c */
@@ -365,10 +361,15 @@ static void set_sane_term(void)
365#endif 361#endif
366 362
367 /* Make it be sane */ 363 /* Make it be sane */
364/* On systems where the baud rate is stored in a separate field, we can safely disable these. */
365#ifndef CBAUD
366# define CBAUD 0
367# define CBAUDEX 0
368#endif
369/* Added CRTSCTS to fix Debian bug 528560 */
368#ifndef CRTSCTS 370#ifndef CRTSCTS
369# define CRTSCTS 0 371# define CRTSCTS 0
370#endif 372#endif
371 /* added CRTSCTS to fix Debian bug 528560 */
372 tty.c_cflag &= CBAUD | CBAUDEX | CSIZE | CSTOPB | PARENB | PARODD | CRTSCTS; 373 tty.c_cflag &= CBAUD | CBAUDEX | CSIZE | CSTOPB | PARENB | PARODD | CRTSCTS;
373 tty.c_cflag |= CREAD | HUPCL | CLOCAL; 374 tty.c_cflag |= CREAD | HUPCL | CLOCAL;
374 375
@@ -412,14 +413,8 @@ static int open_stdio_to_tty(const char* tty_name)
412static void reset_sighandlers_and_unblock_sigs(void) 413static void reset_sighandlers_and_unblock_sigs(void)
413{ 414{
414 bb_signals(0 415 bb_signals(0
415 + (1 << SIGUSR1) 416 | (1 << SIGTSTP)
416 + (1 << SIGUSR2) 417 | (1 << SIGSTOP)
417 + (1 << SIGTERM)
418 + (1 << SIGQUIT)
419 + (1 << SIGINT)
420 + (1 << SIGHUP)
421 + (1 << SIGTSTP)
422 + (1 << SIGSTOP)
423 , SIG_DFL); 418 , SIG_DFL);
424 sigprocmask_allsigs(SIG_UNBLOCK); 419 sigprocmask_allsigs(SIG_UNBLOCK);
425} 420}
@@ -485,16 +480,13 @@ static pid_t run(const struct init_action *a)
485{ 480{
486 pid_t pid; 481 pid_t pid;
487 482
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)) 483 if (BB_MMU && (a->action_type & ASKFIRST))
491 pid = fork(); 484 pid = fork();
492 else 485 else
493 pid = vfork(); 486 pid = vfork();
494 if (pid < 0)
495 message(L_LOG | L_CONSOLE, "can't fork");
496 if (pid) { 487 if (pid) {
497 sigprocmask_allsigs(SIG_UNBLOCK); 488 if (pid < 0)
489 message(L_LOG | L_CONSOLE, "can't fork");
498 return pid; /* Parent or error */ 490 return pid; /* Parent or error */
499 } 491 }
500 492
@@ -588,9 +580,11 @@ static void waitfor(pid_t pid)
588 while (1) { 580 while (1) {
589 pid_t wpid = wait(NULL); 581 pid_t wpid = wait(NULL);
590 mark_terminated(wpid); 582 mark_terminated(wpid);
591 /* Unsafe. SIGTSTP handler might have wait'ed it already */ 583 if (wpid == pid) /* this was the process we waited for */
592 /*if (wpid == pid) break;*/ 584 break;
593 /* More reliable: */ 585 /* The above is not reliable enough: SIGTSTP handler might have
586 * wait'ed it already. Double check, exit if process is gone:
587 */
594 if (kill(pid, 0)) 588 if (kill(pid, 0))
595 break; 589 break;
596 } 590 }
@@ -799,23 +793,17 @@ static void run_shutdown_and_kill_processes(void)
799 * Delayed handlers just set a flag variable. The variable is checked 793 * Delayed handlers just set a flag variable. The variable is checked
800 * in the main loop and acted upon. 794 * in the main loop and acted upon.
801 * 795 *
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 796 * SIGSTOP and SIGTSTP have immediate handlers. They just wait
808 * for SIGCONT to happen. 797 * for SIGCONT to happen.
809 * 798 *
799 * halt/poweroff/reboot and restart have delayed handlers.
800 *
810 * SIGHUP has a delayed handler, because modifying linked list 801 * SIGHUP has a delayed handler, because modifying linked list
811 * of struct action's from a signal handler while it is manipulated 802 * of struct action's from a signal handler while it is manipulated
812 * by the program may be disastrous. 803 * by the program may be disastrous.
813 * 804 *
814 * Ctrl-Alt-Del has a delayed handler. Not a must, but allowing 805 * 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. 806 * 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 */ 807 */
820 808
821/* The SIGPWR/SIGUSR[12]/SIGTERM handler */ 809/* The SIGPWR/SIGUSR[12]/SIGTERM handler */
@@ -899,11 +887,9 @@ static void exec_restart_action(void)
899 */ 887 */
900static void stop_handler(int sig UNUSED_PARAM) 888static void stop_handler(int sig UNUSED_PARAM)
901{ 889{
902 smallint saved_bb_got_signal; 890 int saved_errno = errno;
903 int saved_errno;
904 891
905 saved_bb_got_signal = bb_got_signal; 892 bb_got_signal = 0;
906 saved_errno = errno;
907 signal(SIGCONT, record_signo); 893 signal(SIGCONT, record_signo);
908 894
909 while (1) { 895 while (1) {
@@ -917,12 +903,12 @@ static void stop_handler(int sig UNUSED_PARAM)
917 */ 903 */
918 wpid = wait_any_nohang(NULL); 904 wpid = wait_any_nohang(NULL);
919 mark_terminated(wpid); 905 mark_terminated(wpid);
920 sleep(1); 906 if (wpid <= 0) /* no processes exited? sleep a bit */
907 sleep(1);
921 } 908 }
922 909
923 signal(SIGCONT, SIG_DFL); 910 signal(SIGCONT, SIG_DFL);
924 errno = saved_errno; 911 errno = saved_errno;
925 bb_got_signal = saved_bb_got_signal;
926} 912}
927 913
928#if ENABLE_FEATURE_USE_INITTAB 914#if ENABLE_FEATURE_USE_INITTAB
@@ -987,43 +973,39 @@ static void reload_inittab(void)
987} 973}
988#endif 974#endif
989 975
990static int check_delayed_sigs(void) 976static void check_delayed_sigs(struct timespec *ts)
991{ 977{
992 int sigs_seen = 0; 978 int sig = sigtimedwait(&G.delayed_sigset, /* siginfo_t */ NULL, ts);
979 if (sig <= 0)
980 return;
993 981
994 while (1) { 982 /* The signal "sig" was caught */
995 smallint sig = bb_got_signal;
996 983
997 if (!sig)
998 return sigs_seen;
999 bb_got_signal = 0;
1000 sigs_seen = 1;
1001#if ENABLE_FEATURE_USE_INITTAB 984#if ENABLE_FEATURE_USE_INITTAB
1002 if (sig == SIGHUP) 985 if (sig == SIGHUP)
1003 reload_inittab(); 986 reload_inittab();
1004#endif 987#endif
1005 if (sig == SIGINT) 988 if (sig == SIGINT)
1006 run_actions(CTRLALTDEL); 989 run_actions(CTRLALTDEL);
1007 if (sig == SIGQUIT) { 990 if (sig == SIGQUIT) {
1008 exec_restart_action(); 991 exec_restart_action();
1009 /* returns only if no restart action defined */ 992 /* returns only if no restart action defined */
1010 } 993 }
1011 if ((1 << sig) & (0 994 if ((1 << sig) & (0
1012#ifdef SIGPWR 995#ifdef SIGPWR
1013 + (1 << SIGPWR) 996 | (1 << SIGPWR)
1014#endif 997#endif
1015 + (1 << SIGUSR1) 998 | (1 << SIGUSR1)
1016 + (1 << SIGUSR2) 999 | (1 << SIGUSR2)
1017 + (1 << SIGTERM) 1000 | (1 << SIGTERM)
1018 )) { 1001 )) {
1019 halt_reboot_pwoff(sig); 1002 halt_reboot_pwoff(sig);
1020 }
1021 } 1003 }
1004 /* if (sig == SIGCHLD) do nothing */
1022} 1005}
1023 1006
1024#if DEBUG_SEGV_HANDLER 1007#if DEBUG_SEGV_HANDLER
1025static 1008static void handle_sigsegv(int sig, siginfo_t *info, void *ucontext)
1026void handle_sigsegv(int sig, siginfo_t *info, void *ucontext)
1027{ 1009{
1028 long ip; 1010 long ip;
1029 ucontext_t *uc; 1011 ucontext_t *uc;
@@ -1050,50 +1032,62 @@ void handle_sigsegv(int sig, siginfo_t *info, void *ucontext)
1050 1032
1051static void sleep_much(void) 1033static void sleep_much(void)
1052{ 1034{
1053 sleep(30 * 24*60*60); 1035 sleep(30 * 24*60*60);
1054} 1036}
1055 1037
1056int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 1038int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
1057int init_main(int argc UNUSED_PARAM, char **argv) 1039int init_main(int argc UNUSED_PARAM, char **argv)
1058{ 1040{
1041 struct sigaction sa;
1042
1059 INIT_G(); 1043 INIT_G();
1060 1044
1045 /* Some users send poweroff signals to init VERY early.
1046 * To handle this, mask signals early.
1047 */
1048 /* sigemptyset(&G.delayed_sigset); - done by INIT_G() */
1049 sigaddset(&G.delayed_sigset, SIGINT); /* Ctrl-Alt-Del */
1050 sigaddset(&G.delayed_sigset, SIGQUIT); /* re-exec another init */
1051#ifdef SIGPWR
1052 sigaddset(&G.delayed_sigset, SIGPWR); /* halt */
1053#endif
1054 sigaddset(&G.delayed_sigset, SIGUSR1); /* halt */
1055 sigaddset(&G.delayed_sigset, SIGTERM); /* reboot */
1056 sigaddset(&G.delayed_sigset, SIGUSR2); /* poweroff */
1057#if ENABLE_FEATURE_USE_INITTAB
1058 sigaddset(&G.delayed_sigset, SIGHUP); /* reread /etc/inittab */
1059#endif
1060 sigaddset(&G.delayed_sigset, SIGCHLD); /* make sigtimedwait() exit on SIGCHLD */
1061 sigprocmask(SIG_BLOCK, &G.delayed_sigset, NULL);
1062
1063#if DEBUG_SEGV_HANDLER
1064 memset(&sa, 0, sizeof(sa));
1065 sa.sa_sigaction = handle_sigsegv;
1066 sa.sa_flags = SA_SIGINFO;
1067 sigaction_set(SIGSEGV, &sa);
1068 sigaction_set(SIGILL, &sa);
1069 sigaction_set(SIGFPE, &sa);
1070 sigaction_set(SIGBUS, &sa);
1071#endif
1072
1061 if (argv[1] && strcmp(argv[1], "-q") == 0) { 1073 if (argv[1] && strcmp(argv[1], "-q") == 0) {
1062 return kill(1, SIGHUP); 1074 return kill(1, SIGHUP);
1063 } 1075 }
1064 1076
1065#if DEBUG_SEGV_HANDLER 1077#if !DEBUG_INIT
1066 { 1078 /* Expect to be invoked as init with PID=1 or be invoked as linuxrc */
1067 struct sigaction sa; 1079 if (getpid() != 1
1068 memset(&sa, 0, sizeof(sa)); 1080 && (!ENABLE_LINUXRC || applet_name[0] != 'l') /* not linuxrc? */
1069 sa.sa_sigaction = handle_sigsegv; 1081 ) {
1070 sa.sa_flags = SA_SIGINFO; 1082 bb_simple_error_msg_and_die("must be run as PID 1");
1071 sigaction(SIGSEGV, &sa, NULL);
1072 sigaction(SIGILL, &sa, NULL);
1073 sigaction(SIGFPE, &sa, NULL);
1074 sigaction(SIGBUS, &sa, NULL);
1075 } 1083 }
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 1084
1085 /* Expect to be invoked as init with PID=1 or be invoked as linuxrc */ 1085# ifdef RB_DISABLE_CAD
1086 if (getpid() != 1 1086 /* Turn off rebooting via CTL-ALT-DEL - we get a
1087 && (!ENABLE_LINUXRC || applet_name[0] != 'l') /* not linuxrc? */ 1087 * SIGINT on CAD so we can shut things down gracefully... */
1088 ) { 1088 reboot(RB_DISABLE_CAD); /* misnomer */
1089 bb_simple_error_msg_and_die("must be run as PID 1"); 1089# endif
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 1090#endif
1096 }
1097 1091
1098 /* If, say, xmalloc would ever die, we don't want to oops kernel 1092 /* If, say, xmalloc would ever die, we don't want to oops kernel
1099 * by exiting. 1093 * by exiting.
@@ -1157,106 +1151,65 @@ int init_main(int argc UNUSED_PARAM, char **argv)
1157 } 1151 }
1158#endif 1152#endif
1159 1153
1160 if (ENABLE_FEATURE_INIT_MODIFY_CMDLINE) { 1154#if ENABLE_FEATURE_INIT_MODIFY_CMDLINE
1161 /* Make the command line just say "init" - that's all, nothing else */ 1155 /* Make the command line just say "init" - that's all, nothing else */
1162 strncpy(argv[0], "init", strlen(argv[0])); 1156 strncpy(argv[0], "init", strlen(argv[0]));
1163 /* Wipe argv[1]-argv[N] so they don't clutter the ps listing */ 1157 /* Wipe argv[1]-argv[N] so they don't clutter the ps listing */
1164 while (*++argv) 1158 while (*++argv)
1165 nuke_str(*argv); 1159 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 1160#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 1161
1203 sigprocmask_allsigs(SIG_UNBLOCK); 1162 /* Set up STOP signal handlers */
1204 } 1163 /* Stop handler must allow only SIGCONT inside itself */
1164 memset(&sa, 0, sizeof(sa));
1165 sigfillset(&sa.sa_mask);
1166 sigdelset(&sa.sa_mask, SIGCONT);
1167 sa.sa_handler = stop_handler;
1168 sa.sa_flags = SA_RESTART;
1169 sigaction_set(SIGTSTP, &sa); /* pause */
1170 /* Does not work as intended, at least in 2.6.20.
1171 * SIGSTOP is simply ignored by init
1172 * (NB: behavior might differ under strace):
1173 */
1174 sigaction_set(SIGSTOP, &sa); /* pause */
1205 1175
1206 /* Now run everything that needs to be run */ 1176 /* Now run everything that needs to be run */
1207 /* First run the sysinit command */ 1177 /* First run the sysinit command */
1208 run_actions(SYSINIT); 1178 run_actions(SYSINIT);
1209 check_delayed_sigs(); 1179 check_delayed_sigs(&G.zero_ts);
1210 /* Next run anything that wants to block */ 1180 /* Next run anything that wants to block */
1211 run_actions(WAIT); 1181 run_actions(WAIT);
1212 check_delayed_sigs(); 1182 check_delayed_sigs(&G.zero_ts);
1213 /* Next run anything to be run only once */ 1183 /* Next run anything to be run only once */
1214 run_actions(ONCE); 1184 run_actions(ONCE);
1215 1185
1216 /* Now run the looping stuff for the rest of forever. 1186 /* Now run the looping stuff for the rest of forever */
1217 */
1218 while (1) { 1187 while (1) {
1219 int maybe_WNOHANG;
1220
1221 maybe_WNOHANG = check_delayed_sigs();
1222
1223 /* (Re)run the respawn/askfirst stuff */ 1188 /* (Re)run the respawn/askfirst stuff */
1224 run_actions(RESPAWN | ASKFIRST); 1189 run_actions(RESPAWN | ASKFIRST);
1225 maybe_WNOHANG |= check_delayed_sigs();
1226 1190
1227 /* Don't consume all CPU time - sleep a bit */ 1191 /* Wait for any signal (typically it's SIGCHLD) */
1228 sleep(1); 1192 check_delayed_sigs(NULL); /* NULL timespec makes it wait */
1229 maybe_WNOHANG |= check_delayed_sigs(); 1193
1230 1194 /* Wait for any child process(es) to exit */
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) { 1195 while (1) {
1241 pid_t wpid; 1196 pid_t wpid;
1242 struct init_action *a; 1197 struct init_action *a;
1243 1198
1244 /* If signals happen _in_ the wait, they interrupt it, 1199 wpid = waitpid(-1, NULL, WNOHANG);
1245 * bb_signals_recursive_norestart set them up that way
1246 */
1247 wpid = waitpid(-1, NULL, maybe_WNOHANG);
1248 if (wpid <= 0) 1200 if (wpid <= 0)
1249 break; 1201 break;
1250 1202
1251 a = mark_terminated(wpid); 1203 a = mark_terminated(wpid);
1252 if (a) { 1204 if (a) {
1253 message(L_LOG, "process '%s' (pid %d) exited. " 1205 message(L_LOG, "process '%s' (pid %u) exited. "
1254 "Scheduling for restart.", 1206 "Scheduling for restart.",
1255 a->command, wpid); 1207 a->command, (unsigned)wpid);
1256 } 1208 }
1257 /* See if anyone else is waiting to be reaped */
1258 maybe_WNOHANG = WNOHANG;
1259 } 1209 }
1210
1211 /* Don't consume all CPU time - sleep a bit */
1212 sleep(1);
1260 } /* while (1) */ 1213 } /* while (1) */
1261} 1214}
1262 1215
@@ -1269,11 +1222,17 @@ int init_main(int argc UNUSED_PARAM, char **argv)
1269//usage: "Init is the first process started during boot. It never exits." 1222//usage: "Init is the first process started during boot. It never exits."
1270//usage: IF_FEATURE_USE_INITTAB( 1223//usage: IF_FEATURE_USE_INITTAB(
1271//usage: "\n""It (re)spawns children according to /etc/inittab." 1224//usage: "\n""It (re)spawns children according to /etc/inittab."
1225//usage: "\n""Signals:"
1226//usage: "\n""HUP: reload /etc/inittab"
1272//usage: ) 1227//usage: )
1273//usage: IF_NOT_FEATURE_USE_INITTAB( 1228//usage: IF_NOT_FEATURE_USE_INITTAB(
1274//usage: "\n""This version of init doesn't use /etc/inittab," 1229//usage: "\n""This version of init doesn't use /etc/inittab,"
1275//usage: "\n""has fixed set of processed to run." 1230//usage: "\n""has fixed set of processed to run."
1231//usage: "\n""Signals:"
1276//usage: ) 1232//usage: )
1233//usage: "\n""TSTP: stop respawning until CONT"
1234//usage: "\n""QUIT: re-exec another init"
1235//usage: "\n""USR1/TERM/USR2/INT: run halt/reboot/poweroff/Ctrl-Alt-Del script"
1277//usage: 1236//usage:
1278//usage:#define init_notes_usage 1237//usage:#define init_notes_usage
1279//usage: "This version of init is designed to be run only by the kernel.\n" 1238//usage: "This version of init is designed to be run only by the kernel.\n"