From: Timo Sirainen Date: Wed, 6 May 2009 19:01:49 +0000 (-0400) Subject: Binaries now take -o key=value parameters to override settings. X-Git-Tag: 2.0.alpha1~813 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d39a04db2f4d0599cb9b5f03a9aa10a3c234453c;p=thirdparty%2Fdovecot%2Fcore.git Binaries now take -o key=value parameters to override settings. --HG-- branch : HEAD --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index e9e4812156..de5332ec79 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -23,6 +23,7 @@ struct master_service { 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; diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 350e70be54..d3a90e1a15 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -121,6 +121,28 @@ master_service_read_config(struct master_service *service, bool preserve_home, 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 @@ int master_service_settings_read(struct master_service *service, 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; diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 34fd7f8bd5..27b8ea73df 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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 @@ static void master_status_update(struct master_service *service); 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 @@ bool master_service_parse_option(struct master_service *service, 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 @@ void master_service_deinit(struct master_service **_service) 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); diff --git a/src/lib-settings/settings-parser.c b/src/lib-settings/settings-parser.c index fd1754ba69..50bfba110f 100644 --- a/src/lib-settings/settings-parser.c +++ b/src/lib-settings/settings-parser.c @@ -765,27 +765,32 @@ settings_var_expand_info(const struct setting_parser_info *info, } } -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) diff --git a/src/lib-settings/settings-parser.h b/src/lib-settings/settings-parser.h index e7e732fe33..781c265c82 100644 --- a/src/lib-settings/settings-parser.h +++ b/src/lib-settings/settings-parser.h @@ -129,6 +129,8 @@ bool settings_parser_check(struct setting_parser_context *ctx, pool_t pool, 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