Commit a0f6932e authored by Max Kellermann's avatar Max Kellermann

unix/SignalHandlers: shut down if parent process dies in --no-daemon mode

By default, if the parent of a process dies, the process gets SIGHUP and is supposed to shut down. This however doesn't work for MPD, because MPD redefines SIGHUP with a different meaning (like most daemons do). To work around this, we configure the kernel to send SIGTERM instead of SIGHUP. Closes https://github.com/MusicPlayerDaemon/MPD/issues/1706
parent 6e700dab
...@@ -3,6 +3,8 @@ ver 0.23.13 (not yet released) ...@@ -3,6 +3,8 @@ ver 0.23.13 (not yet released)
- curl: fix busy loop after connection failed - curl: fix busy loop after connection failed
* output * output
- pipewire: fix corruption bug due to missing lock - pipewire: fix corruption bug due to missing lock
* Linux
- shut down if parent process dies in --no-daemon mode
ver 0.23.12 (2023/01/17) ver 0.23.12 (2023/01/17)
* input * input
......
...@@ -482,7 +482,10 @@ MainConfigured(const CommandLineOptions &options, ...@@ -482,7 +482,10 @@ MainConfigured(const CommandLineOptions &options,
#ifndef ANDROID #ifndef ANDROID
setup_log_output(); setup_log_output();
const ScopeSignalHandlersInit signal_handlers_init(instance); const ScopeSignalHandlersInit signal_handlers_init{
instance,
options.daemon,
};
#endif #endif
instance.io_thread.Start(); instance.io_thread.Start();
......
...@@ -30,6 +30,10 @@ ...@@ -30,6 +30,10 @@
#include <csignal> #include <csignal>
#ifdef __linux__
#include <sys/prctl.h>
#endif
static constexpr Domain signal_handlers_domain("signal_handlers"); static constexpr Domain signal_handlers_domain("signal_handlers");
static void static void
...@@ -60,7 +64,7 @@ handle_reload_event(void *ctx) noexcept ...@@ -60,7 +64,7 @@ handle_reload_event(void *ctx) noexcept
#endif #endif
void void
SignalHandlersInit(Instance &instance) SignalHandlersInit(Instance &instance, bool daemon)
{ {
auto &loop = instance.event_loop; auto &loop = instance.event_loop;
...@@ -79,6 +83,14 @@ SignalHandlersInit(Instance &instance) ...@@ -79,6 +83,14 @@ SignalHandlersInit(Instance &instance)
SignalMonitorRegister(SIGHUP, {&instance, handle_reload_event}); SignalMonitorRegister(SIGHUP, {&instance, handle_reload_event});
#endif #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 void
......
...@@ -23,15 +23,15 @@ ...@@ -23,15 +23,15 @@
struct Instance; struct Instance;
void void
SignalHandlersInit(Instance &instance); SignalHandlersInit(Instance &instance, bool daemon);
void void
SignalHandlersFinish() noexcept; SignalHandlersFinish() noexcept;
class ScopeSignalHandlersInit { class ScopeSignalHandlersInit {
public: public:
ScopeSignalHandlersInit(Instance &instance) { ScopeSignalHandlersInit(Instance &instance, bool daemon) {
SignalHandlersInit(instance); SignalHandlersInit(instance, daemon);
} }
~ScopeSignalHandlersInit() noexcept { ~ScopeSignalHandlersInit() noexcept {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment