From: Timo Sirainen Date: Tue, 8 Apr 2025 11:03:49 +0000 (+0300) Subject: lib-master, global: Split MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS into separate flags X-Git-Tag: 2.4.2~807 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ae1f00739a970c5a8b752ba6dc6bd5f4cc999be;p=thirdparty%2Fdovecot%2Fcore.git lib-master, global: Split MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS into separate flags Use MASTER_SERVICE_FLAG_CONFIG_BUILTIN for unit tests and MASTER_SERVICE_FLAG_CONFIG_DEFAULTS for getting defaults via doveconf. --- diff --git a/src/auth/test-auth-client.c b/src/auth/test-auth-client.c index 00b0f69058..6b2b5cad9c 100644 --- a/src/auth/test-auth-client.c +++ b/src/auth/test-auth-client.c @@ -78,7 +78,7 @@ int main(int argc, char *argv[]) NULL }; const enum master_service_flags service_flags = - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT | MASTER_SERVICE_FLAG_DONT_SEND_STATS; diff --git a/src/auth/test-auth-master.c b/src/auth/test-auth-master.c index 4b745787b7..f0440cf137 100644 --- a/src/auth/test-auth-master.c +++ b/src/auth/test-auth-master.c @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) NULL }; const enum master_service_flags service_flags = - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT | MASTER_SERVICE_FLAG_DONT_SEND_STATS; diff --git a/src/auth/test-main.c b/src/auth/test-main.c index d82f44f7ef..dedffbea39 100644 --- a/src/auth/test-main.c +++ b/src/auth/test-main.c @@ -13,7 +13,7 @@ int main(int argc, char *argv[]) { const char *match = ""; const enum master_service_flags service_flags = - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT | MASTER_SERVICE_FLAG_DONT_SEND_STATS; diff --git a/src/auth/test-mech.c b/src/auth/test-mech.c index b923c95af6..235102ac76 100644 --- a/src/auth/test-mech.c +++ b/src/auth/test-mech.c @@ -354,7 +354,7 @@ int main(int argc, char *argv[]) NULL }; const enum master_service_flags service_flags = - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT | MASTER_SERVICE_FLAG_DONT_SEND_STATS; diff --git a/src/config/config-parser.c b/src/config/config-parser.c index 91a8e93d51..bddfd73215 100644 --- a/src/config/config-parser.c +++ b/src/config/config-parser.c @@ -3010,6 +3010,13 @@ int config_parse_file(const char *path, enum config_parse_flags flags, if (fd != -1) { if (config_parser_add_seen_file_fd(&ctx, fd, path, error_r) < 0) return -1; + } else { + /* stat contents don't matter for defaults, as long as they + don't change. */ + struct stat st; + i_zero(&st); + config_parser_add_seen_file(&ctx, &st, + MASTER_SERVICE_BINARY_CONFIG_DEFAULTS); } for (count = 0; all_infos[count] != NULL; count++) ; diff --git a/src/imap/test-imap-client-hibernate.c b/src/imap/test-imap-client-hibernate.c index d87e71bec4..1c04d26aef 100644 --- a/src/imap/test-imap-client-hibernate.c +++ b/src/imap/test-imap-client-hibernate.c @@ -308,7 +308,7 @@ static const struct setting_parser_info test_service_setting_parser_info = { int main(int argc, char *argv[]) { const enum master_service_flags service_flags = - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT | MASTER_SERVICE_FLAG_DONT_SEND_STATS; diff --git a/src/lib-lua/test-lua-http-client.c b/src/lib-lua/test-lua-http-client.c index 37cf91bc1d..345a03229a 100644 --- a/src/lib-lua/test-lua-http-client.c +++ b/src/lib-lua/test-lua-http-client.c @@ -783,7 +783,7 @@ static void main_deinit(void) int main(int argc, char *argv[]) { const enum master_service_flags service_flags = - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT | MASTER_SERVICE_FLAG_DONT_SEND_STATS; diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 162f34dbef..7936b9dc5e 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -257,8 +257,12 @@ master_service_exec_config(struct master_service *service, t_array_init(&conf_argv, 11 + (service->argc + 1) + 1); strarr_push(&conf_argv, DOVECOT_CONFIG_BIN_PATH); - strarr_push(&conf_argv, "-c"); - strarr_push(&conf_argv, service->config_path); + if ((service->flags & MASTER_SERVICE_FLAG_CONFIG_DEFAULTS) != 0) + strarr_push(&conf_argv, "-d"); + else { + strarr_push(&conf_argv, "-c"); + strarr_push(&conf_argv, service->config_path); + } if (input->check_full_config) strarr_push(&conf_argv, "-C"); @@ -344,14 +348,23 @@ master_service_open_config(struct master_service *service, const char *path; int fd = -1; + if ((service->flags & MASTER_SERVICE_FLAG_CONFIG_DEFAULTS) != 0) + path = MASTER_SERVICE_BINARY_CONFIG_DEFAULTS; + else if (input->config_path != NULL) + path = input->config_path; + else + path = master_service_get_config_path(service); + *path_r = path; *cached_config_r = FALSE; - *path_r = path = input->config_path != NULL ? input->config_path : - master_service_get_config_path(service); + if ((fd = master_service_binary_config_cache_get(cache_dir, path)) != -1) { *cached_config_r = TRUE; return fd; } + if ((service->flags & MASTER_SERVICE_FLAG_CONFIG_DEFAULTS) != 0) + master_service_exec_config(service, input); + if (!service->config_path_from_master && !service->config_path_changed_with_param && !input->always_exec && @@ -485,7 +498,7 @@ master_service_settings_read_int(struct master_service *service, if (str_to_int(value, &fd) < 0 || fd < 0) i_fatal("Invalid "DOVECOT_CONFIG_FD_ENV": %s", value); path = t_strdup_printf("<"DOVECOT_CONFIG_FD_ENV" %d>", fd); - } else if ((service->flags & MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS) == 0) { + } else if ((service->flags & MASTER_SERVICE_FLAG_CONFIG_BUILTIN) == 0) { /* Open config via socket if possible. If it doesn't work, execute doveconf -F. */ T_BEGIN { diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index e993138e8a..89944d7bd0 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -1,6 +1,8 @@ #ifndef MASTER_SERVICE_SETTINGS_H #define MASTER_SERVICE_SETTINGS_H +#define MASTER_SERVICE_BINARY_CONFIG_DEFAULTS "" + /* */ #ifdef DOVECOT_PRO_EDITION # define VERBOSE_PROCTITLE_DEFAULT TRUE diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index a18cb39dbe..d1553da7bf 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -885,7 +885,7 @@ bool master_service_parse_option(struct master_service *service, array_push_back(&service->config_overrides, &arg); break; case 'O': - service->flags |= MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS; + service->flags |= MASTER_SERVICE_FLAG_CONFIG_DEFAULTS; break; case 'L': service->log_directly = TRUE; diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 1dca3a6403..9ee6af923b 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -18,8 +18,12 @@ enum master_service_flags { /* Log to configured log file instead of stderr. By default when _FLAG_STANDALONE is set, logging is done to stderr. */ MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR = 0x04, - /* Don't read settings, but use whatever is in environment */ - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS = 0x10, + /* Use only default settings (by executing doveconf -dF) */ + MASTER_SERVICE_FLAG_CONFIG_DEFAULTS = 0x10, + /* Use only built-in settings (do not execute doveconf). If any + settings are overridden, their infos must be registered with + settings_info_register(). Used by unit tests. */ + MASTER_SERVICE_FLAG_CONFIG_BUILTIN = 0x20, /* Use MASTER_LOGIN_NOTIFY_FD to track login overflow state */ MASTER_SERVICE_FLAG_TRACK_LOGIN_STATE = 0x40, /* If master sends SIGINT, don't die even if we don't have clients */ diff --git a/src/lib-storage/test-mail-storage.c b/src/lib-storage/test-mail-storage.c index 25fd192840..d5adfeb597 100644 --- a/src/lib-storage/test-mail-storage.c +++ b/src/lib-storage/test-mail-storage.c @@ -743,7 +743,7 @@ int main(int argc, char **argv) master_service = master_service_init("test-mail-storage", MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_DONT_SEND_STATS | - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_NO_SSL_INIT | MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME, &argc, &argv, ""); diff --git a/src/lib-storage/test-mail.c b/src/lib-storage/test-mail.c index 3c8f75c49a..367fbf157d 100644 --- a/src/lib-storage/test-mail.c +++ b/src/lib-storage/test-mail.c @@ -743,7 +743,7 @@ int main(int argc, char **argv) master_service = master_service_init("test-mail", MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_DONT_SEND_STATS | - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_NO_SSL_INIT | MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME, &argc, &argv, ""); diff --git a/src/plugins/mail-crypt/test-mail-key.c b/src/plugins/mail-crypt/test-mail-key.c index 756264079e..a99b0cc852 100644 --- a/src/plugins/mail-crypt/test-mail-key.c +++ b/src/plugins/mail-crypt/test-mail-key.c @@ -423,7 +423,7 @@ int main(int argc, char **argv) master_service = master_service_init("test-mail-key", MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_DONT_SEND_STATS | - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS | + MASTER_SERVICE_FLAG_CONFIG_BUILTIN | MASTER_SERVICE_FLAG_NO_SSL_INIT | MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME, &argc, &argv, ""); diff --git a/src/util/test-fs.c b/src/util/test-fs.c index d0bf7470c5..61c27b1488 100644 --- a/src/util/test-fs.c +++ b/src/util/test-fs.c @@ -382,7 +382,7 @@ int main(int argc, char *argv[]) params.base_dir = PKG_RUNDIR; master_service = master_service_init("test-fs", MASTER_SERVICE_FLAG_STANDALONE | - MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS, + MASTER_SERVICE_FLAG_CONFIG_DEFAULTS, &argc, &argv, "Daf:p:st:u:"); while ((c = master_getopt(master_service)) > 0) { switch (c) {