]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added file_dotlock_open_mode().
authorTimo Sirainen <tss@iki.fi>
Sun, 20 Jul 2008 20:19:34 +0000 (23:19 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 20 Jul 2008 20:19:34 +0000 (23:19 +0300)
--HG--
branch : HEAD

src/lib/file-dotlock.c
src/lib/file-dotlock.h

index a62077d301454c78c12490166387a712a2d997de..6dbbf5c33a2558f02c3e9a33867544a3f85d91a8 100644 (file)
@@ -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)
 {
index bc69c035248fada534be3b719a0d44ba45b14b60..767832ec9020e1b92fca0261fdead75e95581e3e 100644 (file)
@@ -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);