Mercurial > trustbridge
diff common/linuxlockfile.c @ 782:20ca94680003
Implemented detection of running instance on linux using a lock file.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Mon, 14 Jul 2014 12:46:47 +0200 |
parents | |
children | a974b61a5cce |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/linuxlockfile.c Mon Jul 14 12:46:47 2014 +0200 @@ -0,0 +1,72 @@ +#ifndef WIN32 + +#include <fcntl.h> +#include <stdio.h> +#include <sys/types.h> +#include <unistd.h> + +#include "logging.h" + +int +open_lockfile(char *path) +{ + int fd; + char pidstr[20]; + size_t pidstrlen; + struct flock lk; + fd = open(path, O_RDWR | O_CREAT, 0600); + if (fd != -1) + { + /* Get an exclusive lock on the whole file. */ + lk.l_type = F_WRLCK; + lk.l_whence = SEEK_SET; + lk.l_start = 0; + lk.l_len = 0; + if (fcntl(fd, F_SETLK, &lk) != -1) + { + /* FIXME: For extra security we should check if there is + already a pid in the file. If so we should check in + /proc/$PID if there is still a process of the same name + as ours running... */ + ftruncate(fd, 0); + pidstrlen = (size_t)snprintf(pidstr, sizeof(pidstr), "%d", getpid()); + write(fd, pidstr, pidstrlen); + } + else + { + /* Lock can not be acquired. Bail out... */ + close(fd); + DEBUGPRINTF("Could not get an exclusive lock on %s.\n", path); + return -1; + } + } + else + { + DEBUGPRINTF("Failed to open lock file: %s.\n", path); + } + return fd; +} + +void +close_lockfile(int fd) +{ + struct flock lk; + + /* Delete the PID from file. */ + /* We do this instead of trying to unlink the file. */ + ftruncate(fd, 0); + + /* Remove lock from the file. */ + lk.l_type = F_UNLCK; + lk.l_whence = SEEK_SET; + lk.l_start = 0; + lk.l_len = 0; + if (fcntl(fd, F_SETLK, &lk) == -1) + { + /* Lock can not be removed?!? WTF? */ + DEBUGPRINTF("Could not remove lock from pid file. STRANGE!\n"); + } + close(fd); +} + +#endif /* Not WIN32 */