diff options
author | Max Kellermann <max@duempel.org> | 2015-08-15 16:42:07 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2015-08-15 16:42:07 +0200 |
commit | 4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c (patch) | |
tree | 03b2cf0794a54a3565abf16c1dd1e2a07013d9aa | |
parent | 567bf445bf188ae60056e779927da52dcd7ed35d (diff) | |
download | mpd-4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c.tar.gz mpd-4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c.tar.xz mpd-4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c.zip |
unix/PidFile: use raw file descriptor instead of stdio
-rw-r--r-- | src/unix/PidFile.hxx | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/src/unix/PidFile.hxx b/src/unix/PidFile.hxx index a8af1e890..3f97484a1 100644 --- a/src/unix/PidFile.hxx +++ b/src/unix/PidFile.hxx @@ -25,20 +25,19 @@ #include "Log.hxx" #include <assert.h> -#include <stdio.h> -#include <sys/types.h> #include <unistd.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, FOpenMode::WriteText); - 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\"", utf8.c_str()); @@ -48,34 +47,35 @@ public: 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); + close(fd); } void Write() { - if (file == nullptr) + if (fd < 0) return; Write(getpid()); @@ -86,15 +86,24 @@ gcc_pure static inline pid_t ReadPidFile(Path path) { - FILE *fp = FOpen(path, PATH_LITERAL("r")); - if (fp == nullptr) + int fd = OpenFile(path, O_RDONLY, 0); + if (fd < 0) return -1; - int pid; - if (fscanf(fp, "%i", &pid) != 1) - pid = -1; + pid_t pid = -1; - fclose(fp); + 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; } |