From: John Crispin Date: Fri, 8 Mar 2013 22:52:16 +0000 (+0100) Subject: add state handler X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=af863b697eacbe29db1d448886bebb2609922a64;p=oweals%2Fprocd.git add state handler --- diff --git a/state.c b/state.c new file mode 100644 index 0000000..1abcbca --- /dev/null +++ b/state.c @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2013 Felix Fietkau + * Copyright (C) 2013 John Crispin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 + * as published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include + +#include "procd.h" +#include "syslog.h" +#include "hotplug.h" +#include "watchdog.h" + +enum { + STATE_NONE = 0, + STATE_EARLY, + STATE_INIT, + STATE_RUNNING, + STATE_SHUTDOWN, + STATE_HALT, + __STATE_MAX, +}; + +static int state = STATE_NONE; +static int reboot_event; + +static void state_enter(void) +{ + + switch (state) { + case STATE_EARLY: + LOG("- early -\n"); + watchdog_init(); + hotplug("/etc/hotplug.json"); + procd_coldplug(); + break; + + case STATE_INIT: + LOG("- init -\n"); + log_init(); + procd_connect_ubus(); + procd_inittab(); + procd_inittab_run("askconsole"); + procd_inittab_run("askfirst"); + procd_inittab_run("sysinit"); + break; + + case STATE_RUNNING: + LOG("- init complete -\n"); + break; + + case STATE_SHUTDOWN: + LOG("- shutdown -\n"); + procd_inittab_run("shutdown"); + break; + + case STATE_HALT: + LOG("- reboot -\nprocd says good bye !\n"); + sync(); + sleep(1); + reboot(reboot_event); + break; + + default: + ERROR("Unhandled state %d\n", state); + return; + }; +} + +void procd_state_next(void) +{ + DEBUG(2, "Change state %d -> %d\n", state, state + 1); + state++; + state_enter(); +} + +void procd_shutdown(int event) +{ + DEBUG(1, "Shutting down system with event %x\n", reboot_event); + reboot_event = event; + state = STATE_SHUTDOWN; + state_enter(); +}