]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail...
authorTimo Sirainen <tss@iki.fi>
Wed, 1 Feb 2012 18:10:42 +0000 (20:10 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 1 Feb 2012 18:10:42 +0000 (20:10 +0200)
It was supposed to be used for it previously, but wasn't..

src/lib-storage/index/dbox-common/dbox-sync-rebuild.c
src/lib-storage/index/dbox-multi/mdbox-file.c
src/lib-storage/index/maildir/maildir-util.c
src/lib-storage/mail-storage.c
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h
src/plugins/fts-lucene/fts-backend-lucene.c

index 5100cb1fc8582783f74d8f3bed60cc5cc75a8530..db4b31bae09274a286995d7b030bc713f456b5c1 100644 (file)
@@ -194,7 +194,7 @@ void dbox_sync_index_rebuild_deinit(struct dbox_sync_rebuild_context **_ctx)
 
 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 @@ int dbox_sync_rebuild_verify_alt_storage(struct mailbox_list *list)
        /* 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;
 }
index 5cfa76af9ab1019193b67c140a4c7c8398bf9aae..d2afd920be832c7e59d1fa959bcc94ab924fa41f 100644 (file)
@@ -292,7 +292,7 @@ int mdbox_file_create_fd(struct dbox_file *file, const char *path, bool parents)
        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 @@ int mdbox_file_create_fd(struct dbox_file *file, const char *path, bool parents)
                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 */
index 6c258e0c960f6eb7cdd31d2b8729c5b7b7eedef0..3eb02fa1475618619f5c5c9343bdff546c5e5050 100644 (file)
@@ -156,7 +156,7 @@ static int maildir_create_path(struct mailbox *box, const char *path,
                               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 @@ static int maildir_create_path(struct mailbox *box, const char *path,
                }
                /* 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,
index 3400bfcc801ccec2b3546c88eb434d230e0380c6..faee3d1b627a751bbc2dd8b8effd12096e3eb97f 100644 (file)
@@ -230,9 +230,7 @@ static int
 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 @@ mail_storage_create_root(struct mailbox_list *list,
 
        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
index 5339f365084cbab0b59bc2706d53f7c2d7a074ea..d85397c383c823c3f8570ee88081f2748baac0bd 100644 (file)
@@ -723,15 +723,14 @@ void mailbox_list_get_root_permissions(struct mailbox_list *list,
 }
 
 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 @@ get_expanded_path(const char *unexpanded_start, const char *unexpanded_stop,
 }
 
 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 @@ int mailbox_list_mkdir_root(struct mailbox_list *list, const char *path,
                /* 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 @@ int mailbox_list_mkdir_root(struct mailbox_list *list, const char *path,
           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_mkdir_parent(struct mailbox_list *list,
 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 @@ int mailbox_list_create_missing_index_dir(struct mailbox_list *list,
        }
 
        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 @@ int mailbox_list_create_missing_index_dir(struct mailbox_list *list,
                /* 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;
 }
index 15c6f4d48ecabb8ddef14c353d3754e3e39ef6de..0f9e2eabf1b2d5155cb683ca4bbc5308e1cb956f 100644 (file)
@@ -218,7 +218,8 @@ int mailbox_list_mkdir_parent(struct mailbox_list *list,
                              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. */
index d29105040fe6cc3f7c10a40ba2654c56ad48b7ff..75b70fd3461e390f807ca87474d94ef99cd52699 100644 (file)
@@ -53,13 +53,20 @@ struct lucene_fts_backend_update_context {
 
 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