add state handler
authorJohn Crispin <blogic@openwrt.org>
Fri, 8 Mar 2013 22:52:16 +0000 (23:52 +0100)
committerJohn Crispin <blogic@openwrt.org>
Wed, 13 Mar 2013 17:58:14 +0000 (18:58 +0100)
state.c [new file with mode: 0644]

diff --git a/state.c b/state.c
new file mode 100644 (file)
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();
+}