From: Michael Gernoth Date: Sun, 16 Jun 2013 12:36:30 +0000 (+0200) Subject: refuse to start when PID file exists X-Git-Tag: v0.100~80 X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/commitdiff_plain/e6ab46311df1302b261d5cd509d8737c558e4a98?ds=inline refuse to start when PID file exists --- diff --git a/hmland.c b/hmland.c index 519e02b..f3353f6 100644 --- a/hmland.c +++ b/hmland.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -405,14 +406,36 @@ static int socket_server(char *iface, int port, int flags) FILE *pidfile = NULL; if (flags & FLAG_PID_FILE) { - mode_t old_umask; - - old_umask = umask(022); - pidfile = fopen(PID_FILE, "w"); - umask(old_umask); + int fd; + + fd = open(PID_FILE, O_CREAT | O_EXCL | O_WRONLY, 0644); + if (fd == -1) { + if (errno == EEXIST) { + pid_t old_pid; + pidfile = fopen(PID_FILE, "r"); + if (!pidfile) { + perror("PID file " PID_FILE " already exists, already running?"); + exit(EXIT_FAILURE); + } + + if (fscanf(pidfile, "%u", &old_pid) != 1) { + fclose(pidfile); + fprintf(stderr, "Can't read old PID from " PID_FILE ", already running?\n"); + exit(EXIT_FAILURE); + } + + fclose(pidfile); + + fprintf(stderr, "Already running with PID %u according to " PID_FILE "!\n", old_pid); + exit(EXIT_FAILURE); + } + perror("Can't create PID file " PID_FILE); + exit(EXIT_FAILURE); + } + pidfile = fdopen(fd, "w"); if (!pidfile) { - perror("Can't create PID file " PID_FILE); + perror("Can't reopen PID file fd"); exit(EXIT_FAILURE); }