changeset 8036:b3303b65c3f2 HEAD

Added file_dotlock_open_mode().
author Timo Sirainen <tss@iki.fi>
date Sun, 20 Jul 2008 23:19:34 +0300
parents ed12eee73357
children ab1c170b1559
files src/lib/file-dotlock.c src/lib/file-dotlock.h
diffstat 2 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 	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)
 {
--- 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 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);