Ejemplo n.º 1
0
static int
check_file_permissions (const char *file)
{
  int fd = -1;
  int err = 0;

  if ((fd = open (file, O_RDONLY)) == -1)
    return errno == ENOENT ? 0 : errno;

  err = stat_check (file, fd, 1);
  close (fd);
  fd = -1;
  if (err)
    {
      if (err == EINVAL)
	err = MU_ERR_LOCK_BAD_FILE;
      return err;
    }

  return 0;
}
Ejemplo n.º 2
0
if (((check & GF_MARKDIR) && (check & GF_GLOBBED))
			    && xp > Xstring(*xs, xp) && !ISDIRSEP(xp[-1])
			    && (S_ISDIR(lstatb.st_mode)
#ifdef S_ISLNK
				|| (S_ISLNK(lstatb.st_mode)
				    && stat_check() > 0
				    && S_ISDIR(statb.st_mode))
#endif /* S_ISLNK */
				    ))
			{
				*xp++ = DIRSEP;
				*xp = '\0';
			}
Ejemplo n.º 3
0
static int
lock_dotlock (mu_locker_t locker, enum mu_locker_mode mode)
{
  int rc;
  char *host = NULL;
  char pid[11];		/* 10 is strlen(2^32 = 4294967296) */
  char now[11];
  size_t sz = 0;
  int err = 0;
  int fd;
    
  if (locker->data.dot.nfslock)
    {
      unlink (locker->data.dot.nfslock);
      free (locker->data.dot.nfslock);
      locker->data.dot.nfslock = NULL;
    }

  expire_stale_lock (locker);

  /* build the NFS hitching-post to the lock file */

  rc = mu_get_host_name (&host);
  if (rc)
    return rc;

  snprintf (now, sizeof (now), "%lu", (unsigned long) time (0));
  now[sizeof (now) - 1] = 0;

  snprintf (pid, sizeof (pid), "%lu", (unsigned long) getpid ());
  pid[sizeof (pid) - 1] = 0;
		  
  sz = strlen (locker->file) + 1 /* "." */
    + strlen (pid) + 1 /* "." */
    + strlen (now) + 1 /* "." */
    + strlen (host) + 1;
  
  locker->data.dot.nfslock = malloc (sz);
  
  if (!locker->data.dot.nfslock)
    {
      free (host);
      return ENOMEM;
    }

  snprintf (locker->data.dot.nfslock, sz, "%s.%s.%s.%s",
	    locker->file, pid, now, host);
  free (host);
  
  fd = open (locker->data.dot.nfslock,
	     O_WRONLY | O_CREAT | O_EXCL, LOCKFILE_ATTR);
  if (fd == -1)
    {
      if (errno == EEXIST)
	return EAGAIN;
      else
	return errno;
    }
  close (fd);
  
  /* Try to link to the lockfile. */
  if (link (locker->data.dot.nfslock, locker->data.dot.dotlock) == -1)
    {
      unlink (locker->data.dot.nfslock);
      if (errno == EEXIST)
	return MU_ERR_LOCK_CONFLICT;
      return errno;
    }

  if ((fd = open (locker->data.dot.dotlock, O_RDWR)) == -1)
    {
      unlink (locker->data.dot.nfslock);
      return errno;
    }
  
  err = stat_check (locker->data.dot.nfslock, fd, 2);
  if (err)
    {
      unlink (locker->data.dot.nfslock);
      if (err == EINVAL)
	return MU_ERR_LOCK_BAD_LOCK;
      return errno;
    }

  unlink (locker->data.dot.nfslock);

  /* FIXME: If no errors, we have the lock. */
  assert (locker->refcnt == 0);

  if (locker->flags & MU_LOCKER_PID)
    {
      char buf[16];
      sprintf (buf, "%ld", (long) getpid ());
      write (fd, buf, strlen (buf));
    }
  close (fd);
  return 0;
}