X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fmain.c;h=cef4f605a4d2e88877d7e488dbb83302e378f962;hb=ed9b54bd89b704e6111acbd91b6a7b50e3c30cf5;hp=36c5f88db63232928ba607e91518c4292a21aacc;hpb=a8ca900b2e60cc837c5e9529d7a9c778ff30c955;p=umurmur.git diff --git a/src/main.c b/src/main.c index 36c5f88..cef4f60 100644 --- a/src/main.c +++ b/src/main.c @@ -59,17 +59,50 @@ char *bindaddr; void lockfile(const char *pidfile) { - int lfp; + int lfp, flags; char str[16]; - - lfp = open(pidfile, O_RDWR|O_CREAT|O_EXCL, 0640); + + /* Don't use O_TRUNC here -- we want to leave the PID file + * unmodified if we cannot lock it. + */ + lfp = open(pidfile, O_WRONLY|O_CREAT, 0640); if (lfp < 0) Log_fatal("Cannot open PID-file %s for writing", pidfile); + + /* Try to lock the file. */ + if (lockf(lfp, F_TLOCK, 0) < 0) { + close(lfp); + + if (errno == EACCES || errno == EAGAIN) + Log_fatal("PID file is locked -- uMurmur already running?"); + + Log_fatal("Cannot lock PID file: %s", strerror(errno)); + } + + /* Now that we locked the file, erase its contents. */ + if (ftruncate(lfp, 0) < 0) { + close(lfp); + Log_fatal("Cannot truncate PID file: %s", strerror(errno)); + } + snprintf(str,16,"%d\n", getpid()); write(lfp, str, strlen(str)); /* record pid to lockfile */ - close(lfp); Log_info("PID-file: %s", pidfile); + + /* If uMurmur ever starts to fork()+exec(), we don't want it to + * leak the fd to the forked process though. Set the close-on-exec + * flag to prevent leakage. + */ + flags = fcntl(lfp, F_GETFD, 0); + flags |= FD_CLOEXEC; + fcntl(lfp, F_SETFD, (long) flags); + + /* Don't close(lfp) here! + * We want the fd to remain opened so the lock is held until the + * process exits. + */ + lfp = -1; } /* Drops privileges (if configured to do so). */