aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2015-08-15 16:42:07 +0200
committerMax Kellermann <max@duempel.org>2015-08-15 16:42:07 +0200
commit4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c (patch)
tree03b2cf0794a54a3565abf16c1dd1e2a07013d9aa
parent567bf445bf188ae60056e779927da52dcd7ed35d (diff)
downloadmpd-4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c.tar.gz
mpd-4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c.tar.xz
mpd-4f29034f11bff48f5cd5d3ca7cc2caa0e9dfe28c.zip
unix/PidFile: use raw file descriptor instead of stdio
Diffstat (limited to '')
-rw-r--r--src/unix/PidFile.hxx49
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;
}