struct index_storage_module index_storage_module =
MODULE_CONTEXT_INIT(&mail_storage_module_register);
-int index_list_create_missing_index_dir(struct mailbox_list *list,
- const char *name)
-{
- const char *root_dir, *index_dir, *parent_dir, *p, *origin;
- mode_t mode;
- gid_t gid;
- unsigned int n = 0;
-
- root_dir = mailbox_list_get_path(list, name,
- MAILBOX_LIST_PATH_TYPE_MAILBOX);
- index_dir = mailbox_list_get_path(list, name,
- MAILBOX_LIST_PATH_TYPE_INDEX);
- if (*index_dir == '\0' || strcmp(index_dir, root_dir) == 0)
- return 0;
-
- mailbox_list_get_dir_permissions(list, name, &mode, &gid, &origin);
- while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) {
- if (errno == EEXIST)
- break;
-
- p = strrchr(index_dir, '/');
- if (errno != ENOENT || p == NULL || ++n == 2) {
- mailbox_list_set_critical(list,
- "mkdir(%s) failed: %m", index_dir);
- return -1;
- }
- /* create the parent directory first */
- parent_dir = t_strdup_until(index_dir, p);
- if (mailbox_list_mkdir(list, parent_dir,
- MAILBOX_LIST_PATH_TYPE_INDEX) < 0)
- return -1;
- }
- return 0;
-}
-
static struct mail_index *
index_storage_alloc(struct mailbox_list *list, const char *name,
enum mailbox_flags flags, const char *prefix)
}
}
- if (index_list_create_missing_index_dir(box->list, box->name) < 0) {
+ if (mailbox_list_create_missing_index_dir(box->list, box->name) < 0) {
mail_storage_set_internal_error(box->storage);
return -1;
}
bool index_keyword_array_cmp(const ARRAY_TYPE(keyword_indexes) *k1,
const ARRAY_TYPE(keyword_indexes) *k2);
-int index_list_create_missing_index_dir(struct mailbox_list *list,
- const char *name);
-
#endif
bool temporary_error;
ARRAY_DEFINE(module_contexts, union mailbox_list_module_context *);
+
+ unsigned int index_root_dir_created:1;
};
struct mailbox_list_iterate_context {
enum mailbox_list_file_type mailbox_list_get_file_type(const struct dirent *d);
bool mailbox_list_try_get_absolute_path(struct mailbox_list *list,
const char **name);
+int mailbox_list_create_missing_index_dir(struct mailbox_list *list,
+ const char *name);
void mailbox_list_add_change(struct mailbox_list *list,
enum mailbox_log_record_type type,
mail_guid_128_is_empty(mailbox_guid))
return;
+ if (!list->index_root_dir_created) {
+ if (mailbox_list_create_missing_index_dir(list, NULL) < 0)
+ return;
+ }
+
stamp = list->changelog_timestamp != (time_t)-1 ?
list->changelog_timestamp : ioloop_time;
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, *origin;
+ mode_t mode;
+ gid_t gid;
+ unsigned int n = 0;
+
+ list->index_root_dir_created = TRUE;
+ root_dir = mailbox_list_get_path(list, name,
+ MAILBOX_LIST_PATH_TYPE_MAILBOX);
+ index_dir = mailbox_list_get_path(list, name,
+ MAILBOX_LIST_PATH_TYPE_INDEX);
+ if (*index_dir == '\0' || strcmp(index_dir, root_dir) == 0)
+ return 0;
+
+ mailbox_list_get_dir_permissions(list, name, &mode, &gid, &origin);
+ while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) {
+ if (errno == EEXIST)
+ break;
+
+ p = strrchr(index_dir, '/');
+ if (errno != ENOENT || p == NULL || ++n == 2) {
+ mailbox_list_set_critical(list,
+ "mkdir(%s) failed: %m", index_dir);
+ return -1;
+ }
+ /* create the parent directory first */
+ parent_dir = t_strdup_until(index_dir, p);
+ if (mailbox_list_mkdir(list, parent_dir,
+ MAILBOX_LIST_PATH_TYPE_INDEX) < 0)
+ return -1;
+ }
+ return 0;
+}
+
const char *mailbox_list_get_last_error(struct mailbox_list *list,
enum mail_error *error_r)
{