Skip to content

Commit

Permalink
unix/PidFile: use raw file descriptor instead of stdio
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxKellermann committed Aug 15, 2015
1 parent 567bf44 commit 4f29034
Showing 1 changed file with 29 additions and 20 deletions.
49 changes: 29 additions & 20 deletions src/unix/PidFile.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -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());
Expand All @@ -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;
}

Expand Down

0 comments on commit 4f29034

Please sign in to comment.