init: reduce delay after starting kmodloader
[project/procd.git] / state.c
diff --git a/state.c b/state.c
index 7f0ec50..4ad9e2d 100644 (file)
--- a/state.c
+++ b/state.c
@@ -43,12 +43,14 @@ static int reboot_event;
 
 static void set_stdio(const char* tty)
 {
-       chdir("/dev");
-       freopen(tty, "r", stdin);
-       freopen(tty, "w", stdout);
-       freopen(tty, "w", stderr);
-       chdir("/");
-       fcntl(STDERR_FILENO, F_SETFL, fcntl(STDERR_FILENO, F_GETFL) | O_NONBLOCK);
+       if (chdir("/dev") ||
+           !freopen(tty, "r", stdin) ||
+           !freopen(tty, "w", stdout) ||
+           !freopen(tty, "w", stderr) ||
+           chdir("/"))
+               ERROR("failed to set stdio\n");
+       else
+               fcntl(STDERR_FILENO, F_SETFL, fcntl(STDERR_FILENO, F_GETFL) | O_NONBLOCK);
 }
 
 static void set_console(void)
@@ -70,7 +72,10 @@ static void set_console(void)
                i++;
        }
 
-       chdir("/dev");
+       if (chdir("/dev")) {
+               ERROR("failed to change dir to /dev\n");
+               return;
+       }
        while (tty!=NULL) {
                f = open(tty, O_RDONLY);
                if (f >= 0) {
@@ -81,7 +86,8 @@ static void set_console(void)
                tty=try[i];
                i++;
        }
-       chdir("/");
+       if (chdir("/"))
+               ERROR("failed to change dir to /\n");
 
        if (tty != NULL)
                set_stdio(tty);
@@ -105,7 +111,6 @@ static void state_enter(void)
                set_stdio("console");
                LOG("- ubus -\n");
                procd_connect_ubus();
-               service_init();
                service_start_early("ubus", ubus_cmd);
                break;
 
@@ -116,6 +121,9 @@ static void state_enter(void)
                procd_inittab_run("askconsole");
                procd_inittab_run("askfirst");
                procd_inittab_run("sysinit");
+
+               // switch to syslog log channel
+               ulog_open(ULOG_SYSLOG, LOG_DAEMON, "procd");
                break;
 
        case STATE_RUNNING:
@@ -131,6 +139,8 @@ static void state_enter(void)
                break;
 
        case STATE_HALT:
+               // To prevent killed processes from interrupting the sleep
+               signal(SIGCHLD, SIG_IGN);
                LOG("- SIGTERM processes -\n");
                kill(-1, SIGTERM);
                sync();
@@ -139,6 +149,7 @@ static void state_enter(void)
                kill(-1, SIGKILL);
                sync();
                sleep(1);
+#ifndef DISABLE_INIT
                if (reboot_event == RB_POWER_OFF)
                        LOG("- power down -\n");
                else
@@ -154,9 +165,11 @@ static void state_enter(void)
                        reboot(reboot_event);
                        _exit(EXIT_SUCCESS);
                }
-
                while (1)
                        sleep(1);
+#else
+               exit(0);
+#endif
                break;
 
        default: