From: Timo Sirainen Date: Tue, 7 Feb 2023 23:27:54 +0000 (+0200) Subject: lib-master, global: Introduce master_service_settings_instance X-Git-Tag: 2.4.0~2250 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d9ed9f89366fa79f681ec6e33deafef6863aad2;p=thirdparty%2Fdovecot%2Fcore.git lib-master, global: Introduce master_service_settings_instance This commit mainly consists of renaming "settings parser" to "settings instance" in various variables and function names. The following commits make it more useful. --- diff --git a/src/doveadm/doveadm-dsync.c b/src/doveadm/doveadm-dsync.c index 2a7ad1c897..ad122494f4 100644 --- a/src/doveadm/doveadm-dsync.c +++ b/src/doveadm/doveadm-dsync.c @@ -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, diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 6ceb262f95..df1552c7ef 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -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; diff --git a/src/imap-urlauth/imap-urlauth-worker.c b/src/imap-urlauth/imap-urlauth-worker.c index d0c8159141..06edea35ac 100644 --- a/src/imap-urlauth/imap-urlauth-worker.c +++ b/src/imap-urlauth/imap-urlauth-worker.c @@ -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); diff --git a/src/imap/main.c b/src/imap/main.c index 95ccc3e687..05baf4aa86 100644 --- a/src/imap/main.c +++ b/src/imap/main.c @@ -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); diff --git a/src/lda/main.c b/src/lda/main.c index b0c89c9609..b1197eb0ac 100644 --- a/src/lda/main.c +++ b/src/lda/main.c @@ -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); diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 67068b822b..4859d480a4 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -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); +} diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index c8bc0878cd..15a43b85ae 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -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 diff --git a/src/lib-storage/index/dbox-multi/mdbox-storage.c b/src/lib-storage/index/dbox-multi/mdbox-storage.c index 75a5999208..a5fad241d4 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-storage.c +++ b/src/lib-storage/index/dbox-multi/mdbox-storage.c @@ -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; diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 8d8b87da30..576c1aa113 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -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; diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index bb0b104c63..635e94ecb3 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -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; diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index 7b2a3b98c9..b7ead523cd 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -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; diff --git a/src/lib-storage/index/pop3c/pop3c-storage.c b/src/lib-storage/index/pop3c/pop3c-storage.c index bc0961611e..be930a0231 100644 --- a/src/lib-storage/index/pop3c/pop3c-storage.c +++ b/src/lib-storage/index/pop3c/pop3c-storage.c @@ -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; diff --git a/src/lib-storage/index/raw/raw-storage.c b/src/lib-storage/index/raw/raw-storage.c index f7ad949a24..9bc835e57e 100644 --- a/src/lib-storage/index/raw/raw-storage.c +++ b/src/lib-storage/index/raw/raw-storage.c @@ -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, diff --git a/src/lib-storage/index/raw/raw-storage.h b/src/lib-storage/index/raw/raw-storage.h index f366cae60f..70fe423c7c 100644 --- a/src/lib-storage/index/raw/raw-storage.h +++ b/src/lib-storage/index/raw/raw-storage.h @@ -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, diff --git a/src/lib-storage/index/shared/shared-storage.c b/src/lib-storage/index/shared/shared-storage.c index 3445758df8..348bacbf9a 100644 --- a/src/lib-storage/index/shared/shared-storage.c +++ b/src/lib-storage/index/shared/shared-storage.c @@ -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, diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 0dcd1b10b7..3a80cacbde 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -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, diff --git a/src/lib-storage/mail-storage-service.h b/src/lib-storage/mail-storage-service.h index 8333d2a37e..9c3b29b862 100644 --- a/src/lib-storage/mail-storage-service.h +++ b/src/lib-storage/mail-storage-service.h @@ -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); diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index b35e8be350..fe7fd9be38 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -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); diff --git a/src/lib-storage/mail-user.h b/src/lib-storage/mail-user.h index a34f0e6fe8..cddf8ec893 100644 --- a/src/lib-storage/mail-user.h +++ b/src/lib-storage/mail-user.h @@ -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; diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index 485e467e54..459791d70f 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -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); diff --git a/src/lmtp/lmtp-client.h b/src/lmtp/lmtp-client.h index dd83350d00..49397cd7bf 100644 --- a/src/lmtp/lmtp-client.h +++ b/src/lmtp/lmtp-client.h @@ -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; diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index e5a1df5a2c..6e03004d2a 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -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); diff --git a/src/plugins/quota/quota-status.c b/src/plugins/quota/quota-status.c index 7e4d5a9628..543eb9519e 100644 --- a/src/plugins/quota/quota-status.c +++ b/src/plugins/quota/quota-status.c @@ -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) diff --git a/src/pop3/main.c b/src/pop3/main.c index 5cead70802..a03f46fc55 100644 --- a/src/pop3/main.c +++ b/src/pop3/main.c @@ -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 */ diff --git a/src/submission/main.c b/src/submission/main.c index b7e36d9737..ddbe745c86 100644 --- a/src/submission/main.c +++ b/src/submission/main.c @@ -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);