--- /dev/null
+/*
+ * 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();
+}