diff --git a/NEWS b/NEWS index 015cffde2..18ac57f8f 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,8 @@ ver 0.24 (not yet released) * switch to C++20 - GCC 10 or clang 11 (or newer) recommended * static partition configuration +* Linux + - shut down if parent process dies in --no-daemon mode * Windows - build with libsamplerate - remove JACK DLL support diff --git a/src/Main.cxx b/src/Main.cxx index 278772ec4..0a2811d1c 100644 --- a/src/Main.cxx +++ b/src/Main.cxx @@ -431,7 +431,10 @@ MainConfigured(const CommandLineOptions &options, #ifndef ANDROID setup_log_output(); - const ScopeSignalHandlersInit signal_handlers_init(instance); + const ScopeSignalHandlersInit signal_handlers_init{ + instance, + options.daemon, + }; #endif instance.io_thread.Start(); diff --git a/src/unix/SignalHandlers.cxx b/src/unix/SignalHandlers.cxx index c423ebac6..cbdfd1940 100644 --- a/src/unix/SignalHandlers.cxx +++ b/src/unix/SignalHandlers.cxx @@ -30,6 +30,10 @@ #include <csignal> +#ifdef __linux__ +#include <sys/prctl.h> +#endif + static constexpr Domain signal_handlers_domain("signal_handlers"); static void @@ -60,7 +64,7 @@ handle_reload_event(void *ctx) noexcept #endif void -SignalHandlersInit(Instance &instance) +SignalHandlersInit(Instance &instance, bool daemon) { auto &loop = instance.event_loop; @@ -79,6 +83,14 @@ SignalHandlersInit(Instance &instance) SignalMonitorRegister(SIGHUP, {&instance, handle_reload_event}); #endif + + if (!daemon) { +#ifdef __linux__ + /* if MPD was not daemonized, shut it down when the + parent process dies */ + prctl(PR_SET_PDEATHSIG, SIGTERM); +#endif + } } void diff --git a/src/unix/SignalHandlers.hxx b/src/unix/SignalHandlers.hxx index 2d8da72da..836bbc927 100644 --- a/src/unix/SignalHandlers.hxx +++ b/src/unix/SignalHandlers.hxx @@ -23,15 +23,15 @@ struct Instance; void -SignalHandlersInit(Instance &instance); +SignalHandlersInit(Instance &instance, bool daemon); void SignalHandlersFinish() noexcept; class ScopeSignalHandlersInit { public: - ScopeSignalHandlersInit(Instance &instance) { - SignalHandlersInit(instance); + ScopeSignalHandlersInit(Instance &instance, bool daemon) { + SignalHandlersInit(instance, daemon); } ~ScopeSignalHandlersInit() noexcept {