From: Timo Sirainen Date: Sun, 20 Jul 2008 20:19:34 +0000 (+0300) Subject: Added file_dotlock_open_mode(). X-Git-Tag: 1.2.alpha1~125 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6f7617d14ae27473f55628fbdad2af2d75b909a9;p=thirdparty%2Fdovecot%2Fcore.git Added file_dotlock_open_mode(). --HG-- branch : HEAD --- diff --git a/src/lib/file-dotlock.c b/src/lib/file-dotlock.c index a62077d301..6dbbf5c33a 100644 --- a/src/lib/file-dotlock.c +++ b/src/lib/file-dotlock.c @@ -731,6 +731,31 @@ int file_dotlock_open(const struct dotlock_settings *set, const char *path, return dotlock->fd; } +int file_dotlock_open_mode(const struct dotlock_settings *set, const char *path, + enum dotlock_create_flags flags, + mode_t mode, uid_t uid, gid_t gid, + struct dotlock **dotlock_r) +{ + struct dotlock *dotlock; + mode_t old_mask; + int fd; + + old_mask = umask(0666 ^ mode); + fd = file_dotlock_open(set, path, flags, &dotlock); + umask(old_mask); + + if (fd != -1) { + if (fchown(fd, uid, gid) < 0) { + i_error("fchown(%s) failed: %m", + file_dotlock_get_lock_path(dotlock)); + file_dotlock_delete(&dotlock); + return -1; + } + } + *dotlock_r = dotlock; + return fd; +} + int file_dotlock_replace(struct dotlock **dotlock_p, enum dotlock_replace_flags flags) { diff --git a/src/lib/file-dotlock.h b/src/lib/file-dotlock.h index bc69c03524..767832ec90 100644 --- a/src/lib/file-dotlock.h +++ b/src/lib/file-dotlock.h @@ -68,6 +68,11 @@ int file_dotlock_delete(struct dotlock **dotlock); int file_dotlock_open(const struct dotlock_settings *set, const char *path, enum dotlock_create_flags flags, struct dotlock **dotlock_r); +/* Like file_dotlock_open(), but use the given file permissions. */ +int file_dotlock_open_mode(const struct dotlock_settings *set, const char *path, + enum dotlock_create_flags flags, + mode_t mode, uid_t uid, gid_t gid, + struct dotlock **dotlock_r); /* Replaces the file dotlock protects with the dotlock file itself. */ int file_dotlock_replace(struct dotlock **dotlock, enum dotlock_replace_flags flags);