It was supposed to be used for it previously, but wasn't..
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,
/* 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;
}
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);
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 */
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)
}
/* 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,
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;
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
}
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, '/');
}
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;
/* 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;
}
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;
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;
}
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);
/* 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;
}
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. */
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