aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/unix/Daemon.cxx14
-rw-r--r--src/unix/PidFile.hxx16
2 files changed, 18 insertions, 12 deletions
diff --git a/src/unix/Daemon.cxx b/src/unix/Daemon.cxx
index 4bb11aeac..d16de8928 100644
--- a/src/unix/Daemon.cxx
+++ b/src/unix/Daemon.cxx
@@ -65,25 +65,15 @@ static int detach_fd = -1;
void
daemonize_kill(void)
{
- FILE *fp;
- int pid;
-
if (pidfile.IsNull())
FatalError("no pid_file specified in the config file");
- fp = FOpen(pidfile, PATH_LITERAL("r"));
- if (fp == nullptr) {
- const std::string utf8 = pidfile.ToUTF8();
- FormatFatalSystemError("Unable to open pid file \"%s\"",
- utf8.c_str());
- }
-
- if (fscanf(fp, "%i", &pid) != 1) {
+ const pid_t pid = ReadPidFile(pidfile);
+ if (pid < 0) {
const std::string utf8 = pidfile.ToUTF8();
FormatFatalError("unable to read the pid from file \"%s\"",
utf8.c_str());
}
- fclose(fp);
if (kill(pid, SIGTERM) < 0)
FormatFatalSystemError("unable to kill process %i",
diff --git a/src/unix/PidFile.hxx b/src/unix/PidFile.hxx
index 3c3d5ca21..a8af1e890 100644
--- a/src/unix/PidFile.hxx
+++ b/src/unix/PidFile.hxx
@@ -82,4 +82,20 @@ public:
}
};
+gcc_pure
+static inline pid_t
+ReadPidFile(Path path)
+{
+ FILE *fp = FOpen(path, PATH_LITERAL("r"));
+ if (fp == nullptr)
+ return -1;
+
+ int pid;
+ if (fscanf(fp, "%i", &pid) != 1)
+ pid = -1;
+
+ fclose(fp);
+ return pid;
+}
+
#endif