import lsattr and chattr from e2fsprogs
[oweals/busybox.git] / init / init.c
index fd1443e4455e5bf6ae3844bacaa5eff89c34106e..85085117315ea7dbd4831952fbc081cf0f8fd1e6 100644 (file)
 #endif
 
 
-#if defined(__UCLIBC__) && !defined(__ARCH_HAS_MMU__)
-#define fork   vfork
-#endif
-
 #define INIT_BUFFS_SIZE 256
 
 /* From <linux/vt.h> */
@@ -229,7 +225,9 @@ static void message(int device, const char *fmt, ...)
        /* Log the message to syslogd */
        if (device & LOG) {
                /* don`t out "\r\n" */
-               syslog_msg(LOG_DAEMON, LOG_INFO, msg + 1);
+               openlog(bb_applet_name, 0, LOG_DAEMON);
+               syslog(LOG_INFO, "%s", msg);
+               closelog();
        }
 
        msg[l++] = '\n';
@@ -455,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);
@@ -578,6 +577,7 @@ static pid_t run(const struct init_action *a)
                        }
                }
 
+#if !defined(__UCLIBC__) || defined(__ARCH_HAS_MMU__)
                if (a->action & ASKFIRST) {
                        char c;
                        /*
@@ -595,6 +595,7 @@ static pid_t run(const struct init_action *a)
                        while(read(0, &c, 1) == 1 && c != '\n')
                                ;
                }
+#endif
 
                /* Log the process name and args */
                message(LOG, "Starting pid %d, console %s: '%s'",
@@ -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);
@@ -846,7 +849,7 @@ static void cont_handler(int sig)
 
 static void new_init_action(int action, const char *command, const char *cons)
 {
-       struct init_action *new_action, *a;
+       struct init_action *new_action, *a, *last;
 
        if (*cons == '\0')
                cons = console;
@@ -864,16 +867,19 @@ static void new_init_action(int action, const char *command, const char *cons)
        }
 
        /* Append to the end of the list */
-       for (a = init_action_list; a && a->next; a = a->next) {
-               /* don't enter action if it's already in the list */
+       for (a = last = init_action_list; a; a = a->next) {
+               /* 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;
                }
+               last = a;
        }
-       if (a) {
-               a->next = new_action;
+       if (last) {
+               last->next = new_action;
        } else {
                init_action_list = new_action;
        }
@@ -1046,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;
@@ -1075,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);
@@ -1144,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) {
@@ -1160,7 +1191,7 @@ extern int init_main(int argc, char **argv)
 
                /* Wait for a child process to exit */
                wpid = wait(&status);
-               while (init_action_list && wpid > 0) {
+               while (wpid > 0) {
                        /* Find out who died and clean up their corpse */
                        for (a = init_action_list; a; a = a->next) {
                                if (a->pid == wpid) {