import lsattr and chattr from e2fsprogs
[oweals/busybox.git] / init / init.c
index 8a63ff350e4b72afedacd8272644d346672ac5bb..85085117315ea7dbd4831952fbc081cf0f8fd1e6 100644 (file)
@@ -453,6 +453,7 @@ static pid_t run(const struct init_action *a)
                signal(SIGINT, SIG_DFL);
                signal(SIGTERM, SIG_DFL);
                signal(SIGHUP, SIG_DFL);
+               signal(SIGQUIT, SIG_DFL);
                signal(SIGCONT, SIG_DFL);
                signal(SIGSTOP, SIG_DFL);
                signal(SIGTSTP, SIG_DFL);
@@ -693,6 +694,7 @@ static void shutdown_system(void)
        /* first disable all our signals */
        sigemptyset(&block_signals);
        sigaddset(&block_signals, SIGHUP);
+       sigaddset(&block_signals, SIGQUIT);
        sigaddset(&block_signals, SIGCHLD);
        sigaddset(&block_signals, SIGUSR1);
        sigaddset(&block_signals, SIGUSR2);
@@ -737,6 +739,7 @@ static void exec_signal(int sig)
                        /* unblock all signals, blocked in shutdown_system() */
                        sigemptyset(&unblock_signals);
                        sigaddset(&unblock_signals, SIGHUP);
+                       sigaddset(&unblock_signals, SIGQUIT);
                        sigaddset(&unblock_signals, SIGCHLD);
                        sigaddset(&unblock_signals, SIGUSR1);
                        sigaddset(&unblock_signals, SIGUSR2);
@@ -865,9 +868,11 @@ static void new_init_action(int action, const char *command, const char *cons)
 
        /* Append to the end of the list */
        for (a = last = init_action_list; a; a = a->next) {
-               /* don't enter action if it's already in the list */
+               /* don't enter action if it's already in the list,
+                * but do overwrite existing actions */
                if ((strcmp(a->command, command) == 0) &&
                    (strcmp(a->terminal, cons) ==0)) {
+                       a->action = action;
                        free(new_action);
                        return;
                }
@@ -1047,14 +1052,33 @@ static void parse_inittab(void)
 #endif                                                 /* CONFIG_FEATURE_USE_INITTAB */
 }
 
+#ifdef CONFIG_FEATURE_USE_INITTAB
 static void reload_signal(int sig)
 {
-        message(LOG, "Reloading /etc/inittab");
-        parse_inittab();
+       struct init_action *a, *tmp;
+
+       message(LOG, "Reloading /etc/inittab");
+
+       /* disable old entrys */
+       for (a = init_action_list; a; a = a->next ) {
+               a->action = ONCE;
+       }
+
+       parse_inittab();
+
+       /* remove unused entrys */
+       for (a = init_action_list; a; a = tmp) {
+               tmp = a->next;
+               if (a->action & (ONCE | SYSINIT | WAIT ) &&
+                               a->pid == 0 ) {
+                       delete_init_action(a);
+               }
+       }
        run_actions(RESPAWN);
-        return;
+       return;
 }
-                                                            
+#endif                                                 /* CONFIG_FEATURE_USE_INITTAB */
+
 extern int init_main(int argc, char **argv)
 {
        struct init_action *a;
@@ -1076,6 +1100,7 @@ extern int init_main(int argc, char **argv)
        /* Set up sig handlers  -- be sure to
         * clear all of these in run() */
        signal(SIGHUP, exec_signal);
+       signal(SIGQUIT, exec_signal);
        signal(SIGUSR1, halt_signal);
        signal(SIGUSR2, halt_signal);
        signal(SIGINT, ctrlaltdel_signal);
@@ -1145,8 +1170,13 @@ extern int init_main(int argc, char **argv)
        /* Next run anything to be run only once */
        run_actions(ONCE);
 
+#ifdef CONFIG_FEATURE_USE_INITTAB
        /* Redefine SIGHUP to reread /etc/inittab */
        signal(SIGHUP, reload_signal);
+#else
+       signal(SIGHUP, SIG_IGN);
+#endif /* CONFIG_FEATURE_USE_INITTAB */
+
 
        /* Now run the looping stuff for the rest of forever */
        while (1) {