Mercurial > trustbridge
view common/linuxlockfile.c @ 1289:34c92dbfee7e
(issue44) Do not ask the user to confirm start on update
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 29 Sep 2014 13:34:19 +0200 |
parents | 7ea3a4c0e2ae |
children | 8362e30f7b55 |
line wrap: on
line source
/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik * Software engineering by Intevation GmbH * * This file is Free Software under the GNU GPL (v>=2) * and comes with ABSOLUTELY NO WARRANTY! * See LICENSE.txt for details. */ #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 (issue139): 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 */ DEBUGPRINTF("Could not remove lock from pid file.\n"); } close(fd); } #endif /* Not WIN32 */