dovecot-2.0: Added mailbox_list_create_parent_dir() and used it ...

dovecot at dovecot.org dovecot at dovecot.org
Wed Jul 8 05:28:08 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/9ced768849e8
changeset: 9581:9ced768849e8
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jul 07 22:27:37 2009 -0400
description:
Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.

diffstat:

3 files changed, 31 insertions(+), 10 deletions(-)
src/lib-storage/list/subscription-file.c |   13 +++----------
src/lib-storage/mailbox-list.c           |   23 +++++++++++++++++++++++
src/lib-storage/mailbox-list.h           |    5 +++++

diffs (93 lines):

diff -r 7a1da6de3cd8 -r 9ced768849e8 src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c	Tue Jul 07 22:27:27 2009 -0400
+++ b/src/lib-storage/list/subscription-file.c	Tue Jul 07 22:27:37 2009 -0400
@@ -89,11 +89,11 @@ int subsfile_set_subscribed(struct mailb
 {
 	struct dotlock_settings dotlock_set;
 	struct dotlock *dotlock;
-	const char *line, *p, *dir, *origin;
+	const char *line, *origin;
 	struct istream *input;
 	struct ostream *output;
 	int fd_in, fd_out;
-	mode_t mode, dir_mode;
+	mode_t mode;
 	gid_t gid;
 	bool found, failed = FALSE;
 
@@ -108,19 +108,12 @@ int subsfile_set_subscribed(struct mailb
 	dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT;
 
 	mailbox_list_get_permissions(list, NULL, &mode, &gid, &origin);
-	mailbox_list_get_dir_permissions(list, NULL, &dir_mode, &gid, &origin);
 	fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
 					 mode, gid, origin, &dotlock);
 	if (fd_out == -1 && errno == ENOENT) {
 		/* directory hasn't been created yet. */
-		p = strrchr(path, '/');
-		dir = p == NULL ? NULL : t_strdup_until(path, p);
-		if (dir != NULL &&
-		    mkdir_parents_chgrp(dir, dir_mode, gid, origin) < 0 &&
-		    errno != EEXIST) {
-			subswrite_set_syscall_error(list, "mkdir()", dir);
+		if (mailbox_list_create_parent_dir(list, NULL, path) < 0)
 			return -1;
-		}
 		fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
 						 mode, gid, origin, &dotlock);
 	}
diff -r 7a1da6de3cd8 -r 9ced768849e8 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Tue Jul 07 22:27:27 2009 -0400
+++ b/src/lib-storage/mailbox-list.c	Tue Jul 07 22:27:37 2009 -0400
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "array.h"
 #include "ioloop.h"
+#include "mkdir-parents.h"
 #include "str.h"
 #include "home-expand.h"
 #include "unlink-directory.h"
@@ -907,6 +908,28 @@ bool mailbox_list_try_get_absolute_path(
 	return FALSE;
 }
 
+int mailbox_list_create_parent_dir(struct mailbox_list *list,
+				   const char *mailbox, const char *path)
+{
+	const char *p, *dir, *origin;
+	gid_t gid;
+	mode_t mode;
+
+	p = strrchr(path, '/');
+	if (p == NULL)
+		return 0;
+
+	dir = t_strdup_until(path, p);
+	mailbox_list_get_dir_permissions(list, mailbox, &mode, &gid, &origin);
+	if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 &&
+	    errno != EEXIST) {
+		mailbox_list_set_critical(list, "mkdir_parents(%s) failed: %m",
+					  dir);
+		return -1;
+	}
+	return 0;
+}
+
 const char *mailbox_list_get_last_error(struct mailbox_list *list,
 					enum mail_error *error_r)
 {
diff -r 7a1da6de3cd8 -r 9ced768849e8 src/lib-storage/mailbox-list.h
--- a/src/lib-storage/mailbox-list.h	Tue Jul 07 22:27:27 2009 -0400
+++ b/src/lib-storage/mailbox-list.h	Tue Jul 07 22:27:37 2009 -0400
@@ -155,6 +155,11 @@ void mailbox_list_get_dir_permissions(st
 				      const char *name,
 				      mode_t *mode_r, gid_t *gid_r,
 				      const char **gid_origin_r);
+/* Create path's parent directory with proper permissions. Since most
+   directories are created lazily, this function can be used to easily create
+   them whenever file creation fails with ENOENT. */
+int mailbox_list_create_parent_dir(struct mailbox_list *list,
+				   const char *mailbox, const char *path);
 
 /* Returns TRUE if the name doesn't contain any invalid characters.
    The create name check can be more strict. */


More information about the dovecot-cvs mailing list