[OpenWrt-Devel] [PATCH] procd: fix shutdown when running in a container

Hans Dedecker dedeckeh at gmail.com
Wed Aug 7 04:08:28 EDT 2019


On Mon, Aug 5, 2019 at 6:09 PM Paul Spooren <mail at aparcar.org> wrote:
>
> Applies patch from @mikma [0] to fix Docker shutdown. Added detection to
> state.c if running in a containre or not.
>
> Tested with a x86/64 Docker image.
>
> Fixes FS#2425
>
> CC: Mikael Magnusson <mikma at users.sourceforge.net>
> CC: Petr Štetiar <ynezz at 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 at aparcar.org>
Patch applied with some style changes

Hans
> ---
>  state.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/state.c b/state.c
> index ccf4104..b7cba88 100644
> --- 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);
> +               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);
> +                       /* 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);
>                 }
> -               while (1)
> -                       sleep(1);
>  #else
>                 exit(0);
>  #endif
> --
> 2.20.1
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list