X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=state.c;h=4ad9e2d8d32156c84f8e5c47c17525bd71745948;hp=7f0ec508566188d8e6a1e7afa34408c04634cde0;hb=2c9f5d4af1559b840c42f1443ede9f9fe809c58b;hpb=8b27adcf7516fa89ced66c840cfb085f2b6067af diff --git a/state.c b/state.c index 7f0ec50..4ad9e2d 100644 --- 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: