changeset 9204:f3c6cabae3af HEAD

Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
author Timo Sirainen <tss@iki.fi>
date Tue, 07 Jul 2009 22:26:24 -0400
parents c8dc38a3b902
children 4c8175452173
files src/lib-storage/list/subscription-file.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h
diffstat 3 files changed, 31 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/subscription-file.c	Tue Jul 07 21:51:37 2009 -0400
+++ b/src/lib-storage/list/subscription-file.c	Tue Jul 07 22:26:24 2009 -0400
@@ -91,11 +91,11 @@
 {
 	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;
 
@@ -112,19 +112,12 @@
 	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);
 	}
--- a/src/lib-storage/mailbox-list.c	Tue Jul 07 21:51:37 2009 -0400
+++ b/src/lib-storage/mailbox-list.c	Tue Jul 07 22:26:24 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"
@@ -841,6 +842,28 @@
 	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)
 {
--- a/src/lib-storage/mailbox-list.h	Tue Jul 07 21:51:37 2009 -0400
+++ b/src/lib-storage/mailbox-list.h	Tue Jul 07 22:26:24 2009 -0400
@@ -158,6 +158,11 @@
 				      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. */