set->subscription_fname = DBOX_SUBSCRIPTION_FILE_NAME;
if (*set->maildir_name == '\0')
set->maildir_name = DBOX_MAILDIR_NAME;
- if (*set->mailbox_dir_name == '\0')
- set->mailbox_dir_name = DBOX_MAILBOX_DIR_NAME;
}
static bool
ret = stat(box_path, &st);
} else if (ret == 0 &&
!box->list->mail_set->mailbox_list_iter_from_index_dir &&
- *box->list->set.mailbox_dir_name == '\0') {
+ *box->list->mail_set->parsed_mailbox_root_directory_prefix == '\0') {
/* There are index files for this mailbox and no separate
mailboxes directory is configured. */
return 0;
#define DBOX_TEMP_FILE_PREFIX ".temp."
#define DBOX_ALT_SYMLINK_NAME "dbox-alt-root"
+/* <settings checks> */
#define DBOX_MAILBOX_DIR_NAME "mailboxes"
#define DBOX_MAILDIR_NAME "dbox-Mails"
+/* </settings checks> */
/* Delete temp files having ctime older than this. */
#define DBOX_TMP_DELETE_SECS (36*60*60)
#include "lib.h"
#include "settings-parser.h"
#include "mail-storage-settings.h"
+#include "dbox-storage.h"
#include "mdbox-settings.h"
#undef DEF
.mdbox_rotate_interval = 0
};
+static const struct setting_keyvalue mdbox_default_filter_settings_keyvalue[] = {
+ { "mdbox/mailbox_root_directory_name", DBOX_MAILBOX_DIR_NAME },
+ { NULL, NULL }
+};
+
const struct setting_parser_info mdbox_setting_parser_info = {
.name = "mdbox",
.defines = mdbox_setting_defines,
.defaults = &mdbox_default_settings,
+ .default_filter_settings = mdbox_default_filter_settings_keyvalue,
.struct_size = sizeof(struct mdbox_settings),
.pool_offset1 = 1 + offsetof(struct mdbox_settings, pool),
storage->preallocate_space = storage->set->mdbox_preallocate_space;
- if (*ns->list->set.mailbox_dir_name == '\0') {
- *error_r = "mdbox: MAILBOXDIR must not be empty";
+ if (*ns->list->mail_set->mailbox_root_directory_name == '\0') {
+ *error_r = "mdbox: mailbox_root_directory_name must not be empty";
return -1;
}
static const struct sdbox_settings sdbox_default_settings = {
};
+static const struct setting_keyvalue sdbox_default_filter_settings_keyvalue[] = {
+ { "sdbox/mailbox_root_directory_name", DBOX_MAILBOX_DIR_NAME },
+ { NULL, NULL }
+};
+
const struct setting_parser_info sdbox_setting_parser_info = {
.name = "sdbox",
.defines = sdbox_setting_defines,
.defaults = &sdbox_default_settings,
+ .default_filter_settings = sdbox_default_filter_settings_keyvalue,
.struct_size = sizeof(struct sdbox_settings),
.pool_offset1 = 1 + offsetof(struct sdbox_settings, pool),
/* directory already exists */
if (create_parent_dir)
return 1;
- if (!directory && *box->list->set.mailbox_dir_name == '\0') {
+ if (!directory && *box->list->mail_set->mailbox_root_directory_name == '\0') {
/* For example: layout=fs, path=~/Maildir/foo
might itself exist, but does it have the
cur|new|tmp subdirs? */
}
if (*path != '/') {
/* non-absolute path. add the mailbox root dir as prefix. */
+ const struct mail_storage_settings *set =
+ ctx->ctx.list->mail_set;
enum mailbox_list_path_type type =
ctx->ctx.iter_from_index_dir ?
MAILBOX_LIST_PATH_TYPE_INDEX :
if (!mailbox_list_get_root_path(ctx->ctx.list, type, &root))
return FALSE;
if (ctx->ctx.iter_from_index_dir &&
- ctx->ctx.list->set.mailbox_dir_name[0] != '\0') {
+ set->parsed_mailbox_root_directory_prefix[0] != '\0') {
/* append "mailboxes/" to the index root */
root = t_strconcat(root, "/",
- ctx->ctx.list->set.mailbox_dir_name, NULL);
+ set->parsed_mailbox_root_directory_prefix, NULL);
}
path = *path == '\0' ? root :
t_strconcat(root, "/", path, NULL);
}
static const char *
-fs_list_get_path_to(const struct mailbox_list_settings *set,
+fs_list_get_path_to(struct mailbox_list *list,
const char *root_dir, const char *name)
{
+ const struct mailbox_list_settings *set = &list->set;
+
if (*set->maildir_name != '\0' && set->index_control_use_maildir_name) {
return t_strdup_printf("%s/%s%s/%s", root_dir,
- set->mailbox_dir_name, name,
- set->maildir_name);
+ list->mail_set->parsed_mailbox_root_directory_prefix,
+ name, set->maildir_name);
} else {
return t_strdup_printf("%s/%s%s", root_dir,
- set->mailbox_dir_name, name);
+ list->mail_set->parsed_mailbox_root_directory_prefix,
+ name);
}
}
enum mailbox_list_path_type type, const char **path_r)
{
const struct mailbox_list_settings *set = &_list->set;
+ const struct mail_storage_settings *mail_set = _list->mail_set;
const char *root_dir, *error;
if (name == NULL) {
case MAILBOX_LIST_PATH_TYPE_DIR:
if (*set->maildir_name != '\0') {
*path_r = t_strdup_printf("%s/%s%s", set->root_dir,
- set->mailbox_dir_name, name);
+ mail_set->parsed_mailbox_root_directory_prefix,
+ name);
return 1;
}
break;
/* maildir_name is for the mailbox, caller is asking
for the directory name */
*path_r = t_strdup_printf("%s/%s%s", set->alt_dir,
- set->mailbox_dir_name, name);
+ mail_set->parsed_mailbox_root_directory_prefix,
+ name);
return 1;
}
root_dir = set->alt_dir;
break;
case MAILBOX_LIST_PATH_TYPE_CONTROL:
if (set->control_dir != NULL) {
- *path_r = fs_list_get_path_to(set, set->control_dir, name);
+ *path_r = fs_list_get_path_to(_list, set->control_dir, name);
return 1;
}
break;
case MAILBOX_LIST_PATH_TYPE_INDEX_CACHE:
if (set->index_cache_dir != NULL) {
- *path_r = fs_list_get_path_to(set, set->index_cache_dir, name);
+ *path_r = fs_list_get_path_to(_list, set->index_cache_dir, name);
return 1;
}
/* fall through */
if (set->index_dir != NULL) {
if (*set->index_dir == '\0')
return 0;
- *path_r = fs_list_get_path_to(set, set->index_dir, name);
+ *path_r = fs_list_get_path_to(_list, set->index_dir, name);
return 1;
}
break;
case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE:
if (set->index_pvt_dir == NULL)
return 0;
- *path_r = fs_list_get_path_to(set, set->index_pvt_dir, name);
+ *path_r = fs_list_get_path_to(_list, set->index_pvt_dir, name);
return 1;
case MAILBOX_LIST_PATH_TYPE_LIST_INDEX:
case MAILBOX_LIST_PATH_TYPE_COUNT:
return 0;
if (*set->maildir_name == '\0') {
*path_r = t_strdup_printf("%s/%s%s", root_dir,
- set->mailbox_dir_name, name);
+ mail_set->parsed_mailbox_root_directory_prefix, name);
} else {
*path_r = t_strdup_printf("%s/%s%s/%s", root_dir,
- set->mailbox_dir_name, name,
- set->maildir_name);
+ mail_set->parsed_mailbox_root_directory_prefix,
+ name, set->maildir_name);
}
return 1;
}
int ret;
if (*list->set.maildir_name != '\0' &&
- *list->set.mailbox_dir_name != '\0') {
+ *list->mail_set->parsed_mailbox_root_directory_prefix != '\0') {
trash_dir = mailbox_list_fs_get_trash_dir(list);
ret = mailbox_list_delete_maildir_via_trash(list, name,
trash_dir);
const guid_128_t mailbox_guid)
{
return t_strdup_printf("%s/%s%s", root_dir,
- _list->set.mailbox_dir_name,
- guid_128_to_string(mailbox_guid));
+ _list->mail_set->parsed_mailbox_root_directory_prefix,
+ guid_128_to_string(mailbox_guid));
}
static int
DEF(BOOL_HIDDEN, mailbox_list_iter_from_index_dir),
DEF(BOOL_HIDDEN, mailbox_list_drop_noselect),
DEF(BOOL_HIDDEN, mailbox_list_validate_fs_names),
+ DEF(STR_HIDDEN, mailbox_root_directory_name),
DEF(STR, mail_volatile_path),
DEF(BOOL_HIDDEN, mail_full_filesystem_access),
DEF(BOOL, maildir_stat_dirs),
.mailbox_list_iter_from_index_dir = FALSE,
.mailbox_list_drop_noselect = TRUE,
.mailbox_list_validate_fs_names = TRUE,
+ .mailbox_root_directory_name = "",
.mail_volatile_path = "",
.mail_full_filesystem_access = FALSE,
.maildir_stat_dirs = FALSE,
}
#endif
}
+ if (set->mailbox_root_directory_name[0] == '\0')
+ set->parsed_mailbox_root_directory_prefix = "";
+ else if (strchr(set->mailbox_root_directory_name, '/') != NULL) {
+ *error_r = "mailbox_root_directory_name must not contain '/'";
+ return FALSE;
+ } else {
+ set->parsed_mailbox_root_directory_prefix = p_strconcat(pool,
+ set->mailbox_root_directory_name, "/", NULL);
+ }
if (!mail_storage_settings_check_namespaces(event, set, error_r))
return FALSE;
OFFSET(mail_location),
OFFSET(mailbox_list_index_prefix),
OFFSET(mailbox_list_iter_from_index_dir),
+ OFFSET(mailbox_root_directory_name),
OFFSET(mail_volatile_path),
};
bool mailbox_list_iter_from_index_dir;
bool mailbox_list_drop_noselect;
bool mailbox_list_validate_fs_names;
+ const char *mailbox_root_directory_name;
const char *mail_volatile_path;
bool mail_full_filesystem_access;
bool maildir_stat_dirs;
/* Directory part of mailbox_list_index_prefix. NULL defaults to index
directory. The path may be relative to the index directory. */
const char *parsed_list_index_dir;
+ /* If set, store mailboxes under root_dir/mailbox_dir_name/.
+ This setting contains either "" or "dir/" with trailing "/". */
+ const char *parsed_mailbox_root_directory_prefix;
const char *unexpanded_mailbox_list_path[MAILBOX_LIST_PATH_TYPE_COUNT];
bool unexpanded_mailbox_list_override[MAILBOX_LIST_PATH_TYPE_COUNT];
p_strdup(list->pool, set->subscription_fname);
list->set.maildir_name =
p_strdup(list->pool, set->maildir_name);
- list->set.mailbox_dir_name =
- p_strdup(list->pool, set->mailbox_dir_name);
list->set.alt_dir = p_strdup(list->pool, set->alt_dir);
list->set.alt_dir_nocheck = set->alt_dir_nocheck;
list->set.index_control_use_maildir_name =
set->index_control_use_maildir_name;
- if (*set->mailbox_dir_name == '\0')
- list->set.mailbox_dir_name = "";
- else if (set->mailbox_dir_name[strlen(set->mailbox_dir_name)-1] == '/') {
- list->set.mailbox_dir_name =
- p_strdup(list->pool, set->mailbox_dir_name);
- } else {
- list->set.mailbox_dir_name =
- p_strconcat(list->pool, set->mailbox_dir_name, "/", NULL);
- }
if (set->storage_name_escape_char != '\0')
list->set.storage_name_escape_char = set->storage_name_escape_char;
list->set.vname_escape_char = set->vname_escape_char;
void mailbox_list_settings_init_defaults(struct mailbox_list_settings *set_r)
{
i_zero(set_r);
- set_r->mailbox_dir_name = "";
set_r->maildir_name = "";
}
dest = &set_r->subscription_fname;
else if (strcmp(key, "DIRNAME") == 0)
dest = &set_r->maildir_name;
- else if (strcmp(key, "MAILBOXDIR") == 0)
- dest = &set_r->mailbox_dir_name;
else if (strcmp(key, "FULLDIRNAME") == 0) {
set_r->index_control_use_maildir_name = TRUE;
dest = &set_r->maildir_name;
static bool
mailbox_list_set_get_root_path(const struct mailbox_list_settings *set,
+ const char *parsed_mailbox_root_directory_prefix,
enum mailbox_list_path_type type,
const char **path_r);
default:
break;
}
- if (!mailbox_list_set_get_root_path(&set, type, &path))
+ if (!mailbox_list_set_get_root_path(&set,
+ list->mail_set->parsed_mailbox_root_directory_prefix,
+ type, &path))
return "";
return path;
}
static bool
mailbox_list_set_get_root_path(const struct mailbox_list_settings *set,
+ const char *parsed_mailbox_root_directory_prefix,
enum mailbox_list_path_type type,
const char **path_r)
{
path = set->alt_dir;
break;
case MAILBOX_LIST_PATH_TYPE_MAILBOX:
- if (*set->mailbox_dir_name == '\0')
+ if (*parsed_mailbox_root_directory_prefix == '\0')
path = set->root_dir;
else {
path = t_strconcat(set->root_dir, "/",
- set->mailbox_dir_name, NULL);
+ parsed_mailbox_root_directory_prefix, NULL);
path = t_strndup(path, strlen(path)-1);
}
break;
case MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX:
- if (*set->mailbox_dir_name == '\0')
+ if (*parsed_mailbox_root_directory_prefix == '\0')
path = set->alt_dir;
else if (set->alt_dir != NULL) {
path = t_strconcat(set->alt_dir, "/",
- set->mailbox_dir_name, NULL);
+ parsed_mailbox_root_directory_prefix, NULL);
path = t_strndup(path, strlen(path)-1);
}
break;
}
/* relative path */
if (!mailbox_list_set_get_root_path(&list->set,
+ list->mail_set->parsed_mailbox_root_directory_prefix,
MAILBOX_LIST_PATH_TYPE_INDEX, &path))
i_unreached();
path = t_strconcat(path, "/",
}
/* default to index directory */
return mailbox_list_set_get_root_path(&list->set,
- MAILBOX_LIST_PATH_TYPE_INDEX, path_r);
+ list->mail_set->parsed_mailbox_root_directory_prefix,
+ MAILBOX_LIST_PATH_TYPE_INDEX, path_r);
default:
- return mailbox_list_set_get_root_path(&list->set, type, path_r);
+ return mailbox_list_set_get_root_path(&list->set,
+ list->mail_set->parsed_mailbox_root_directory_prefix,
+ type, path_r);
}
*path_r = path;
return path != NULL;
If mailbox_name is "Maildir", you have a non-selectable mailbox
"mail" and a selectable mailbox "mail/foo". */
const char *maildir_name;
- /* if set, store mailboxes under root_dir/mailbox_dir_name/.
- this setting contains either "" or "dir/". */
- const char *mailbox_dir_name;
/* Used for escaping the mailbox name in storage (storage_name). If the
UTF-8 vname has characters that can't reversibly (or safely) be