diff options
Diffstat (limited to 'src/unix')
-rw-r--r-- | src/unix/Daemon.cxx | 23 | ||||
-rw-r--r-- | src/unix/Daemon.hxx | 18 | ||||
-rw-r--r-- | src/unix/PidFile.hxx | 61 | ||||
-rw-r--r-- | src/unix/SignalHandlers.cxx | 2 | ||||
-rw-r--r-- | src/unix/SignalHandlers.hxx | 2 |
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 |