]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master, global: Introduce master_service_settings_instance
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 7 Feb 2023 23:27:54 +0000 (01:27 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:20:55 +0000 (14:20 +0200)
This commit mainly consists of renaming "settings parser" to "settings
instance" in various variables and function names. The following commits
make it more useful.

25 files changed:
src/doveadm/doveadm-dsync.c
src/doveadm/doveadm-mail.c
src/imap-urlauth/imap-urlauth-worker.c
src/imap/main.c
src/lda/main.c
src/lib-master/master-service-settings.c
src/lib-master/master-service-settings.h
src/lib-storage/index/dbox-multi/mdbox-storage.c
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/index/pop3c/pop3c-storage.c
src/lib-storage/index/raw/raw-storage.c
src/lib-storage/index/raw/raw-storage.h
src/lib-storage/index/shared/shared-storage.c
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-service.h
src/lib-storage/mail-user.c
src/lib-storage/mail-user.h
src/lmtp/lmtp-client.c
src/lmtp/lmtp-client.h
src/lmtp/lmtp-local.c
src/plugins/quota/quota-status.c
src/pop3/main.c
src/submission/main.c

index 2a7ad1c89728268d11fe17d43d8b173c10172cd2..ad122494f44849d50d074ef1b148c1e7dbd8cb45 100644 (file)
@@ -466,9 +466,9 @@ cmd_dsync_run_local(struct dsync_cmd_context *ctx, struct mail_user *user,
 
        /* update mail_location and create another user for the
           second location. */
-       struct setting_parser_context *set_parser =
-               mail_storage_service_user_get_settings_parser(ctx->ctx.cur_service_user);
-       if (master_service_set(set_parser, "mail_location", location, &error) <= 0)
+       struct master_service_settings_instance *set_instance =
+               mail_storage_service_user_get_settings_instance(ctx->ctx.cur_service_user);
+       if (master_service_set(set_instance, "mail_location", location, &error) <= 0)
                i_unreached();
        ret = mail_storage_service_next(ctx->ctx.storage_service,
                                        ctx->ctx.cur_service_user,
@@ -1019,10 +1019,10 @@ get_default_replica_location(struct dsync_cmd_context *ctx,
                             struct mail_storage_service_user *service_user,
                             const char **error_r)
 {
-       struct setting_parser_context *set_parser =
-               mail_storage_service_user_get_settings_parser(service_user);
+       struct master_service_settings_instance *set_instance =
+               mail_storage_service_user_get_settings_instance(service_user);
        const struct mail_storage_settings *mail_set;
-       if (master_service_settings_parser_get(NULL, set_parser,
+       if (master_service_settings_instance_get(NULL, set_instance,
                        &mail_storage_setting_parser_info,
                        MASTER_SERVICE_SETTINGS_GET_FLAG_NO_CHECK |
                        MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
index 6ceb262f9566f476bf6c238e22c6fd47df8f6b37..df1552c7ef911ec9bed0ff31d8589faa18156b66 100644 (file)
@@ -331,9 +331,9 @@ static int cmd_force_resync_prerun(struct doveadm_mail_cmd_context *ctx ATTR_UNU
                                   struct mail_storage_service_user *service_user,
                                   const char **error_r)
 {
-       struct setting_parser_context *set_parser =
-               mail_storage_service_user_get_settings_parser(service_user);
-       if (master_service_set(set_parser, "mailbox_list_index_very_dirty_syncs",
+       struct master_service_settings_instance *set_instance =
+               mail_storage_service_user_get_settings_instance(service_user);
+       if (master_service_set(set_instance, "mailbox_list_index_very_dirty_syncs",
                               "no", error_r) <= 0)
                i_unreached();
        return 0;
index d0c815914104bed5232c9e1727a1fec1d3bab9da..06edea35ac70d23a6a60ad774ea409373bc251a1 100644 (file)
@@ -559,8 +559,8 @@ client_handle_user_command(struct client *client, const char *cmd,
                return 1;
        }
 
-       if (master_service_settings_parser_get(client->event,
-                       mail_user->set_parser,
+       if (master_service_settings_instance_get(client->event,
+                       mail_user->set_instance,
                        &imap_urlauth_worker_setting_parser_info, 0,
                        &set, &error) < 0) {
                e_error(client->event, "user %s: %s", input.username, error);
index 95ccc3e6878dcadf3bf67e1540e306b46fb742b2..05baf4aa8634a60fee77d91e3dab6684f59038e2 100644 (file)
@@ -281,12 +281,13 @@ int client_create_from_input(const struct mail_storage_service_input *input,
 
        restrict_access_allow_coredumps(TRUE);
 
-       if (master_service_settings_parser_get(mail_user->event,
-                       mail_user->set_parser, &smtp_submit_setting_parser_info,
-                       0, &smtp_set, error_r) < 0 ||
-          master_service_settings_parser_get(mail_user->event,
-                       mail_user->set_parser, &imap_setting_parser_info,
-                       0, &imap_set, error_r) < 0) {
+       if (master_service_settings_instance_get(mail_user->event,
+                       mail_user->set_instance,
+                       &smtp_submit_setting_parser_info, 0,
+                       &smtp_set, error_r) < 0 ||
+          master_service_settings_instance_get(mail_user->event,
+                       mail_user->set_instance, &imap_setting_parser_info, 0,
+                       &imap_set, error_r) < 0) {
                master_service_settings_free(smtp_set);
                mail_user_deinit(&mail_user);
                event_unref(&event);
index b0c89c96096de8e708efcaaebdb35de11556c780..b1197eb0ac795e9beb6a172e58309d5ab144afae 100644 (file)
@@ -155,9 +155,9 @@ lda_raw_mail_open(struct mail_deliver_input *dinput, const char *path)
 
        struct mail_storage_service_ctx *storage_service =
                mail_storage_service_user_get_service_ctx(dinput->rcpt_user->service_user);
-       struct setting_parser_context *set_parser =
-               mail_storage_service_user_get_settings_parser(dinput->rcpt_user->service_user);
-       raw_mail_user = raw_storage_create_from_set(storage_service, set_parser);
+       struct master_service_settings_instance *set_instance =
+               mail_storage_service_user_get_settings_instance(dinput->rcpt_user->service_user);
+       raw_mail_user = raw_storage_create_from_set(storage_service, set_instance);
 
        mail_from = (dinput->mail_from != NULL ?
                     dinput->mail_from : &default_envelope_sender);
@@ -290,12 +290,12 @@ lda_deliver(struct mail_deliver_input *dinput,
        const char *error;
        int ret;
 
-       if (master_service_settings_parser_get(dinput->rcpt_user->event,
-                       dinput->rcpt_user->set_parser,
+       if (master_service_settings_instance_get(dinput->rcpt_user->event,
+                       dinput->rcpt_user->set_instance,
                        &lda_setting_parser_info, 0,
                        &dinput->set, &error) < 0 ||
-           master_service_settings_parser_get(dinput->rcpt_user->event,
-                       dinput->rcpt_user->set_parser,
+           master_service_settings_instance_get(dinput->rcpt_user->event,
+                       dinput->rcpt_user->set_instance,
                        &smtp_submit_setting_parser_info, 0,
                        &dinput->smtp_set, &error) < 0)
                i_fatal("%s", error);
index 67068b822b8c89f2722d3b2edecaf309f5d3992c..4859d480a4a83fa5a596f34eb808cdce1d82dd9c 100644 (file)
@@ -36,6 +36,10 @@ struct master_settings_mmap {
        size_t mmap_size;
 };
 
+struct master_service_settings_instance {
+       struct setting_parser_context *parser;
+};
+
 static pool_t master_settings_pool_create(struct master_settings_mmap *mmap);
 
 #undef DEF
@@ -889,19 +893,19 @@ master_service_var_expand_init(struct event *event,
                event_get_ptr(event, MASTER_SERVICE_VAR_EXPAND_FUNC_CONTEXT);
 }
 
-#undef master_service_settings_parser_get
-int master_service_settings_parser_get(struct event *event,
-                                      struct setting_parser_context *set_parser,
-                                      const struct setting_parser_info *info,
-                                      enum master_service_settings_get_flags flags,
-                                      const void **set_r, const char **error_r)
+#undef master_service_settings_instance_get
+int master_service_settings_instance_get(struct event *event,
+                                        struct master_service_settings_instance *instance,
+                                        const struct setting_parser_info *info,
+                                        enum master_service_settings_get_flags flags,
+                                        const void **set_r, const char **error_r)
 {
        int ret;
 
        i_assert(info->pool_offset1 != 0);
 
        pool_t set_pool = pool_alloconly_create("master service settings parser", 1024);
-       void *set = settings_parser_get_root_set(set_parser, info);
+       void *set = settings_parser_get_root_set(instance->parser, info);
        set = settings_dup_with_pointers(info, set, set_pool);
 
        pool_t *pool_p = PTR_OFFSET(set, info->pool_offset1 - 1);
@@ -946,8 +950,11 @@ int master_service_settings_get(struct event *event,
                                enum master_service_settings_get_flags flags,
                                const void **set_r, const char **error_r)
 {
-       return master_service_settings_parser_get(event,
-               master_service->set_parser, info, flags, set_r, error_r);
+       struct master_service_settings_instance instance = {
+               .parser = master_service->set_parser,
+       };
+       return master_service_settings_instance_get(event,
+               &instance, info, flags, set_r, error_r);
 }
 
 const void *
@@ -962,23 +969,23 @@ master_service_settings_get_or_fatal(struct event *event,
        return set;
 }
 
-int master_service_set(struct setting_parser_context *set_parser,
+int master_service_set(struct master_service_settings_instance *instance,
                       const char *key, const char *value,
                       const char **error_r)
 {
        int ret;
 
-       ret = settings_parse_keyvalue(set_parser, key, value);
+       ret = settings_parse_keyvalue(instance->parser, key, value);
        if (ret <= 0)
-               *error_r = settings_parser_get_error(set_parser);
+               *error_r = settings_parser_get_error(instance->parser);
        return ret;
 }
 
 const void *
-master_service_settings_find(struct setting_parser_context *set_parser,
+master_service_settings_find(struct master_service_settings_instance *instance,
                             const char *key, enum setting_type *type_r)
 {
-       return settings_parse_get_value(set_parser, key, type_r);
+       return settings_parse_get_value(instance->parser, key, type_r);
 }
 
 bool master_service_set_has_config_override(struct master_service *service,
@@ -1011,3 +1018,37 @@ bool master_service_set_has_config_override(struct master_service *service,
        }
        return FALSE;
 }
+
+static struct master_service_settings_instance *
+master_service_settings_instance_from(struct setting_parser_context *parser)
+{
+       struct master_service_settings_instance *new_instance =
+               i_new(struct master_service_settings_instance, 1);
+       pool_t pool = pool_alloconly_create("master service settings instance", 1024);
+       new_instance->parser = settings_parser_dup(parser, pool);
+       pool_unref(&pool);
+       return new_instance;
+}
+
+struct master_service_settings_instance *
+master_service_settings_instance_new(struct master_service *service)
+{
+       return master_service_settings_instance_from(service->set_parser);
+}
+
+struct master_service_settings_instance *
+master_service_settings_instance_dup(struct master_service_settings_instance *instance)
+{
+       return master_service_settings_instance_from(instance->parser);
+}
+
+void master_service_settings_instance_free(
+       struct master_service_settings_instance **_instance)
+{
+       struct master_service_settings_instance *instance = *_instance;
+
+       *_instance = NULL;
+
+       settings_parser_unref(&instance->parser);
+       i_free(instance);
+}
index c8bc0878cdb88fca9b4d87a8c26b757cd77e47e8..15a43b85ae1eb40aaa5cb0489c358f52f821b681 100644 (file)
@@ -8,6 +8,7 @@ struct var_expand_table;
 struct var_expand_func_table;
 struct master_service;
 struct master_settings_mmap;
+struct master_service_settings_instance;
 
 enum master_service_settings_get_flags {
        /* Don't call check_func()s */
@@ -156,23 +157,23 @@ int master_service_settings_get(struct event *event,
 #endif
 
 /* Like master_service_settings_get(), but get settings from the specified
-   parser. */
-int master_service_settings_parser_get(struct event *event,
-                                      struct setting_parser_context *set_parser,
-                                      const struct setting_parser_info *info,
-                                      enum master_service_settings_get_flags flags,
-                                      const void **set_r, const char **error_r);
+   instance. */
+int master_service_settings_instance_get(struct event *event,
+                                        struct master_service_settings_instance *instance,
+                                        const struct setting_parser_info *info,
+                                        enum master_service_settings_get_flags flags,
+                                        const void **set_r, const char **error_r);
 #ifdef HAVE_TYPE_CHECKS
-#  define master_service_settings_parser_get(event, set_parser, \
+#  define master_service_settings_instance_get(event, instance, \
                info, flags, set_r, error_r) \
-       master_service_settings_parser_get(event, set_parser, \
+       master_service_settings_instance_get(event, instance, \
                info, flags, (void *)set_r, 1 ? (error_r) : \
        COMPILE_ERROR_IF_TRUE( \
                !__builtin_types_compatible_p(typeof((*set_r)->pool), pool_t)))
 #else
-#  define master_service_settings_parser_get(event, set_parser, \
+#  define master_service_settings_instance_get(event, instance, \
                info, flags, set_r, error_r) \
-       master_service_settings_parser_get(event, set_parser, \
+       master_service_settings_instance_get(event, instance, \
                info, flags, (void *)set_r, error_r)
 #endif
 
@@ -192,12 +193,12 @@ master_service_settings_get_or_fatal(struct event *event,
 
 /* Set key=value to settings parser. Returns 1 on success, 0 if key is unknown,
    -1 on error. The error string is returned on <= 0. */
-int master_service_set(struct setting_parser_context *set_parser,
+int master_service_set(struct master_service_settings_instance *instance,
                       const char *key, const char *value,
                       const char **error_r);
 /* Wrapper to settings_parse_get_value(). */
 const void *
-master_service_settings_find(struct setting_parser_context *set_parser,
+master_service_settings_find(struct master_service_settings_instance *instance,
                             const char *key, enum setting_type *type_r);
 
 /* Returns TRUE if -o key=value parameter was used. Setting keys in overrides
@@ -205,4 +206,14 @@ master_service_settings_find(struct setting_parser_context *set_parser,
 bool master_service_set_has_config_override(struct master_service *service,
                                            const char *key);
 
+/* Return a new instance for settings. */
+struct master_service_settings_instance *
+master_service_settings_instance_new(struct master_service *service);
+/* Return a new instance based on an existing instance. */
+struct master_service_settings_instance *
+master_service_settings_instance_dup(struct master_service_settings_instance *instance);
+/* Free a settings instance. */
+void master_service_settings_instance_free(
+       struct master_service_settings_instance **instance);
+
 #endif
index 75a59992089e5c085449b407e4a02bf7abad87e6..a5fad241d4d1105d9a1e27d8d12abe77cfe986de 100644 (file)
@@ -47,8 +47,8 @@ int mdbox_storage_create(struct mail_storage *_storage,
        struct mdbox_storage *storage = MDBOX_STORAGE(_storage);
        const char *dir;
 
-       if (master_service_settings_parser_get(_storage->event,
-                       _storage->user->set_parser,
+       if (master_service_settings_instance_get(_storage->event,
+                       _storage->user->set_instance,
                        mdbox_get_setting_parser_info(), 0,
                        &storage->set, error_r) < 0)
                return -1;
index 8d8b87da3094d4f2208b09663e174504db277867..576c1aa113458630b8ffcd4814929961f78f30f5 100644 (file)
@@ -316,8 +316,8 @@ int imapc_storage_client_create(struct mail_namespace *ns,
        struct imapc_client_settings set;
        string_t *str;
 
-       if (master_service_settings_parser_get(ns->user->event,
-                       ns->user->set_parser, imapc_get_setting_parser_info(),
+       if (master_service_settings_instance_get(ns->user->event,
+                       ns->user->set_instance, imapc_get_setting_parser_info(),
                        0, &imapc_set, error_r) < 0)
                return -1;
 
index bb0b104c63001a0e147f7df0e1161f61e38a90e2..635e94ecb3f4ac3c4c009632fec4a5f115da1b9e 100644 (file)
@@ -57,8 +57,8 @@ maildir_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
        struct mailbox_list *list = ns->list;
        const char *dir;
 
-       if (master_service_settings_parser_get(_storage->event,
-                       _storage->user->set_parser,
+       if (master_service_settings_instance_get(_storage->event,
+                       _storage->user->set_instance,
                        maildir_get_setting_parser_info(), 0,
                        &storage->set, error_r) < 0)
                return -1;
index 7b2a3b98c98224441c4ef66baaead9d5d9663381..b7ead523cd3b26fa924a0d4fb90bf16aed34da7d 100644 (file)
@@ -185,8 +185,8 @@ mbox_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
                return -1;
        }
 
-       if (master_service_settings_parser_get(_storage->event,
-                       _storage->user->set_parser,
+       if (master_service_settings_instance_get(_storage->event,
+                       _storage->user->set_instance,
                        mbox_get_setting_parser_info(), 0,
                        &storage->set, error_r) < 0)
                return -1;
index bc0961611effc0221c8471fe3579e0e08b7b21d6..be930a02316ce9393fce5c9f08a0784e6a42e284 100644 (file)
@@ -42,8 +42,8 @@ pop3c_storage_create(struct mail_storage *_storage,
 {
        struct pop3c_storage *storage = POP3C_STORAGE(_storage);
 
-       if (master_service_settings_parser_get(_storage->event,
-                       _storage->user->set_parser,
+       if (master_service_settings_instance_get(_storage->event,
+                       _storage->user->set_instance,
                        pop3c_get_setting_parser_info(), 0,
                        &storage->set, error_r) < 0)
                return -1;
index f7ad949a2479cf8649cc1ed348e1d76577c46838..9bc835e57ebfe81e08719287855bb592c7e7910b 100644 (file)
@@ -17,7 +17,7 @@ extern struct mailbox raw_mailbox;
 
 struct mail_user *
 raw_storage_create_from_set(struct mail_storage_service_ctx *ctx,
-                           struct setting_parser_context *set_parser)
+                           struct master_service_settings_instance *set_instance)
 {
        struct mail_user *user;
        struct mail_namespace *ns;
@@ -45,7 +45,7 @@ raw_storage_create_from_set(struct mail_storage_service_ctx *ctx,
        struct mail_storage_service_input input = {
                .event_parent = event,
                .username = "raw-mail-user",
-               .set_parser = set_parser,
+               .set_instance = set_instance,
                .autocreated = TRUE,
                .no_userdb_lookup = TRUE,
                .userdb_fields = userdb_fields,
index f366cae60fefd77410ea394656c056e9e432a726..70fe423c7cbe33734fea0e83326671e29a9effde 100644 (file)
@@ -32,7 +32,7 @@ extern struct mail_vfuncs raw_mail_vfuncs;
 
 struct mail_user *
 raw_storage_create_from_set(struct mail_storage_service_ctx *ctx,
-                           struct setting_parser_context *set_parser);
+                           struct master_service_settings_instance *set_instance);
 
 int raw_mailbox_alloc_stream(struct mail_user *user, struct istream *input,
                             time_t received_time, const char *envelope_sender,
index 3445758df81d4abce3c499846c86e3c398de38d1..348bacbf9a474e2c26dafc8c4944f315abc20346 100644 (file)
@@ -258,12 +258,12 @@ int shared_storage_get_namespace(struct mail_namespace **_ns,
                mail_storage_service_user_get_service_ctx(user->service_user);
        struct event *service_user_event =
                mail_storage_service_user_get_event(user->service_user);
-       struct setting_parser_context *service_user_set_parser =
-               mail_storage_service_user_get_settings_parser(user->service_user);
+       struct master_service_settings_instance *service_user_set_instance =
+               mail_storage_service_user_get_settings_instance(user->service_user);
        const struct mail_storage_service_input input = {
                .event_parent = event_get_parent(service_user_event),
                .username = userdomain,
-               .set_parser = service_user_set_parser,
+               .set_instance = service_user_set_instance,
                .session_id = user->session_id,
                .autocreated = TRUE,
                .no_userdb_lookup = TRUE,
index 0dcd1b10b782484498cbfa7832e5ded56a5a4fe6..3a80cacbde645c47048feb34b1a7e7d0b269978c 100644 (file)
@@ -76,7 +76,7 @@ struct mail_storage_service_user {
        const char *system_groups_user, *uid_source, *gid_source;
        const char *chdir_path;
        const struct mail_user_settings *user_set;
-       struct setting_parser_context *set_parser;
+       struct master_service_settings_instance *set_instance;
 
        unsigned int session_id_counter;
 
@@ -107,7 +107,7 @@ static void set_keyval(struct mail_storage_service_user *user,
                return;
        }
 
-       if (master_service_set(user->set_parser, key, value, &error) < 0)
+       if (master_service_set(user->set_instance, key, value, &error) < 0)
                i_fatal("Invalid userdb input %s=%s: %s", key, value, error);
 }
 
@@ -116,7 +116,6 @@ static int set_keyvalue(struct mail_storage_service_ctx *ctx,
                        const char *key, const char *value,
                        const char **error_r)
 {
-       struct setting_parser_context *set_parser = user->set_parser;
        const char *append_value = NULL;
        const void *old_value;
        enum setting_type type;
@@ -133,11 +132,11 @@ static int set_keyvalue(struct mail_storage_service_ctx *ctx,
        if (*key == '\0')
                return 1;
 
-       old_value = master_service_settings_find(set_parser, key, &type);
+       old_value = master_service_settings_find(user->set_instance, key, &type);
        if (old_value == NULL && !str_begins_with(key, "plugin/")) {
                /* assume it's a plugin setting */
                key = t_strconcat("plugin/", key, NULL);
-               old_value = master_service_settings_find(set_parser, key, &type);
+               old_value = master_service_settings_find(user->set_instance, key, &type);
        }
 
        if (master_service_set_has_config_override(ctx->service, key)) {
@@ -156,7 +155,7 @@ static int set_keyvalue(struct mail_storage_service_ctx *ctx,
                value = t_strconcat(*strp, append_value, NULL);
        }
 
-       ret = master_service_set(user->set_parser, key, value, error_r);
+       ret = master_service_set(user->set_instance, key, value, error_r);
        if (ret < 0)
                return -1;
        if (strstr(key, "pass") != NULL) {
@@ -995,7 +994,7 @@ mail_storage_service_add_storage_set_roots(struct mail_storage_service_ctx *ctx)
 
 int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx,
                                       const struct mail_storage_service_input *input,
-                                      struct setting_parser_context **parser_r,
+                                      struct master_service_settings_instance **instance_r,
                                       const char **error_r)
 {
        struct master_service_settings_input set_input;
@@ -1037,9 +1036,7 @@ int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx,
                return -1;
        }
        ctx->settings_looked_up = TRUE;
-       pool_t pool = pool_alloconly_create("mail storage service settings pool", 1024);
-       *parser_r = settings_parser_dup(ctx->service->set_parser, pool);
-       pool_unref(&pool);
+       *instance_r = master_service_settings_instance_new(ctx->service);
        return 0;
 }
 
@@ -1181,7 +1178,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        const struct mail_user_settings *user_set;
        const char *const *userdb_fields, *error;
        struct auth_user_reply reply;
-       struct setting_parser_context *set_parser;
+       struct master_service_settings_instance *set_instance;
        pool_t temp_pool;
        int ret = 1;
 
@@ -1196,17 +1193,18 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                mail_storage_service_seteuid_root();
        }
 
-       pool_t user_pool = pool_alloconly_create(MEMPOOL_GROWING"mail storage service user", 1024*6);
-       if (input->set_parser != NULL) {
-               set_parser = settings_parser_dup(input->set_parser, user_pool);
-       } else if (mail_storage_service_read_settings(ctx, input,
-                                                   &set_parser, error_r) < 0) {
+       if (input->set_instance != NULL) {
+               /* Start with the specified settings instance and its settings,
+                  but allow this instance to set its own settings without
+                  affecting the parent instance. */
+               set_instance = master_service_settings_instance_dup(input->set_instance);
+       } else if (mail_storage_service_read_settings(ctx, input, &set_instance,
+                                                   error_r) < 0) {
                if (ctx->config_permission_denied) {
                        /* just restart and maybe next time we will open the
                           config socket before dropping privileges */
                        i_fatal("%s", *error_r);
                }
-               pool_unref(&user_pool);
                return -1;
        }
 
@@ -1237,12 +1235,11 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                      mail_storage_service_var_expand_callback);
        event_set_ptr(event, MASTER_SERVICE_VAR_EXPAND_FUNC_CONTEXT,
                      &var_expand_ctx);
-       if (master_service_settings_parser_get(event, set_parser,
+       if (master_service_settings_instance_get(event, set_instance,
                                               &mail_user_setting_parser_info,
                                               0, &user_set, error_r) < 0) {
-               pool_unref(&user_pool);
                event_unref(&event);
-               settings_parser_unref(&set_parser);
+               master_service_settings_instance_free(&set_instance);
                return -1;
        }
 
@@ -1254,9 +1251,8 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        /* load global plugins */
        if (mail_storage_service_load_modules(ctx, user_set, error_r) < 0) {
                master_service_settings_free(user_set);
-               pool_unref(&user_pool);
                event_unref(&event);
-               settings_parser_unref(&set_parser);
+               master_service_settings_instance_free(&set_instance);
                return -1;
        }
 
@@ -1266,6 +1262,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        event_set_forced_debug(event,
                ctx->debug || (flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0);
 
+       pool_t user_pool = pool_alloconly_create(MEMPOOL_GROWING"mail storage service user", 1024*6);
        const char *session_id = input->session_id != NULL ?
                p_strdup(user_pool, input->session_id) :
                mail_storage_service_generate_session_id(
@@ -1290,7 +1287,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                        event_unref(&event);
                        pool_unref(&temp_pool);
                        pool_unref(&user_pool);
-                       settings_parser_unref(&set_parser);
+                       master_service_settings_instance_free(&set_instance);
                        return ret;
                }
                event_add_str(event, "user", username);
@@ -1313,7 +1310,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        user->input.session_create_time = input->session_create_time;
        user->flags = flags;
 
-       user->set_parser = set_parser;
+       user->set_instance = set_instance;
        user->user_set = user_set;
        user->gid_source = "mail_gid setting";
        user->uid_source = "mail_uid setting";
@@ -1322,7 +1319,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        var_expand_ctx.user = user;
 
        if ((flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0) {
-               if (master_service_set(user->set_parser, "mail_debug", "yes", &error) <= 0)
+               if (master_service_set(user->set_instance, "mail_debug", "yes", &error) <= 0)
                        i_unreached();
        }
 
@@ -1351,13 +1348,13 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                   fine that extra plugins are loaded - we'll just need to
                   prevent any of their hooks from being called. One easy way
                   to do this is just to clear out the mail_plugins setting: */
-               if (master_service_set(user->set_parser, "mail_plugins", "", &error) <= 0)
+               if (master_service_set(user->set_instance, "mail_plugins", "", &error) <= 0)
                        i_unreached();
        }
        if (ret > 0) {
                mail_storage_service_update_chroot(user);
                /* Settings may have changed in the parser */
-               if (master_service_settings_parser_get(event, user->set_parser,
+               if (master_service_settings_instance_get(event, user->set_instance,
                                &mail_user_setting_parser_info,
                                0, &user_set, &error) < 0) {
                        *error_r = t_strdup_printf(
@@ -1596,7 +1593,7 @@ void mail_storage_service_user_unref(struct mail_storage_service_user **_user)
                master_service_set_current_user(master_service, NULL);
 
        master_service_settings_free(user->user_set);
-       settings_parser_unref(&user->set_parser);
+       master_service_settings_instance_free(&user->set_instance);
        event_unref(&user->event);
        pool_unref(&user->pool);
 }
@@ -1611,22 +1608,22 @@ void mail_storage_service_init_settings(struct mail_storage_service_ctx *ctx,
                                        const struct mail_storage_service_input *input)
 {
        const struct mail_user_settings *user_set;
-       struct setting_parser_context *set_parser;
+       struct master_service_settings_instance *set_instance;
        const char *error;
 
        if (ctx->conn != NULL)
                return;
 
        if (mail_storage_service_read_settings(ctx, input,
-                                              &set_parser, &error) < 0)
+                                              &set_instance, &error) < 0)
                i_fatal("%s", error);
        struct event *event = input == NULL ? NULL : input->event_parent;
-       if (master_service_settings_parser_get(event, set_parser,
+       if (master_service_settings_instance_get(event, set_instance,
                        &mail_user_setting_parser_info,
                        MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
                        &user_set, &error) < 0)
                i_fatal("%s", error);
-       settings_parser_unref(&set_parser);
+       master_service_settings_instance_free(&set_instance);
 
        mail_storage_service_first_init(ctx, user_set, ctx->flags);
        master_service_settings_free(user_set);
@@ -1705,22 +1702,22 @@ mail_storage_service_user_get_input(struct mail_storage_service_user *user)
        return &user->input;
 }
 
-struct setting_parser_context *
-mail_storage_service_user_get_settings_parser(struct mail_storage_service_user *user)
+struct master_service_settings_instance *
+mail_storage_service_user_get_settings_instance(struct mail_storage_service_user *user)
 {
-       return user->set_parser;
+       return user->set_instance;
 }
 
 int mail_storage_service_user_init_ssl_client_settings(
        struct mail_storage_service_user *user, pool_t pool,
        struct ssl_iostream_settings *ssl_set_r, const char **error_r)
 {
-       struct setting_parser_context *set_parser;
+       struct master_service_settings_instance *set_instance;
        const struct master_service_ssl_settings *ssl_set;
 
-       set_parser = mail_storage_service_user_get_settings_parser(user);
-       if (master_service_settings_parser_get(user->event,
-                       set_parser, &master_service_ssl_setting_parser_info,
+       set_instance = mail_storage_service_user_get_settings_instance(user);
+       if (master_service_settings_instance_get(user->event,
+                       set_instance, &master_service_ssl_setting_parser_info,
                        0, &ssl_set, error_r) < 0)
                return -1;
        master_service_ssl_client_settings_to_iostream_set(ssl_set, pool,
index 8333d2a37e123d8d8cfddb0fc12598802804c494..9c3b29b8620a2f604e2b22ba31f843c0469e489d 100644 (file)
@@ -58,8 +58,8 @@ struct mail_storage_service_input {
 
        const char *const *forward_fields;
 
-       /* Use this settings parser instead of looking it up. */
-       struct setting_parser_context *set_parser;
+       /* Use this settings instance instead of looking it up. */
+       struct master_service_settings_instance *set_instance;
 
        /* Override specified global flags */
        enum mail_storage_service_flags flags_override_add;
@@ -92,7 +92,7 @@ void mail_storage_service_set_auth_conn(struct mail_storage_service_ctx *ctx,
                                        struct auth_master_connection *conn);
 int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx,
                                       const struct mail_storage_service_input *input,
-                                      struct setting_parser_context **parser_r,
+                                      struct master_service_settings_instance **instance_r,
                                       const char **error_r) ATTR_NULL(2);
 /* Read settings and initialize context to use them. Do nothing if service is
    already initialized. This is mainly necessary when calling _get_auth_conn()
@@ -155,8 +155,8 @@ const struct mail_user_settings *
 mail_storage_service_user_get_set(struct mail_storage_service_user *user);
 const struct mail_storage_service_input *
 mail_storage_service_user_get_input(struct mail_storage_service_user *user);
-struct setting_parser_context *
-mail_storage_service_user_get_settings_parser(struct mail_storage_service_user *user);
+struct master_service_settings_instance *
+mail_storage_service_user_get_settings_instance(struct mail_storage_service_user *user);
 int mail_storage_service_user_init_ssl_client_settings(
        struct mail_storage_service_user *user, pool_t pool,
        struct ssl_iostream_settings *ssl_set_r, const char **error_r);
index b35e8be3506f1d2a44a435154c1e4bcdc48ef071..fe7fd9be38181baedcbbe9936041ebc496638f91 100644 (file)
@@ -83,8 +83,8 @@ mail_user_alloc(struct mail_storage_service_user *service_user)
                mail_storage_service_user_get_event(service_user);
        const char *username =
                mail_storage_service_user_get_username(service_user);
-       struct setting_parser_context *service_user_set_parser =
-               mail_storage_service_user_get_settings_parser(service_user);
+       struct master_service_settings_instance *service_user_set_instance =
+               mail_storage_service_user_get_settings_instance(service_user);
        i_assert(*username != '\0');
 
        pool_t pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
@@ -94,7 +94,7 @@ mail_user_alloc(struct mail_storage_service_user *service_user)
        user->service_user = service_user;
        mail_storage_service_user_ref(service_user);
        user->username = p_strdup(pool, username);
-       user->set_parser = service_user_set_parser;
+       user->set_instance = service_user_set_instance;
        user->set = mail_storage_service_user_get_set(service_user);
        user->service = master_service_get_name(master_service);
        user->default_normalizer = uni_utf8_to_decomposed_titlecase;
@@ -150,7 +150,7 @@ int mail_user_init(struct mail_user *user, const char **error_r)
 
        i_assert(!user->initialized);
 
-       if (master_service_settings_parser_get(user->event, user->set_parser,
+       if (master_service_settings_instance_get(user->event, user->set_instance,
                        &mail_storage_setting_parser_info, 0,
                        &user->_mail_set, &error) < 0)
                user->error = p_strdup(user->pool, error);
index a34f0e6fe881dbc62c202ad8754f442b8b86eb6a..cddf8ec8933659be1fc3ca7957578d201fb5c170 100644 (file)
@@ -57,8 +57,8 @@ struct mail_user {
           This could be set by plugins that need to fail the initialization. */
        const char *error;
 
-       /* Points to service_user->set_parser */
-       struct setting_parser_context *set_parser;
+       /* Points to service_user->set_instance */
+       struct master_service_settings_instance *set_instance;
        const struct mail_user_settings *set;
        struct mail_storage_settings *_mail_set;
        struct ssl_iostream_settings *ssl_set;
index 485e467e5488ae8c9f0acd700536fba4bede4d3d..459791d70f1998c666a343000f638def17ae3deb 100644 (file)
@@ -112,22 +112,21 @@ static void client_read_settings(struct client *client, bool ssl)
        input.username = "";
 
        if (mail_storage_service_read_settings(storage_service, &input,
-                                              &client->set_parser, &error) < 0)
+                                              &client->set_instance, &error) < 0)
                i_fatal("%s", error);
 
-       /* create raw user before duplicating the settings parser */
        client->raw_mail_user =
-               raw_storage_create_from_set(storage_service, client->set_parser);
+               raw_storage_create_from_set(storage_service, client->set_instance);
 
        const struct var_expand_table *tab =
                mail_storage_service_get_var_expand_table(storage_service, &input);
 
        struct event *event = event_create(client->event);
        event_set_ptr(event, MASTER_SERVICE_VAR_EXPAND_TABLE, (void *)tab);
-       if (master_service_settings_parser_get(event, client->set_parser,
+       if (master_service_settings_instance_get(event, client->set_instance,
                        &lda_setting_parser_info, 0,
                        &client->lda_set, &error) < 0 ||
-           master_service_settings_parser_get(event, client->set_parser,
+           master_service_settings_instance_get(event, client->set_instance,
                        &lmtp_setting_parser_info, 0,
                        &client->lmtp_set, &error) < 0)
                i_fatal("%s", error);
@@ -266,7 +265,7 @@ client_default_destroy(struct client *client)
 
        client_state_reset(client);
 
-       settings_parser_unref(&client->set_parser);
+       master_service_settings_instance_free(&client->set_instance);
        master_service_settings_free(client->lda_set);
        master_service_settings_free(client->lmtp_set);
        event_unref(&client->event);
index dd83350d0014b459bfa6a85f319c7b8af4442cdf..49397cd7bf11fbed84a6211cb30d08bef6bb7234 100644 (file)
@@ -72,7 +72,7 @@ struct client {
        struct lmtp_client_vfuncs v;
        struct event *event;
 
-       struct setting_parser_context *set_parser;
+       struct master_service_settings_instance *set_instance;
        const struct lda_settings *lda_set;
        const struct lmtp_settings *lmtp_set;
 
index e5a1df5a2c8a481bcba0084d194ae637f12a6276..6e03004d2aaaf150359890615637dbb033cf4966 100644 (file)
@@ -344,9 +344,9 @@ int lmtp_local_rcpt(struct client *client,
        lrcpt->type = LMTP_RECIPIENT_TYPE_LOCAL;
        lrcpt->backend_context = llrcpt;
 
-       struct setting_parser_context *set_parser =
-               mail_storage_service_user_get_settings_parser(service_user);
-       if (master_service_settings_parser_get(rcpt->event, set_parser,
+       struct master_service_settings_instance *set_instance =
+               mail_storage_service_user_get_settings_instance(service_user);
+       if (master_service_settings_instance_get(rcpt->event, set_instance,
                        &lda_setting_parser_info,
                        0, &llrcpt->lda_set, &error) < 0) {
                e_error(rcpt->event, "%s", error);
@@ -437,15 +437,15 @@ lmtp_local_deliver(struct lmtp_local *local,
        const struct mail_storage_settings *mail_set;
        struct smtp_proxy_data proxy_data;
        struct mail_namespace *ns;
-       struct setting_parser_context *set_parser;
+       struct master_service_settings_instance *set_instance;
        const char *error, *username;
        int ret;
 
        input = mail_storage_service_user_get_input(service_user);
        username = t_strdup(input->username);
 
-       set_parser = mail_storage_service_user_get_settings_parser(service_user);
-       if (master_service_settings_parser_get(rcpt->event, set_parser,
+       set_instance = mail_storage_service_user_get_settings_instance(service_user);
+       if (master_service_settings_instance_get(rcpt->event, set_instance,
                        &mail_storage_setting_parser_info,
                        MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
                        &mail_set, &error) < 0) {
@@ -464,12 +464,12 @@ lmtp_local_deliver(struct lmtp_local *local,
                   advertised that it's going to timeout the connection.
                   this avoids duplicate deliveries in case the delivery
                   succeeds after the proxy has already disconnected from us. */
-               struct setting_parser_context *set_parser =
-                       mail_storage_service_user_get_settings_parser(service_user);
+               struct master_service_settings_instance *set_instance =
+                       mail_storage_service_user_get_settings_instance(service_user);
                const char *value = t_strdup_printf("%us",
                                       proxy_data.timeout_secs <= 1 ? 1 :
                                       proxy_data.timeout_secs-1);
-               if (master_service_set(set_parser, "mail_max_lock_timeout",
+               if (master_service_set(set_instance, "mail_max_lock_timeout",
                                       value, &error) <= 0)
                        i_unreached();
        }
@@ -500,8 +500,8 @@ lmtp_local_deliver(struct lmtp_local *local,
                mail_storage_service_user_get_log_prefix(service_user));
 
        lldctx.rcpt_user = rcpt_user;
-       if (master_service_settings_parser_get(rcpt_user->event,
-                       rcpt_user->set_parser,
+       if (master_service_settings_instance_get(rcpt_user->event,
+                       rcpt_user->set_instance,
                        &smtp_submit_setting_parser_info, 0,
                        &lldctx.smtp_set, &error) < 0) {
                e_error(rcpt->event, "%s", error);
index 7e4d5a9628fe24f6f3f47e7285efca3bda884db3..543eb9519ee358678011f64f1a574e78ade42a53 100644 (file)
@@ -289,7 +289,7 @@ static void main_init(void)
                NULL
        };
        struct mail_storage_service_input input;
-       struct setting_parser_context *set_parser;
+       struct master_service_settings_instance *set_instance;
        const struct mail_storage_settings *mail_set;
        const char *value, *error;
 
@@ -306,11 +306,11 @@ static void main_init(void)
        input.username = "";
 
        if (mail_storage_service_read_settings(storage_service, &input,
-                                              &set_parser,
+                                              &set_instance,
                                               &error) < 0)
                i_fatal("%s", error);
 
-       if (master_service_settings_parser_get(NULL, set_parser,
+       if (master_service_settings_instance_get(NULL, set_instance,
                        &mail_storage_setting_parser_info,
                        MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
                        &mail_set, &error) < 0)
@@ -321,7 +321,7 @@ static void main_init(void)
        value = mail_user_set_plugin_getenv(mail_set, "quota_status_nouser");
        nouser_reply = i_strdup(value != NULL ? value : "REJECT Unknown user");
        master_service_settings_free(mail_set);
-       settings_parser_unref(&set_parser);
+       master_service_settings_instance_free(&set_instance);
 }
 
 static void main_deinit(void)
index 5cead708022d910fdc1faea95d22e85d442ce7cc..a03f46fc55110c7b13b95313ba7e5d96dc0d2ae7 100644 (file)
@@ -147,8 +147,8 @@ client_create_from_input(const struct mail_storage_service_input *input,
        }
        restrict_access_allow_coredumps(TRUE);
 
-       if (master_service_settings_parser_get(mail_user->event,
-                       mail_user->set_parser,
+       if (master_service_settings_instance_get(mail_user->event,
+                       mail_user->set_instance,
                        &pop3_setting_parser_info, 0, &set, error_r) < 0) {
                if (write(fd_out, lookup_error_str, strlen(lookup_error_str)) < 0) {
                        /* ignored */
index b7e36d973719e8a7852a13bb81ec1b2af01628d4..ddbe745c869e5213b656a2b1de22cdcb373a0f49 100644 (file)
@@ -191,9 +191,10 @@ client_create_from_input(const struct mail_storage_service_input *input,
 
        restrict_access_allow_coredumps(TRUE);
 
-       if (master_service_settings_parser_get(mail_user->event,
-                       mail_user->set_parser, &submission_setting_parser_info,
-                       0, &set, error_r) < 0) {
+       if (master_service_settings_instance_get(mail_user->event,
+                       mail_user->set_instance,
+                       &submission_setting_parser_info, 0,
+                       &set, error_r) < 0) {
                send_error(fd_out, event, my_hostname,
                        "4.7.0", MAIL_ERRSTR_CRITICAL_MSG);
                mail_user_deinit(&mail_user);