From: Timo Sirainen Date: Wed, 1 Feb 2012 18:10:42 +0000 (+0200) Subject: lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail... X-Git-Tag: 2.1.rc6~103 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b8a6aec5fe2daa564799867f31e39e7ea46b9c3;p=thirdparty%2Fdovecot%2Fcore.git 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.. --- diff --git a/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c b/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c index 5100cb1fc8..db4b31bae0 100644 --- a/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c +++ b/src/lib-storage/index/dbox-common/dbox-sync-rebuild.c @@ -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; } diff --git a/src/lib-storage/index/dbox-multi/mdbox-file.c b/src/lib-storage/index/dbox-multi/mdbox-file.c index 5cfa76af9a..d2afd920be 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-file.c +++ b/src/lib-storage/index/dbox-multi/mdbox-file.c @@ -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 */ diff --git a/src/lib-storage/index/maildir/maildir-util.c b/src/lib-storage/index/maildir/maildir-util.c index 6c258e0c96..3eb02fa147 100644 --- a/src/lib-storage/index/maildir/maildir-util.c +++ b/src/lib-storage/index/maildir/maildir-util.c @@ -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, diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 3400bfcc80..faee3d1b62 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -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 diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 5339f36508..d85397c383 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -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; } diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index 15c6f4d48e..0f9e2eabf1 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -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. */ diff --git a/src/plugins/fts-lucene/fts-backend-lucene.c b/src/plugins/fts-lucene/fts-backend-lucene.c index d29105040f..75b70fd346 100644 --- a/src/plugins/fts-lucene/fts-backend-lucene.c +++ b/src/plugins/fts-lucene/fts-backend-lucene.c @@ -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