Index: sbin/init/init.c =================================================================== --- sbin/init/init.c (revision 211114) +++ sbin/init/init.c (working copy) @@ -106,6 +106,8 @@ static void badsys(int); static int runshutdown(void); static char *strk(char *); +static int transition_change(int flag); +static int transition_query(void); /* * We really need a recursive typedef... @@ -131,6 +133,7 @@ int Reboot = FALSE; int howto = RB_AUTOBOOT; +int in_transit = 0; int devfs; @@ -768,6 +771,7 @@ } runcom_mode = FASTBOOT; + transition_change(0); return (state_func_t) runcom; } @@ -1304,8 +1308,14 @@ transition_handler(int sig) { + if (transition_query()) { + /* already in transition mode - ignore signal */ + warning("init: transition blocked\n"); + return; + } switch (sig) { case SIGHUP: + transition_change(1); requested_transition = clean_ttys; break; case SIGUSR2: @@ -1315,9 +1325,11 @@ case SIGINT: Reboot = TRUE; case SIGTERM: + transition_change(1); requested_transition = death; break; case SIGTSTP: + transition_change(1); requested_transition = catatonia; break; default: @@ -1363,6 +1375,7 @@ if ((pid = waitpid(-1, (int *) 0, 0)) != -1) collect_child(pid); + transition_change(0); return (state_func_t) requested_transition; } @@ -1535,6 +1548,7 @@ warning("some processes would not die; ps axl advised"); + transition_change(0); return (state_func_t) single_user; } @@ -1721,3 +1735,18 @@ } } #endif + + +static int +transition_change(int flag) { + if (in_transit) + return(0); + in_transit = flag; + return(1); +} + +static int +transition_query(void) { + return (in_transit); +} +