From a4e42172045f62583cbf97a6a94c3d2b9de77a6c Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Fri, 5 Nov 2021 08:54:57 +0100
Subject: [PATCH] Main: ignore the "pid_file" setting if started as systemd
 service

Commit 552c30eae caused problems for those people who still had a
"pid_file" setting (even though that is obsolete with systemd),
because now /run/mpd is owned by root:root (our mpd.service has no
User=mpd directive, so systemd starts MPD as root).

To work around this problem, and to be able to keep
RuntimeDirectory=mpd (which solved a problem of other MPD users), the
best compromise seems to just ignore the "pid_file" setting when it is
of no use.
---
 NEWS         |  1 +
 src/Main.cxx | 12 +++++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index 152357082..34bc20f3f 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ ver 0.23.4 (not yet released)
 * output
   - alsa: add option "thesycon_dsd_workaround" to work around device bug
 * fix crash or debug builds if startup fails
+* ignore the "pid_file" setting if started as systemd service
 * Windows
   - enable the "openmpt" decoder plugin
 
diff --git a/src/Main.cxx b/src/Main.cxx
index 84e418aaf..77575a008 100644
--- a/src/Main.cxx
+++ b/src/Main.cxx
@@ -145,9 +145,19 @@ static void
 glue_daemonize_init(const CommandLineOptions &options,
 		    const ConfigData &config)
 {
+	auto pid_file = config.GetPath(ConfigOption::PID_FILE);
+
+#ifdef __linux__
+	if (options.systemd && pid_file != nullptr) {
+		pid_file = nullptr;
+		fprintf(stderr,
+			"Ignoring the 'pid_file' setting in systemd mode\n");
+	}
+#endif
+
 	daemonize_init(config.GetString(ConfigOption::USER),
 		       config.GetString(ConfigOption::GROUP),
-		       config.GetPath(ConfigOption::PID_FILE));
+		       std::move(pid_file));
 
 	if (options.kill)
 		daemonize_kill();