jail: improve seccomp log output
[project/procd.git] / state.c
diff --git a/state.c b/state.c
index 4737d0121ad02a104549f4a0ca8c420486873c90..6ca1d5e77b2cf2b2e044861776585b231a3a50dc 100644 (file)
--- a/state.c
+++ b/state.c
@@ -13,6 +13,7 @@
  */
 
 #include <fcntl.h>
+#include <pwd.h>
 #include <sys/reboot.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -94,9 +95,38 @@ static void set_console(void)
                set_stdio(tty);
 }
 
+static void perform_halt()
+{
+       if (reboot_event == RB_POWER_OFF)
+               LOG("- power down -\n");
+       else
+               LOG("- reboot -\n");
+
+       /* Allow time for last message to reach serial console, etc */
+       sleep(1);
+
+       if (is_container()) {
+               reboot(reboot_event);
+               exit(EXIT_SUCCESS);
+               return;
+       }
+
+       /* We have to fork here, since the kernel calls do_exit(EXIT_SUCCESS)
+        * in linux/kernel/sys.c, which can cause the machine to panic when
+        * the init process exits... */
+       if (!vfork()) { /* child */
+               reboot(reboot_event);
+               _exit(EXIT_SUCCESS);
+       }
+
+       while (1)
+               sleep(1);
+}
+
 static void state_enter(void)
 {
        char ubus_cmd[] = "/sbin/ubusd";
+       struct passwd *p;
 
        switch (state) {
        case STATE_EARLY:
@@ -111,8 +141,13 @@ static void state_enter(void)
                watchdog_init(0);
                set_stdio("console");
                LOG("- ubus -\n");
+               p = getpwnam("ubus");
+               if (p) {
+                       mkdir(p->pw_dir, 0755);
+                       chown(p->pw_dir, p->pw_uid, p->pw_gid);
+               }
                procd_connect_ubus();
-               service_start_early("ubus", ubus_cmd);
+               service_start_early("ubus", ubus_cmd, p?"ubus":NULL, p?"ubus":NULL);
                break;
 
        case STATE_INIT:
@@ -153,29 +188,9 @@ static void state_enter(void)
                sync();
                sleep(1);
 #ifndef DISABLE_INIT
-               if (reboot_event == RB_POWER_OFF)
-                       LOG("- power down -\n");
-               else
-                       LOG("- reboot -\n");
-
-               if (!is_container()) {
-                       /* Allow time for last message to reach serial console, etc */
-                       sleep(1);
-
-                       /* We have to fork here, since the kernel calls do_exit(EXIT_SUCCESS)
-                        * in linux/kernel/sys.c, which can cause the machine to panic when
-                        * the init process exits... */
-                       if (!vfork( )) { /* child */
-                               reboot(reboot_event);
-                               _exit(EXIT_SUCCESS);
-                       }
-
-                       while (1)
-                               sleep(1);
-               } else
-                       exit(0);
+               perform_halt();
 #else
-               exit(0);
+               exit(EXIT_SUCCESS);
 #endif
                break;