Mercurial > dovecot > core-2.2
changeset 9239:1cb45d4389d4 HEAD
Binaries now take -o key=value parameters to override settings.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 06 May 2009 15:01:49 -0400 |
parents | c57038025171 |
children | 3e5c6e2367db |
files | src/lib-master/master-service-private.h src/lib-master/master-service-settings.c src/lib-master/master-service.c src/lib-settings/settings-parser.c src/lib-settings/settings-parser.h |
diffstat | 5 files changed, 57 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-master/master-service-private.h Wed May 06 14:58:31 2009 -0400 +++ b/src/lib-master/master-service-private.h Wed May 06 15:01:49 2009 -0400 @@ -23,6 +23,7 @@ const char *version_string; const char *config_path; int syslog_facility; + ARRAY_TYPE(const_string) config_overrides; unsigned int socket_count, ssl_socket_count; struct master_service_listener *listeners;
--- a/src/lib-master/master-service-settings.c Wed May 06 14:58:31 2009 -0400 +++ b/src/lib-master/master-service-settings.c Wed May 06 15:01:49 2009 -0400 @@ -121,6 +121,28 @@ return fd; } +static int +master_service_apply_config_overrides(struct master_service *service, + struct setting_parser_context *parser, + const char **error_r) +{ + const char *const *overrides; + unsigned int i, count; + + overrides = array_get(&service->config_overrides, &count); + for (i = 0; i < count; i++) { + if (settings_parse_line(parser, overrides[i]) < 0) { + *error_r = t_strdup_printf( + "Invalid -o parameter %s: %s", overrides[i], + settings_parser_get_error(parser)); + return -1; + } + settings_parse_set_key_expandeded(parser, service->set_pool, + t_strcut(overrides[i], '=')); + } + return 0; +} + int master_service_settings_read(struct master_service *service, const struct setting_parser_info *roots[], const struct dynamic_settings_parser *dyn_parsers, @@ -187,6 +209,12 @@ keys); } + if (array_is_created(&service->config_overrides)) { + if (master_service_apply_config_overrides(service, parser, + error_r) < 0) + return -1; + } + if (!settings_parser_check(parser, service->set_pool, &error)) { *error_r = t_strdup_printf("Invalid settings: %s", error); return -1;
--- a/src/lib-master/master-service.c Wed May 06 14:58:31 2009 -0400 +++ b/src/lib-master/master-service.c Wed May 06 15:01:49 2009 -0400 @@ -3,6 +3,7 @@ #include "lib.h" #include "lib-signals.h" #include "ioloop.h" +#include "array.h" #include "env-util.h" #include "home-expand.h" #include "restrict-access.h" @@ -30,7 +31,7 @@ const char *master_service_getopt_string(void) { - return "c:ks:L"; + return "c:ko:s:L"; } static void sig_die(const siginfo_t *si, void *context) @@ -183,6 +184,11 @@ case 'k': service->keep_environment = TRUE; break; + case 'o': + if (!array_is_created(&service->config_overrides)) + i_array_init(&service->config_overrides, 16); + array_append(&service->config_overrides, &arg, 1); + break; case 's': if ((i = atoi(arg)) < 0) i_fatal("Invalid socket count: %s", arg); @@ -420,6 +426,8 @@ io_remove(&service->io_status_error); if (service->io_status_write != NULL) io_remove(&service->io_status_write); + if (array_is_created(&service->config_overrides)) + array_free(&service->config_overrides); lib_signals_deinit(); io_loop_destroy(&service->ioloop);
--- a/src/lib-settings/settings-parser.c Wed May 06 14:58:31 2009 -0400 +++ b/src/lib-settings/settings-parser.c Wed May 06 15:01:49 2009 -0400 @@ -765,27 +765,32 @@ } } -void settings_parse_set_keys_expandeded(struct setting_parser_context *ctx, - pool_t pool, const char *const *keys) +void settings_parse_set_key_expandeded(struct setting_parser_context *ctx, + pool_t pool, const char *key) { const struct setting_define *def; struct setting_link *link; const char **val; - for (; *keys != NULL; keys++) { - if (!settings_find_key(ctx, *keys, &def, &link)) - continue; + if (!settings_find_key(ctx, key, &def, &link)) + return; - val = PTR_OFFSET(link->set_struct, def->offset); - if (def->type == SET_STR_VARS && *val != NULL) { - i_assert(**val == SETTING_STRVAR_UNEXPANDED[0] || - **val == SETTING_STRVAR_EXPANDED[0]); - *val = p_strconcat(pool, SETTING_STRVAR_EXPANDED, - *val + 1, NULL); - } + val = PTR_OFFSET(link->set_struct, def->offset); + if (def->type == SET_STR_VARS && *val != NULL) { + i_assert(**val == SETTING_STRVAR_UNEXPANDED[0] || + **val == SETTING_STRVAR_EXPANDED[0]); + *val = p_strconcat(pool, SETTING_STRVAR_EXPANDED, + *val + 1, NULL); } } +void settings_parse_set_keys_expandeded(struct setting_parser_context *ctx, + pool_t pool, const char *const *keys) +{ + for (; *keys != NULL; keys++) + settings_parse_set_key_expandeded(ctx, pool, *keys); +} + void settings_var_expand(const struct setting_parser_info *info, void *set, pool_t pool, const struct var_expand_table *table)
--- a/src/lib-settings/settings-parser.h Wed May 06 14:58:31 2009 -0400 +++ b/src/lib-settings/settings-parser.h Wed May 06 15:01:49 2009 -0400 @@ -129,6 +129,8 @@ void settings_parse_set_expanded(struct setting_parser_context *ctx, bool is_expanded); /* Mark all the parsed settings with given keys as being already expanded. */ +void settings_parse_set_key_expandeded(struct setting_parser_context *ctx, + pool_t pool, const char *key); void settings_parse_set_keys_expandeded(struct setting_parser_context *ctx, pool_t pool, const char *const *keys); /* Expand all unexpanded variables using the given table. Update the string