config-request.c revision 50fe5e053d565b40b0ed2cc7a64b6b98971c0305
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch/* Copyright (C) 2005-2009 Dovecot authors, see the included COPYING file */
56d1345c43bbd28c36b7faa85e4163bd9e874290Timo Sirainenstatic bool parsers_are_connected(const struct setting_parser_info *root,
35e962a9186b4e9b2001628c1d7b55c24b33ce84Timo Sirainen const struct setting_parser_info *p;
b99130e4cf4af4e6b103b949456222f3a2dff424Timo Sirainen /* we're trying to find info or its parents from root's dependencies. */
4c4c4a740bbb1b674d4b0dae009d1919f8ad96b7Stephan Bosch for (dep = root->dependencies; *dep != NULL; dep++) {
7384b4e78eaab44693c985192276e31322155e32Stephan Boschconfig_module_parser_is_in_service(const struct config_module_parser *list,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (strcmp(list->root->module_name, module) == 0)
ad03049781fc14807248007d524be4daf06c3ee2Stephan Bosch if (list->root == &master_service_setting_parser_info) {
ad03049781fc14807248007d524be4daf06c3ee2Stephan Bosch /* everyone wants master service settings */
e47c2f17d8136c4d972d1074a3f84ba2ecef4fdcStephan Bosch for (l = config_module_parsers; l->root != NULL; l++) {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (strcmp(l->root->module_name, module) != 0)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* see if we can find a way to get from the original parser
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch to this parser */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (parsers_are_connected(l->root, list->root))
9d746c6785d17e421c3f3c74cf29d059ae2ab233Stephan Boschsettings_export(struct settings_export_context *ctx,
9d746c6785d17e421c3f3c74cf29d059ae2ab233Stephan Bosch const void *value, *default_value, *change_value;
fe2b0e3de834dd40b698bb579adc5357d5789ec9Stephan Bosch void *const *children = NULL, *const *change_children = NULL;
94d1b08c9e20d637db568a3eab3dfc2b9e96e62aStephan Bosch const char *str;
feba5e502b2131c9a1c766b7ef9ff041dbf71d1dStephan Bosch for (def = info->defines; def->key != NULL; def++) {
b66def5dadd3e7c250313a938d26ad113663f86bStephan Bosch default_value = info->defaults == NULL ? NULL :
b66def5dadd3e7c250313a938d26ad113663f86bStephan Bosch CONST_PTR_OFFSET(info->defaults, def->offset);
b66def5dadd3e7c250313a938d26ad113663f86bStephan Bosch change_value = CONST_PTR_OFFSET(change_set, def->offset);
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen dump_default = *((const char *)change_value) != 0;
70505f4839520ac67895992621c97d2480c22e7fTimo Sirainen (ctx->flags & CONFIG_DUMP_FLAG_HIDE_LIST_DEFAULTS) == 0) {
93cc87bb22386e020cee1093b6bd59295e0b33f0Stephan Bosch } else if (*((const char *)change_value) == 0 &&
93cc87bb22386e020cee1093b6bd59295e0b33f0Stephan Bosch /* this is mainly for service {} blocks. if value
93cc87bb22386e020cee1093b6bd59295e0b33f0Stephan Bosch hasn't changed, it's the default. even if
93cc87bb22386e020cee1093b6bd59295e0b33f0Stephan Bosch info->defaults has a different value. */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch /* value is set explicitly, but we don't know the
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch default here. assume it's not the default. */
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch const bool *val = value, *dval = default_value;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch if (dump_default || dval == NULL || *val != *dval) {
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch const unsigned int *val = value, *dval = default_value;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch if (dump_default || dval == NULL || *val != *dval)
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch const char *dval = _dval == NULL ? NULL : *_dval;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch if ((dump_default || null_strcmp(sval, dval) != 0) &&
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch const char *dval = _dval == NULL ? NULL : *_dval;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch if ((dump_default || null_strcmp(*val, dval) != 0) &&
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch const char *dval = _dval == NULL ? NULL : *_dval;
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch if (dump_default || strncmp(*val, dval, len) != 0 ||
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const ARRAY_TYPE(void_array) *change_val = change_value;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch for (i = 0; i < count; i++) {
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch change_children = array_get(change_val, &count2);
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch const char *const *strings;
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch key = p_strconcat(ctx->pool, str_c(ctx->prefix),
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch if (hash_table_lookup(ctx->keys, key) != NULL) {
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch /* already added all of these */
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch ctx->callback(key, "0", CONFIG_KEY_LIST, ctx->context);
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch str = p_strdup_printf(ctx->pool, "%s%s%c0%c%s",
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch key = p_strconcat(ctx->pool, str_c(ctx->prefix),
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Bosch if (hash_table_lookup(ctx->keys, key) == NULL) {
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch for (i = 0; i < count; i++) {
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch str_append_c(ctx->prefix, SETTINGS_SEPARATOR);
6d573191bea1a64d6046be070487a5705a2d0204Stephan Bosch str_append_c(ctx->prefix, SETTINGS_SEPARATOR);
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Boschint config_request_handle(const struct config_filter *filter,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *module, enum config_dump_scope scope,
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch config_request_callback_t *callback, void *context)
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch struct config_module_parser *parsers, *parser;
7a13cd2268a5a99d2975a1648d6d14ffe1b6ccb0Stephan Bosch unsigned int i;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch ctx.pool = pool_alloconly_create("config request", 1024*32);
b66def5dadd3e7c250313a938d26ad113663f86bStephan Bosch if (config_filter_parsers_get(config_filter, ctx.pool, filter,
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch ctx.keys = hash_table_create(default_pool, ctx.pool, 0,
de0181258ab66b527ad8dc7e51a8efa76b4658d0Stephan Bosch !config_module_parser_is_in_service(parser, module))
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch if ((flags & CONFIG_DUMP_FLAG_CHECK_SETTINGS) != 0) {