state: fix shutdown when running in a container (FS#2425)
authorPaul Spooren <mail@aparcar.org>
Mon, 5 Aug 2019 16:07:45 +0000 (18:07 +0200)
committerHans Dedecker <dedeckeh@gmail.com>
Mon, 5 Aug 2019 19:44:23 +0000 (21:44 +0200)
Applies patch from @mikma [0] to fix Docker shutdown. Added detection to
state.c if running in a container or not.

Tested with a x86/64 Docker image.

Fixes FS#2425

CC: Mikael Magnusson <mikma@users.sourceforge.net>
CC: Petr Štetiar <ynezz@true.cz>
[0]: https://github.com/mikma/lxd-openwrt/blob/master/patches/procd-master/0003-docker-fix-problem-stopping-container.patch

Signed-off-by: Paul Spooren <mail@aparcar.org>
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com> [coding style aligment]
state.c

diff --git a/state.c b/state.c
index ccf410454711880c1f3639f4a84bb8ea42e9a05c..4737d0121ad02a104549f4a0ca8c420486873c90 100644 (file)
--- a/state.c
+++ b/state.c
@@ -20,6 +20,7 @@
 #include <sys/types.h>
 #include <signal.h>
 
+#include "container.h"
 #include "procd.h"
 #include "syslog.h"
 #include "plug/hotplug.h"
@@ -157,18 +158,22 @@ static void state_enter(void)
                else
                        LOG("- reboot -\n");
 
-               /* 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)
+               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);
 #else
                exit(0);
 #endif