dovecot-1.2: Added file_dotlock_open_mode().

dovecot at dovecot.org dovecot at dovecot.org
Sun Jul 20 23:20:23 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/b3303b65c3f2
changeset: 8036:b3303b65c3f2
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Jul 20 23:19:34 2008 +0300
description:
Added file_dotlock_open_mode().

diffstat:

2 files changed, 30 insertions(+)
src/lib/file-dotlock.c |   25 +++++++++++++++++++++++++
src/lib/file-dotlock.h |    5 +++++

diffs (50 lines):

diff -r ed12eee73357 -r b3303b65c3f2 src/lib/file-dotlock.c
--- a/src/lib/file-dotlock.c	Sun Jul 20 23:19:25 2008 +0300
+++ b/src/lib/file-dotlock.c	Sun Jul 20 23:19:34 2008 +0300
@@ -731,6 +731,31 @@ int file_dotlock_open(const struct dotlo
 	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 -r ed12eee73357 -r b3303b65c3f2 src/lib/file-dotlock.h
--- a/src/lib/file-dotlock.h	Sun Jul 20 23:19:25 2008 +0300
+++ b/src/lib/file-dotlock.h	Sun Jul 20 23:19:34 2008 +0300
@@ -68,6 +68,11 @@ int file_dotlock_open(const struct dotlo
 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);


More information about the dovecot-cvs mailing list