summaryrefslogtreecommitdiffstats
path: root/state.c
diff options
context:
space:
mode:
authorJohn Crispin <blogic@openwrt.org>2013-03-08 23:52:16 +0100
committerJohn Crispin <blogic@openwrt.org>2013-03-13 18:58:14 +0100
commitaf863b697eacbe29db1d448886bebb2609922a64 (patch)
tree0cca2948a7a008630b81f6c415fb19be1c8d0ab8 /state.c
parent13e442a84766b111b50651bab6f97ad6f951148a (diff)
downloadunitd-af863b697eacbe29db1d448886bebb2609922a64.tar
unitd-af863b697eacbe29db1d448886bebb2609922a64.zip
add state handler
Diffstat (limited to 'state.c')
-rw-r--r--state.c93
1 files changed, 93 insertions, 0 deletions
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 <nbd@openwrt.org>
+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
+ *
+ * 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 <sys/reboot.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#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();
+}