[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-storage.c, 1.121, 1.122

cras at dovecot.org cras at dovecot.org
Mon Jun 26 20:48:22 EEST 2006


Update of /var/lib/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv10495

Modified Files:
	maildir-storage.c 
Log Message:
If dovecot-shared file exists in the Maildir++ root, use the file's mode and
gid when creating mailboxes under it.                  



Index: maildir-storage.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.c,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -d -r1.121 -r1.122
--- maildir-storage.c	17 Jun 2006 15:38:19 -0000	1.121
+++ maildir-storage.c	26 Jun 2006 17:48:20 -0000	1.122
@@ -17,7 +17,7 @@
 #include <unistd.h>
 #include <sys/stat.h>
 
-#define CREATE_MODE 0770 /* umask() should limit it more */
+#define CREATE_MODE 0777 /* umask() should limit it more */
 
 /* Don't allow creating too long mailbox names. They could start causing
    problems when they reach the limit. */
@@ -567,23 +567,44 @@
 	}
 }
 
-static int maildir_create_shared(struct mail_storage *storage,
-				 const char *path, mode_t mode, gid_t gid)
+static int maildir_create_shared(struct index_storage *storage,
+				 const char *dir, mode_t mode, gid_t gid)
 {
-	mode_t old_mask = umask(0);
+	const char *path;
+	mode_t old_mask;
 	int fd;
 
-	fd = open(path, O_WRONLY | O_CREAT, mode);
+	/* add the execute bit if either read or write bit is set */
+	if ((mode & 0600) != 0) mode |= 0100;
+	if ((mode & 0060) != 0) mode |= 0010;
+	if ((mode & 0006) != 0) mode |= 0001;
+
+	old_mask = umask(0777 ^ mode);
+	if (create_maildir(storage, dir, FALSE) < 0) {
+		if (errno == EEXIST) {
+			mail_storage_set_error(&storage->storage,
+					       "Mailbox already exists");
+		}
+		umask(old_mask);
+		return -1;
+	}
+	if (chown(dir, (uid_t)-1, gid) < 0) {
+		mail_storage_set_critical(&storage->storage,
+					  "chown(%s) failed: %m", dir);
+	}
+
+	path = t_strconcat(dir, "/dovecot-shared", NULL);
+	fd = open(path, O_WRONLY | O_CREAT, mode & 0666);
 	umask(old_mask);
 
 	if (fd == -1) {
-		mail_storage_set_critical(storage,
+		mail_storage_set_critical(&storage->storage,
 					  "open(%s) failed: %m", path);
 		return -1;
 	}
 
 	if (fchown(fd, (uid_t)-1, gid) < 0) {
-		mail_storage_set_critical(storage,
+		mail_storage_set_critical(&storage->storage,
 					  "fchown(%s) failed: %m", path);
 	}
 	(void)close(fd);
@@ -606,6 +627,15 @@
 	}
 
 	path = maildir_get_path(storage, name);
+
+	/* if dovecot-shared exists in the root dir, create the mailbox using
+	   its permissions and gid, and copy the dovecot-shared inside it. */
+	shared_path = t_strconcat(storage->dir, "/dovecot-shared", NULL);
+	if (stat(shared_path, &st) == 0) {
+		return maildir_create_shared(storage, path,
+					     st.st_mode & 0666, st.st_gid);
+	}
+
 	if (create_maildir(storage, path, FALSE) < 0) {
 		if (errno == EEXIST) {
 			mail_storage_set_error(_storage,
@@ -613,16 +643,6 @@
 		}
 		return -1;
 	}
-
-	/* if dovecot-shared exists in the root dir, copy it to the
-	   created mailbox */
-	shared_path = t_strconcat(storage->dir, "/dovecot-shared", NULL);
-	if (stat(shared_path, &st) == 0) {
-		path = t_strconcat(path, "/dovecot-shared", NULL);
-		(void)maildir_create_shared(_storage, path,
-					    st.st_mode & 0666, st.st_gid);
-	}
-
 	return 0;
 }
 



More information about the dovecot-cvs mailing list