Mercurial > dovecot > core-2.2
changeset 12296:953e7c6e546b
lib-storage: Log a debug message if shared user's storage root doesn't exist with mail_debug=yes
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 18 Oct 2010 15:07:02 +0100 |
parents | 00637db0e54c |
children | b0ef4e803b1a |
files | src/lib-storage/mail-storage.c |
diffstat | 1 files changed, 45 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail-storage.c Mon Oct 18 14:52:02 2010 +0100 +++ b/src/lib-storage/mail-storage.c Mon Oct 18 15:07:02 2010 +0100 @@ -181,17 +181,41 @@ } return NULL; } + +static int +mail_storage_verify_root(const char *root_dir, bool autocreate, + const char **error_r) +{ + struct stat st; + + if (stat(root_dir, &st) == 0) { + /* exists */ + return 1; + } else if (errno == EACCES) { + *error_r = mail_error_eacces_msg("stat", root_dir); + return -1; + } else if (errno != ENOENT && errno != ENOTDIR) { + *error_r = t_strdup_printf("stat(%s) failed: %m", root_dir); + return -1; + } else if (!autocreate) { + *error_r = t_strdup_printf( + "Root mail directory doesn't exist: %s", root_dir); + return -1; + } else { + /* doesn't exist */ + return 0; + } +} + static int mail_storage_create_root(struct mailbox_list *list, enum mail_storage_flags flags, const char **error_r) { - const char *root_dir, *origin; - struct stat st; + const char *root_dir, *origin, *error; mode_t mode; gid_t gid; - - if ((flags & MAIL_STORAGE_FLAG_NO_AUTOVERIFY) != 0) - return 0; + bool autocreate; + int ret; root_dir = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_MAILBOX); @@ -199,24 +223,25 @@ /* storage doesn't use directories (e.g. shared root) */ return 0; } - if (stat(root_dir, &st) == 0) { - /* ok */ + + if ((flags & MAIL_STORAGE_FLAG_NO_AUTOVERIFY) != 0) { + if (!list->mail_set->mail_debug) + return 0; + + /* we don't need to verify, but since debugging is + enabled, check and log if the root doesn't exist */ + if (mail_storage_verify_root(root_dir, FALSE, &error) < 0) { + i_debug("Namespace %s: Creating storage despite: %s", + list->ns->prefix, error); + } return 0; - } else if (errno == EACCES) { - *error_r = mail_error_eacces_msg("stat", root_dir); - return -1; - } else if (errno != ENOENT && errno != ENOTDIR) { - *error_r = t_strdup_printf("stat(%s) failed: %m", root_dir); - return -1; - } else if (list->ns->type == NAMESPACE_SHARED) { - /* can't create a new user, but we don't want to fail - the storage creation. */ - } else if ((flags & MAIL_STORAGE_FLAG_NO_AUTOCREATE) != 0) { - *error_r = t_strdup_printf( - "Root mail directory doesn't exist: %s", root_dir); - return -1; } + 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_dir_permissions(list, NULL, &mode, &gid, &origin); if (mkdir_parents_chgrp(root_dir, mode, gid, origin) < 0 &&