dovecot-2.1: lib-storage: mailbox_list_mkdir_root() API changed....

dovecot at dovecot.org dovecot at dovecot.org
Wed Feb 1 20:10:49 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/aed3379df476
changeset: 14037:aed3379df476
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Feb 01 20:10:42 2012 +0200
description:
lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
It was supposed to be used for it previously, but wasn't..

diffstat:

 src/lib-storage/index/dbox-common/dbox-sync-rebuild.c |   8 ++-
 src/lib-storage/index/dbox-multi/mdbox-file.c         |   9 ++-
 src/lib-storage/index/maildir/maildir-util.c          |   6 +-
 src/lib-storage/mail-storage.c                        |  22 ++-------
 src/lib-storage/mailbox-list.c                        |  41 ++++++++++++------
 src/lib-storage/mailbox-list.h                        |   3 +-
 src/plugins/fts-lucene/fts-backend-lucene.c           |  13 ++++-
 7 files changed, 61 insertions(+), 41 deletions(-)

diffs (262 lines):

diff -r acc60bd684fb -r aed3379df476 src/lib-storage/index/dbox-common/dbox-sync-rebuild.c
--- a/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c	Wed Feb 01 18:55:54 2012 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c	Wed Feb 01 20:10:42 2012 +0200
@@ -194,7 +194,7 @@
 
 int dbox_sync_rebuild_verify_alt_storage(struct mailbox_list *list)
 {
-	const char *alt_path;
+	const char *alt_path, *error;
 	struct stat st;
 
 	alt_path = mailbox_list_get_path(list, NULL,
@@ -213,7 +213,11 @@
 	/* try to create the alt directory. if it fails, it means alt
 	   storage isn't mounted. */
 	if (mailbox_list_mkdir_root(list, alt_path,
-				    MAILBOX_LIST_PATH_TYPE_ALT_DIR) < 0)
+				    MAILBOX_LIST_PATH_TYPE_ALT_DIR,
+				    &error) < 0) {
+		i_error("Couldn't create dbox alt root dir %s: %s",
+			alt_path, error);
 		return -1;
+	}
 	return 0;
 }
diff -r acc60bd684fb -r aed3379df476 src/lib-storage/index/dbox-multi/mdbox-file.c
--- a/src/lib-storage/index/dbox-multi/mdbox-file.c	Wed Feb 01 18:55:54 2012 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-file.c	Wed Feb 01 20:10:42 2012 +0200
@@ -292,7 +292,7 @@
 	struct mdbox_file *mfile = (struct mdbox_file *)file;
 	struct mdbox_map *map = mfile->storage->map;
 	mode_t old_mask;
-	const char *p, *dir;
+	const char *p, *dir, *error;
 	int fd;
 
 	old_mask = umask(0666 & ~map->create_mode);
@@ -304,9 +304,10 @@
 		if (mailbox_list_mkdir_root(map->root_list, dir,
 					    path != file->alt_path ?
 					    MAILBOX_LIST_PATH_TYPE_DIR :
-					    MAILBOX_LIST_PATH_TYPE_ALT_DIR) < 0) {
-			mail_storage_copy_list_error(&file->storage->storage,
-						     map->root_list);
+					    MAILBOX_LIST_PATH_TYPE_ALT_DIR,
+					    &error) < 0) {
+			mail_storage_set_critical(&file->storage->storage,
+				"Couldn't create %s: %s", dir, error);
 			return -1;
 		}
 		/* try again */
diff -r acc60bd684fb -r aed3379df476 src/lib-storage/index/maildir/maildir-util.c
--- a/src/lib-storage/index/maildir/maildir-util.c	Wed Feb 01 18:55:54 2012 +0200
+++ b/src/lib-storage/index/maildir/maildir-util.c	Wed Feb 01 20:10:42 2012 +0200
@@ -156,7 +156,7 @@
 			       enum mailbox_list_path_type type, bool retry)
 {
 	const struct mailbox_permissions *perm = mailbox_get_permissions(box);
-	const char *p, *parent;
+	const char *p, *parent, *error;
 
 	if (mkdir_chgrp(path, perm->dir_create_mode, perm->file_create_gid,
 			perm->file_create_gid_origin) == 0)
@@ -175,11 +175,13 @@
 		}
 		/* create index/control root directory */
 		parent = t_strdup_until(path, p);
-		if (mailbox_list_mkdir_root(box->list, parent, type) == 0) {
+		if (mailbox_list_mkdir_root(box->list, parent, type, &error) == 0) {
 			/* should work now, try again */
 			return maildir_create_path(box, path, type, FALSE);
 		}
 		/* fall through */
+		mail_storage_set_critical(box->storage,
+			"Couldn't create %s: %s", parent, error);
 		path = parent;
 	default:
 		mail_storage_set_critical(box->storage,
diff -r acc60bd684fb -r aed3379df476 src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c	Wed Feb 01 18:55:54 2012 +0200
+++ b/src/lib-storage/mail-storage.c	Wed Feb 01 20:10:42 2012 +0200
@@ -230,9 +230,7 @@
 mail_storage_create_root(struct mailbox_list *list,
 			 enum mail_storage_flags flags, const char **error_r)
 {
-	const char *root_dir, *origin, *error;
-	mode_t file_mode, dir_mode;
-	gid_t gid;
+	const char *root_dir, *error;
 	bool autocreate;
 	int ret;
 
@@ -258,20 +256,12 @@
 
 	autocreate = (flags & MAIL_STORAGE_FLAG_NO_AUTOCREATE) == 0;
 	ret = mail_storage_verify_root(root_dir, autocreate, error_r);
-	if (ret != 0)
-		return ret;
-
-	/* we need to create the root directory. */
-	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
-					  &gid, &origin);
-	if (mkdir_parents_chgrp(root_dir, dir_mode, gid, origin) < 0 &&
-	    errno != EEXIST) {
-		*error_r = mail_error_create_eacces_msg("mkdir", root_dir);
-		return -1;
-	} else {
-		/* created */
-		return 0;
+	if (ret == 0) {
+		ret = mailbox_list_mkdir_root(list, root_dir,
+					      MAILBOX_LIST_PATH_TYPE_MAILBOX,
+					      error_r);
 	}
+	return ret < 0 ? -1 : 0;
 }
 
 static bool
diff -r acc60bd684fb -r aed3379df476 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Wed Feb 01 18:55:54 2012 +0200
+++ b/src/lib-storage/mailbox-list.c	Wed Feb 01 20:10:42 2012 +0200
@@ -723,15 +723,14 @@
 }
 
 static int
-mailbox_list_stat_parent(struct mailbox_list *list, const char *path,
-			 const char **root_dir_r, struct stat *st_r)
+mailbox_list_stat_parent(const char *path, const char **root_dir_r,
+			 struct stat *st_r, const char **error_r)
 {
 	const char *p;
 
 	while (stat(path, st_r) < 0) {
 		if (errno != ENOENT || strcmp(path, "/") == 0) {
-			mailbox_list_set_critical(list, "stat(%s) failed: %m",
-						  path);
+			*error_r = t_strdup_printf("stat(%s) failed: %m", path);
 			return -1;
 		}
 		p = strrchr(path, '/');
@@ -787,7 +786,8 @@
 }
 
 int mailbox_list_mkdir_root(struct mailbox_list *list, const char *path,
-			    enum mailbox_list_path_type type)
+			    enum mailbox_list_path_type type,
+			    const char **error_r)
 {
 	const char *expanded, *unexpanded, *root_dir, *p, *origin;
 	struct stat st;
@@ -818,14 +818,14 @@
 		/* up to this directory get the permissions from the first
 		   parent directory that exists, if it has setgid bit
 		   enabled. */
-		if (mailbox_list_stat_parent(list, expanded,
-					     &root_dir, &st) < 0)
+		if (mailbox_list_stat_parent(expanded, &root_dir, &st,
+					     error_r) < 0)
 			return -1;
 		if ((st.st_mode & S_ISGID) != 0 && root_dir != expanded) {
 			if (mkdir_parents_chgrp(expanded, st.st_mode,
 						(gid_t)-1, root_dir) < 0 &&
 			    errno != EEXIST) {
-				mailbox_list_set_critical(list,
+				*error_r = t_strdup_printf(
 					"mkdir(%s) failed: %m", expanded);
 				return -1;
 			}
@@ -840,7 +840,10 @@
 	   with default directory permissions */
 	if (mkdir_parents_chgrp(path, dir_mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
-		mailbox_list_set_critical(list, "mkdir(%s) failed: %m", path);
+		if (errno == EACCES)
+			*error_r = mail_error_create_eacces_msg("mkdir", path);
+		else
+			*error_r = t_strdup_printf("mkdir(%s) failed: %m", path);
 		return -1;
 	}
 	return 0;
@@ -1330,7 +1333,7 @@
 int mailbox_list_create_missing_index_dir(struct mailbox_list *list,
 					  const char *name)
 {
-	const char *root_dir, *index_dir, *parent_dir, *p;
+	const char *root_dir, *index_dir, *parent_dir, *p, *error;
 	struct mailbox_permissions perm;
 	unsigned int n = 0;
 
@@ -1348,8 +1351,15 @@
 	}
 
 	if (name == NULL) {
-		return mailbox_list_mkdir_root(list, index_dir,
-					       MAILBOX_LIST_PATH_TYPE_INDEX);
+		if (mailbox_list_mkdir_root(list, index_dir,
+					    MAILBOX_LIST_PATH_TYPE_INDEX,
+					    &error) < 0) {
+			mailbox_list_set_critical(list,
+				"Couldn't create index root dir %s: %s",
+				index_dir, error);
+			return -1;
+		}
+		return 0;
 	}
 
 	mailbox_list_get_permissions(list, name, &perm);
@@ -1368,8 +1378,13 @@
 		/* create the parent directory first */
 		parent_dir = t_strdup_until(index_dir, p);
 		if (mailbox_list_mkdir_root(list, parent_dir,
-					    MAILBOX_LIST_PATH_TYPE_INDEX) < 0)
+					    MAILBOX_LIST_PATH_TYPE_INDEX,
+					    &error) < 0) {
+			mailbox_list_set_critical(list,
+				"Couldn't create index dir %s: %s",
+				parent_dir, error);
 			return -1;
+		}
 	}
 	return 0;
 }
diff -r acc60bd684fb -r aed3379df476 src/lib-storage/mailbox-list.h
--- a/src/lib-storage/mailbox-list.h	Wed Feb 01 18:55:54 2012 +0200
+++ b/src/lib-storage/mailbox-list.h	Wed Feb 01 20:10:42 2012 +0200
@@ -218,7 +218,8 @@
 			      const char *mailbox, const char *path);
 /* mkdir() a root directory of given type with proper permissions. */
 int mailbox_list_mkdir_root(struct mailbox_list *list, const char *path,
-			    enum mailbox_list_path_type type);
+			    enum mailbox_list_path_type type,
+			    const char **error_r);
 
 /* Returns TRUE if the name doesn't contain any invalid characters.
    The create name check can be more strict. */
diff -r acc60bd684fb -r aed3379df476 src/plugins/fts-lucene/fts-backend-lucene.c
--- a/src/plugins/fts-lucene/fts-backend-lucene.c	Wed Feb 01 18:55:54 2012 +0200
+++ b/src/plugins/fts-lucene/fts-backend-lucene.c	Wed Feb 01 20:10:42 2012 +0200
@@ -53,13 +53,20 @@
 
 static int fts_backend_lucene_mkdir(struct lucene_fts_backend *backend)
 {
+	const char *error;
+
 	if (backend->dir_created)
 		return 0;
 
 	backend->dir_created = TRUE;
-	return mailbox_list_mkdir_root(backend->backend.ns->list,
-				       backend->dir_path,
-				       MAILBOX_LIST_PATH_TYPE_INDEX);
+	if (mailbox_list_mkdir_root(backend->backend.ns->list,
+				    backend->dir_path,
+				    MAILBOX_LIST_PATH_TYPE_INDEX, &error) < 0) {
+		i_error("lucene: Couldn't create root dir %s: %s",
+			backend->dir_path, error);
+		return -1;
+	}
+	return 0;
 }
 
 static int


More information about the dovecot-cvs mailing list