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;
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,
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;
#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"
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)
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);
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);
}
}
-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)
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