]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Replace CONTROL with mail_control_path setting
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 27 Oct 2023 18:55:54 +0000 (21:55 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
14 files changed:
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/list/mailbox-list-delete.c
src/lib-storage/list/mailbox-list-delete.h
src/lib-storage/list/mailbox-list-fs.c
src/lib-storage/list/mailbox-list-index-backend.c
src/lib-storage/list/mailbox-list-maildir.c
src/lib-storage/list/mailbox-list-subscriptions.c
src/lib-storage/list/subscription-file.c
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-storage-settings.h
src/lib-storage/mail-storage.c
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h

index 6ae3bcabdd7494097c2667543bbd7a4eafd32554..86652e6ef37e03bd97553dda5b96762a5cfa332f 100644 (file)
@@ -63,7 +63,8 @@ maildir_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
        storage->temp_prefix = p_strdup(_storage->pool,
                                        mailbox_list_get_temp_prefix(list));
 
-       if (list->set.control_dir == NULL && list->set.inbox_path == NULL &&
+       if (list->mail_set->mail_control_path[0] == '\0' &&
+           list->set.inbox_path == NULL &&
            (ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0) {
                /* put the temp files into tmp/ directory preferably */
                storage->temp_prefix = p_strconcat(_storage->pool, "tmp/",
index 4a2250defa02422a139d758f90cf03e8ac4650ac..27c0ffb661248570f8f0531a9b1bdad143c035fa 100644 (file)
@@ -126,7 +126,7 @@ mbox_list_get_path(struct mailbox_list *list, const char *name,
        case MAILBOX_LIST_PATH_TYPE_INDEX_CACHE:
        case MAILBOX_LIST_PATH_TYPE_LIST_INDEX:
                if (name == NULL && type == MAILBOX_LIST_PATH_TYPE_CONTROL &&
-                   list->set.control_dir != NULL) {
+                   list->mail_set->mail_control_path[0] != '\0') {
                        /* kind of a kludge for backwards compatibility:
                           the subscriptions file is in the root control_dir
                           without .imap/ suffix */
index 35d4f95d949307ac6a326d8bacf4a248029331ba..73f5576d33c6e5b82aa564a83be6a052314368d0 100644 (file)
@@ -266,7 +266,7 @@ static bool mailbox_list_path_is_index(struct mailbox_list *list,
        if (type == MAILBOX_LIST_PATH_TYPE_INDEX)
                return TRUE;
 
-       /* e.g. CONTROL dir could point to the same INDEX dir. */
+       /* e.g. mail_control_path could point to the same INDEX dir. */
        type_root = mailbox_list_get_root_forced(list, type);
        index_root = mailbox_list_get_root_forced(list, MAILBOX_LIST_PATH_TYPE_INDEX);
        return strcmp(type_root, index_root) == 0;
@@ -359,7 +359,7 @@ static int mailbox_list_try_delete(struct mailbox_list *list, const char *name,
            mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_INDEX,
                                  &index_path) > 0 &&
            strcmp(index_path, path) == 0) {
-               /* CONTROL dir is the same as INDEX dir, which we already
+               /* mail_control_path is the same as INDEX dir, which we already
                   deleted. We don't want to continue especially with
                   mailbox_list_iter_from_index_dir=yes, because it could be
                   deleting the index directory. */
@@ -367,7 +367,7 @@ static int mailbox_list_try_delete(struct mailbox_list *list, const char *name,
        }
 
        /* Note that only mail_alt_path currently uses maildir_name in paths.
-          INDEX and CONTROL don't. */
+          INDEX and mail_control_path don't. */
        if (type != MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX ||
            *list->set.maildir_name == '\0') {
                /* this directory may contain also child mailboxes' data.
index da8d17039a9315aae80d90f38e2ec7032161b2d0..af44c3de8ab3527e2f11c116099c297dbdd2619e 100644 (file)
@@ -47,8 +47,8 @@ int mailbox_list_delete_mailbox_file(struct mailbox_list *list,
 int mailbox_list_delete_mailbox_nonrecursive(struct mailbox_list *list,
                                             const char *name, const char *path,
                                             bool rmdir_path);
-/* Lookup INDEX, CONTROL and mail_alt_path directories for the mailbox and
-   delete them.
+/* Lookup INDEX, mail_control_path and mail_alt_path directories for the
+   mailbox and delete them.
    Returns 1 if anything was unlink()ed or rmdir()ed, 0 if not.
    Returns -1 and sets the list error on any errors. */
 int mailbox_list_delete_finish(struct mailbox_list *list, const char *name);
index 9dd38fd5909007b5e04354deae8c46e180d34647..1bfd13d2f945ec14112d54f912998b2884ca6088 100644 (file)
@@ -119,8 +119,9 @@ fs_list_get_path(struct mailbox_list *_list, const char *name,
                root_dir = mail_set->mail_alt_path;
                break;
        case MAILBOX_LIST_PATH_TYPE_CONTROL:
-               if (set->control_dir != NULL) {
-                       *path_r = fs_list_get_path_to(_list, set->control_dir, name);
+               if (mail_set->mail_control_path[0] != '\0') {
+                       *path_r = fs_list_get_path_to(_list,
+                               mail_set->mail_control_path, name);
                        return 1;
                }
                break;
@@ -209,7 +210,7 @@ static int fs_list_set_subscribed(struct mailbox_list *_list,
                return -1;
        }
 
-       type = _list->set.control_dir != NULL ?
+       type = _list->mail_set->mail_control_path[0] != '\0' ?
                MAILBOX_LIST_PATH_TYPE_CONTROL : MAILBOX_LIST_PATH_TYPE_DIR;
 
        path = t_strconcat(mailbox_list_get_root_forced(_list, type),
index 692d86845faf4ef91ed5625b924ebe7fec33d824..80dd7eeb51d48af173c0de151b16d3a4ada564a4 100644 (file)
@@ -224,8 +224,9 @@ static int index_list_set_subscribed(struct mailbox_list *_list,
                return -1;
        }
 
-       path = t_strconcat(_list->set.control_dir != NULL ?
-                          _list->set.control_dir : _list->set.root_dir,
+       path = t_strconcat(_list->mail_set->mail_control_path[0] != '\0' ?
+                          _list->mail_set->mail_control_path :
+                          _list->set.root_dir,
                           "/", _list->mail_set->mailbox_subscriptions_filename,
                           NULL);
        return subsfile_set_subscribed(_list, path, list->temp_prefix,
index 5c0f860a29403bc5c8fe8d0151e686c20d81044d..a62ae361a497b552e23273bb97a3e93c6f15b059 100644 (file)
@@ -130,9 +130,9 @@ maildir_list_get_path(struct mailbox_list *_list, const char *name,
                root_dir = _list->mail_set->mail_alt_path;
                break;
        case MAILBOX_LIST_PATH_TYPE_CONTROL:
-               if (_list->set.control_dir != NULL) {
+               if (_list->mail_set->mail_control_path[0] != '\0') {
                        *path_r = maildir_list_get_dirname_path(_list,
-                                              _list->set.control_dir, name);
+                               _list->mail_set->mail_control_path, name);
                        return 1;
                }
                break;
@@ -197,8 +197,9 @@ static int maildir_list_set_subscribed(struct mailbox_list *_list,
                return -1;
        }
 
-       path = t_strconcat(_list->set.control_dir != NULL ?
-                          _list->set.control_dir : _list->set.root_dir,
+       path = t_strconcat(_list->mail_set->mail_control_path[0] != '\0' ?
+                          _list->mail_set->mail_control_path :
+                          _list->set.root_dir,
                           "/", _list->mail_set->mailbox_subscriptions_filename,
                           NULL);
 
index 2527ac07a226d6d54e5924783578cd207257e439..d56dc9ee3657d3631c8dbe2ef967a8eb43e3a132 100644 (file)
@@ -124,7 +124,7 @@ int mailbox_list_subscriptions_refresh(struct mailbox_list *src_list,
                dest_list->subscriptions = mailbox_tree_init(sep);
        }
 
-       type = src_list->set.control_dir != NULL ?
+       type = src_list->mail_set->mail_control_path[0] != '\0' ?
                MAILBOX_LIST_PATH_TYPE_CONTROL : MAILBOX_LIST_PATH_TYPE_DIR;
        if (!mailbox_list_get_root_path(src_list, type, &path) ||
            src_list->mail_set->mailbox_subscriptions_filename[0] == '\0') {
index 53c803266c7c1c887c9b2778f2b8474f336cceb0..585599f3e36b3bb5f79561ce018a146c899d5270 100644 (file)
@@ -146,7 +146,7 @@ int subsfile_set_subscribed(struct mailbox_list *list, const char *path,
                                         perm.file_create_gid_origin, &dotlock);
        if (fd_out == -1 && errno == ENOENT) {
                /* directory hasn't been created yet. */
-               type = list->set.control_dir != NULL ?
+               type = list->mail_set->mail_control_path[0] != '\0' ?
                        MAILBOX_LIST_PATH_TYPE_CONTROL :
                        MAILBOX_LIST_PATH_TYPE_DIR;
                fname = strrchr(path, '/');
index 6785e9ba2f18da261f55a062cc8e35c4889c28ca..915a8ef58dd72f172a71f9f7733bf41893ca2ecf 100644 (file)
@@ -83,6 +83,7 @@ static const struct setting_define mail_storage_setting_defines[] = {
        DEF(BOOL_HIDDEN, mailbox_list_validate_fs_names),
        DEF(STR_HIDDEN, mailbox_root_directory_name),
        DEF(STR_HIDDEN, mailbox_subscriptions_filename),
+       DEF(STR, mail_control_path),
        DEF(STR, mail_volatile_path),
        DEF(STR, mail_alt_path),
        DEF(BOOL_HIDDEN, mail_alt_check),
@@ -153,6 +154,7 @@ const struct mail_storage_settings mail_storage_default_settings = {
        .mailbox_list_validate_fs_names = TRUE,
        .mailbox_root_directory_name = "",
        .mailbox_subscriptions_filename = "subscriptions",
+       .mail_control_path = "",
        .mail_volatile_path = "",
        .mail_alt_path = "",
        .mail_alt_check = TRUE,
@@ -510,6 +512,7 @@ mailbox_list_get_path_setting(const char *key, const char **value,
                const char *set_name;
                enum mailbox_list_path_type type;
        } set_types[] = {
+               { "mail_control_path", MAILBOX_LIST_PATH_TYPE_CONTROL },
                { "mail_alt_path", MAILBOX_LIST_PATH_TYPE_ALT_DIR },
        };
        for (unsigned int i = 0; i < N_ELEMENTS(set_types); i++) {
@@ -1008,6 +1011,7 @@ static const size_t mail_storage_2nd_reset_offsets[] = {
        OFFSET(mailbox_list_iter_from_index_dir),
        OFFSET(mailbox_root_directory_name),
        OFFSET(mailbox_subscriptions_filename),
+       OFFSET(mail_control_path),
        OFFSET(mail_volatile_path),
        OFFSET(mail_alt_path),
        OFFSET(mail_alt_check),
index be3245daa69913fb84ccbb763d537e1033cc2ffc..a6575bbca7b07e42acb96ce6b256426b9a10956d 100644 (file)
@@ -63,6 +63,7 @@ struct mail_storage_settings {
        bool mailbox_list_validate_fs_names;
        const char *mailbox_root_directory_name;
        const char *mailbox_subscriptions_filename;
+       const char *mail_control_path;
        const char *mail_volatile_path;
        const char *mail_alt_path;
        bool mail_alt_check;
index 21477ff1b515085956881ac00f9acf2441019080..fa7a0c7bb72f3c112f64d89f3ecfbf908af60e7a 100644 (file)
@@ -2176,8 +2176,10 @@ mailbox_lists_rename_compatible(struct mailbox_list *list1,
                        list1->ns->set->name, list2->ns->set->name);
                return FALSE;
        }
-       if (!nullequals(list1->set.control_dir, list2->set.control_dir)) {
-               *error_r = t_strdup_printf("Namespace %s has control dir, %s doesn't",
+       if (!nullequals(list1->mail_set->mail_control_path,
+                       list2->mail_set->mail_control_path)) {
+               *error_r = t_strdup_printf(
+                       "Namespace %s has mail_control_path, %s doesn't",
                        list1->ns->set->name, list2->ns->set->name);
                return FALSE;
        }
index 5372143f50e11d873873284335eda8fd411b7145..3b9220c6d621491ece7ab0250931273d74895d9d 100644 (file)
@@ -160,9 +160,6 @@ int mailbox_list_create(struct event *event, struct mail_namespace *ns,
                list->set.index_cache_dir = set->index_cache_dir == NULL ||
                        strcmp(set->index_cache_dir, set->root_dir) == 0 ? NULL :
                        p_strdup(list->pool, set->index_cache_dir);
-               list->set.control_dir = set->control_dir == NULL ||
-                       strcmp(set->control_dir, set->root_dir) == 0 ? NULL :
-                       p_strdup(list->pool, set->control_dir);
        }
 
        list->set.inbox_path = p_strdup(list->pool, set->inbox_path);
@@ -194,8 +191,7 @@ int mailbox_list_create(struct event *event, struct mail_namespace *ns,
                list->set.root_dir == NULL ? "" : list->set.root_dir,
                list->set.index_dir == NULL ? "" : list->set.index_dir,
                list->set.index_pvt_dir == NULL ? "" : list->set.index_pvt_dir,
-               list->set.control_dir == NULL ?
-               "" : list->set.control_dir,
+               mail_set->mail_control_path,
                list->set.inbox_path == NULL ?
                "" : list->set.inbox_path,
                mail_set->mail_alt_path);
@@ -305,8 +301,6 @@ mailbox_list_settings_parse_full(struct mail_user *user, const char *data,
                        dest = &set_r->index_pvt_dir;
                else if (strcmp(key, "INDEXCACHE") == 0)
                        dest = &set_r->index_cache_dir;
-               else if (strcmp(key, "CONTROL") == 0)
-                       dest = &set_r->control_dir;
                else if (strcmp(key, "DIRNAME") == 0)
                        dest = &set_r->maildir_name;
                else if (strcmp(key, "FULLDIRNAME") == 0) {
@@ -378,6 +372,9 @@ const char *mailbox_list_get_unexpanded_path(struct mailbox_list *list,
                return "";
 
        switch (type) {
+       case MAILBOX_LIST_PATH_TYPE_CONTROL:
+               type = MAILBOX_LIST_PATH_TYPE_DIR;
+               break;
        case MAILBOX_LIST_PATH_TYPE_LIST_INDEX:
                type = MAILBOX_LIST_PATH_TYPE_INDEX;
                break;
@@ -1407,8 +1404,6 @@ mailbox_list_set_get_root_path(const struct mailbox_list_settings *set,
        case MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX:
                break;
        case MAILBOX_LIST_PATH_TYPE_CONTROL:
-               path = set->control_dir != NULL ?
-                       set->control_dir : set->root_dir;
                break;
        case MAILBOX_LIST_PATH_TYPE_LIST_INDEX:
                break;
@@ -1459,6 +1454,10 @@ bool mailbox_list_default_get_root_path(struct mailbox_list *list,
                                mail_set->mailbox_root_directory_name, NULL);
                }
                break;
+       case MAILBOX_LIST_PATH_TYPE_CONTROL:
+               path = mail_set->mail_control_path[0] != '\0' ?
+                       mail_set->mail_control_path : list->set.root_dir;
+               break;
        case MAILBOX_LIST_PATH_TYPE_LIST_INDEX:
                if (mail_set->parsed_list_index_dir != NULL) {
                        if (mail_set->parsed_list_index_dir[0] == '/') {
index a5176a6060806f22c01e058212d5e6c30d1fd867..97fe432c8ac7a98261eb51384b2b49ac99a1efb9 100644 (file)
@@ -118,7 +118,6 @@ struct mailbox_list_settings {
        const char *index_dir;
        const char *index_pvt_dir;
        const char *index_cache_dir;
-       const char *control_dir;
 
        const char *inbox_path;
        /* If non-empty, it means that mails exist in a maildir_name