aboutsummaryrefslogtreecommitdiffstats
path: root/src/unix
diff options
context:
space:
mode:
Diffstat (limited to 'src/unix')
-rw-r--r--src/unix/Daemon.cxx23
-rw-r--r--src/unix/Daemon.hxx18
-rw-r--r--src/unix/PidFile.hxx61
-rw-r--r--src/unix/SignalHandlers.cxx2
-rw-r--r--src/unix/SignalHandlers.hxx2
5 files changed, 64 insertions, 42 deletions
diff --git a/src/unix/Daemon.cxx b/src/unix/Daemon.cxx
index d283108ed..9aa16a078 100644
--- a/src/unix/Daemon.cxx
+++ b/src/unix/Daemon.cxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * Copyright (C) 2003-2015 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -36,6 +36,10 @@
#include <grp.h>
#endif
+#ifndef WCOREDUMP
+#define WCOREDUMP(v) 0
+#endif
+
#ifndef WIN32
/** the Unix user name which MPD runs as */
@@ -62,28 +66,17 @@ static int detach_fd = -1;
void
daemonize_kill(void)
{
- FILE *fp;
- int pid, ret;
-
if (pidfile.IsNull())
FatalError("no pid_file specified in the config file");
- fp = FOpen(pidfile, "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);
- ret = kill(pid, SIGTERM);
- if (ret < 0)
+ if (kill(pid, SIGTERM) < 0)
FormatFatalSystemError("unable to kill process %i",
int(pid));
diff --git a/src/unix/Daemon.hxx b/src/unix/Daemon.hxx
index fe5681511..5937705ce 100644
--- a/src/unix/Daemon.hxx
+++ b/src/unix/Daemon.hxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * Copyright (C) 2003-2015 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -33,10 +33,10 @@ daemonize_init(const char *user, const char *group, AllocatedPath &&pidfile)
#ifndef WIN32
void
-daemonize_finish(void);
+daemonize_finish();
#else
static inline void
-daemonize_finish(void)
+daemonize_finish()
{ /* nop */ }
#endif
@@ -46,11 +46,11 @@ daemonize_finish(void)
*/
#ifndef WIN32
void
-daemonize_kill(void);
+daemonize_kill();
#else
#include "system/FatalError.hxx"
static inline void
-daemonize_kill(void)
+daemonize_kill()
{
FatalError("--kill is not available on WIN32");
}
@@ -61,10 +61,10 @@ daemonize_kill(void)
*/
#ifndef WIN32
void
-daemonize_close_stdin(void);
+daemonize_close_stdin();
#else
static inline void
-daemonize_close_stdin(void) {}
+daemonize_close_stdin() {}
#endif
/**
@@ -72,10 +72,10 @@ daemonize_close_stdin(void) {}
*/
#ifndef WIN32
void
-daemonize_set_user(void);
+daemonize_set_user();
#else
static inline void
-daemonize_set_user(void)
+daemonize_set_user()
{ /* nop */ }
#endif
diff --git a/src/unix/PidFile.hxx b/src/unix/PidFile.hxx
index a242c7810..cbb681554 100644
--- a/src/unix/PidFile.hxx
+++ b/src/unix/PidFile.hxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * Copyright (C) 2003-2015 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -25,61 +25,90 @@
#include "Log.hxx"
#include <assert.h>
-#include <stdio.h>
-#include <sys/types.h>
+#include <string.h>
#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
class PidFile {
- FILE *file;
+ int fd;
public:
- PidFile(const AllocatedPath &path):file(nullptr) {
+ PidFile(const AllocatedPath &path):fd(-1) {
if (path.IsNull())
return;
- file = FOpen(path, "w");
- if (file == nullptr) {
+ fd = OpenFile(path, O_WRONLY|O_CREAT|O_TRUNC, 0666);
+ if (fd < 0) {
const std::string utf8 = path.ToUTF8();
FormatFatalSystemError("Failed to create pid file \"%s\"",
- path.c_str());
+ utf8.c_str());
}
}
PidFile(const PidFile &) = delete;
void Close() {
- if (file == nullptr)
+ if (fd < 0)
return;
- fclose(file);
+ close(fd);
}
void Delete(const AllocatedPath &path) {
- if (file == nullptr) {
+ if (fd < 0) {
assert(path.IsNull());
return;
}
assert(!path.IsNull());
- fclose(file);
+ close(fd);
RemoveFile(path);
}
void Write(pid_t pid) {
- if (file == nullptr)
+ if (fd < 0)
return;
- fprintf(file, "%lu\n", (unsigned long)pid);
- fclose(file);
+ char buffer[64];
+ sprintf(buffer, "%lu\n", (unsigned long)pid);
+
+ write(fd, buffer, strlen(buffer));
+ close(fd);
}
void Write() {
- if (file == nullptr)
+ if (fd < 0)
return;
Write(getpid());
}
};
+gcc_pure
+static inline pid_t
+ReadPidFile(Path path)
+{
+ int fd = OpenFile(path, O_RDONLY, 0);
+ if (fd < 0)
+ return -1;
+
+ pid_t pid = -1;
+
+ char buffer[32];
+ auto nbytes = read(fd, buffer, sizeof(buffer) - 1);
+ if (nbytes > 0) {
+ buffer[nbytes] = 0;
+
+ char *endptr;
+ auto value = strtoul(buffer, &endptr, 10);
+ if (endptr > buffer)
+ pid = value;
+ }
+
+ close(fd);
+ return pid;
+}
+
#endif
diff --git a/src/unix/SignalHandlers.cxx b/src/unix/SignalHandlers.cxx
index 4aef4fa71..47085b4fd 100644
--- a/src/unix/SignalHandlers.cxx
+++ b/src/unix/SignalHandlers.cxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * Copyright (C) 2003-2015 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
diff --git a/src/unix/SignalHandlers.hxx b/src/unix/SignalHandlers.hxx
index 551b373c1..573db7511 100644
--- a/src/unix/SignalHandlers.hxx
+++ b/src/unix/SignalHandlers.hxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
+ * Copyright (C) 2003-2015 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify