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