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 */

http://wald.intevation.org/projects/trustbridge/