config-request.c revision 1358e2c58ce29231485a5cfa454756d429ad3d2c
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen/* Copyright (C) 2005-2009 Dovecot authors, see the included COPYING file */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenstatic bool parsers_are_connected(struct setting_parser_info *root,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* we're trying to find info or its parents from root's dependencies. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen for (dep = root->dependencies; *dep != NULL; dep++) {
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenconfig_setting_parser_is_in_service(const struct config_setting_parser_list *list,
72f67d7d7681934bb3d4baaea1d88f79521dee3dTimo Sirainen if (list->root == &master_service_setting_parser_info) {
72f67d7d7681934bb3d4baaea1d88f79521dee3dTimo Sirainen /* everyone wants master service settings */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen for (l = config_setting_parsers; l->module_name != NULL; l++) {
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* see if we can find a way to get from the original parser
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen to this parser */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen if (parsers_are_connected(l->root, list->root))
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenstatic void settings_export(struct settings_export_context *ctx,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const void *set)
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char *str;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen for (def = info->defines; def->key != NULL; def++) {
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen default_value = info->defaults == NULL ? NULL :
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen CONST_PTR_OFFSET(info->defaults, def->offset);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const bool *val = value, *dval = default_value;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const unsigned int *val = value, *dval = default_value;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char *dval = _dval == NULL ? NULL : *_dval;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen null_strcmp(sval, dval) != 0) && sval != NULL)
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char *dval = _dval == NULL ? NULL : *_dval;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen null_strcmp(*val, dval) != 0) && *val != NULL)
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char *dval = _dval == NULL ? NULL : *_dval;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen for (i = 0; i < count; i++) {
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char *const *strings;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen key = p_strconcat(ctx->pool, str_c(ctx->prefix),
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen if (hash_table_lookup(ctx->keys, key) != NULL) {
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* already added all of these */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen str = p_strdup_printf(ctx->pool, "%s%s%c0%c%s",
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen key = p_strconcat(ctx->pool, str_c(ctx->prefix),
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen if (hash_table_lookup(ctx->keys, key) == NULL) {
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen for (i = 0; i < count; i++) {
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen str_append_c(ctx->prefix, SETTINGS_SEPARATOR);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen str_append_c(ctx->prefix, SETTINGS_SEPARATOR);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen settings_export(ctx, def->list_info, children[i]);
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainenvoid config_request_handle(const struct config_filter *filter,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen const char *module, enum config_dump_flags flags,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen config_request_callback_t *callback, void *context)
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen ctx.pool = pool_alloconly_create("config request", 10240);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen ctx.export_defaults = (flags & CONFIG_DUMP_FLAG_DEFAULTS) != 0;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen ctx.keys = hash_table_create(default_pool, ctx.pool, 0,
1358e2c58ce29231485a5cfa454756d429ad3d2cTimo Sirainen l = config_filter_match_parsers(config_filter, filter);