view common/linuxlockfile.c @ 1250:7ea3a4c0e2ae

This should be serious software.
author Andre Heinecke <andre.heinecke@intevation.de>
date Thu, 25 Sep 2014 15:53:49 +0200
parents 2a1206932f53
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 */

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