Patch from Andrew Flegg:
authorEric Andersen <andersen@codepoet.org>
Tue, 22 Jul 2003 09:48:56 +0000 (09:48 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 22 Jul 2003 09:48:56 +0000 (09:48 -0000)
    Here's a pretty crude patch to reload /etc/inittab when init receives a
    SIGHUP. The mailing list archives weren't entirely clear on whether or
    not it should already happen, but didn't appear to be.

    The patch:
       * Adds a new function, reload_signal() which just calls
 parse_inittab() and run_actions(RESPAWN)

       * Before entering the while (1) loop set up SIGHUP to call
 reload_signal()

       * Modify new_init_action to skip the action if the same command
 already exists on the same terminal

    This last bit means that changing already running entries is a bit
    hairy as you can end up with, for example, two shells running on the
    same virtual console. However, for solely adding/removing entries this patch
    seems to work quite well.

init/init.c

index 1f0bd4aece390227b7f338460470a89ea29ee42e..657bad6cd52c150c9771ea7e84718d8ac8f8ede5 100644 (file)
@@ -847,7 +847,14 @@ static void new_init_action(int action, char *command, const char *cons)
        }
 
        /* Append to the end of the list */
-       for (a = init_action_list; a && a->next; a = a->next);
+       for (a = init_action_list; a && a->next; a = a->next) {
+               /* don't enter action if it's already in the list */
+               if ((strcmp(a->command, command) == 0) && 
+                   (strcmp(a->terminal, cons) ==0)) {
+                       free(new_action);
+                       return;
+               }
+       }
        if (a) {
                a->next = new_action;
        } else {
@@ -1022,7 +1029,14 @@ static void parse_inittab(void)
 #endif                                                 /* CONFIG_FEATURE_USE_INITTAB */
 }
 
-
+static void reload_signal(int sig)
+{
+        message(LOG, "Reloading /etc/inittab");
+        parse_inittab();
+       run_actions(RESPAWN);
+        return;
+}
+                                                                                
 extern int init_main(int argc, char **argv)
 {
        struct init_action *a;
@@ -1120,6 +1134,9 @@ extern int init_main(int argc, char **argv)
                loop_forever();
        }
 
+       /* Redefine SIGHUP to reread /etc/inittab */
+       signal(SIGHUP, reload_signal);
+
        /* Now run the looping stuff for the rest of forever */
        while (1) {
                /* run the respawn stuff */