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; }
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'; }
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; }