diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-04-18 14:24:22 -0400 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-04-18 14:24:22 -0400 |
| commit | fb2a88af049d3677a08fe824f8d163a75be78048 (patch) | |
| tree | b9a69d5afb9ba1a95b052f55a1d62afaf8535c40 /src | |
| parent | acf5c90ea58f30c017d7e40d55019d3fe27340f3 (diff) | |
- actually perform map initialization correctly
Diffstat (limited to 'src')
| -rw-r--r-- | src/backend.c | 208 |
1 files changed, 205 insertions, 3 deletions
diff --git a/src/backend.c b/src/backend.c index 521c386..4a93248 100644 --- a/src/backend.c +++ b/src/backend.c @@ -14,30 +14,232 @@ #include "backend.h" #include "plugin.h" +#include "map.h" +#include "defaults.h" + +/* Given a map/domain entry, add it to the map. */ +struct backend_map_entry_cb_data { + struct plugin_state *state; + const char *domain, *map, *key, *value; +}; + +static int +backend_map_entry_cb(Slapi_Entry *e, void *callback_data) +{ + struct backend_map_entry_cb_data *data; + char **key, **value, *dn; + int i, j; + data = callback_data; + key = slapi_entry_attr_get_charray(e, data->key); + value = slapi_entry_attr_get_charray(e, data->value); + dn = slapi_entry_get_dn(e); + for (i = 0; (key != NULL) && (key[i] != NULL); i++) { + for (j = 0; (value != NULL) && (value[j] != NULL); j++) { + slapi_log_error(SLAPI_LOG_PLUGIN, + data->state->plugin_desc->spd_id, + "setting domain/map/key/value " + "\"%s\"/\"%s\"/\"%s\"(\"%s\")=\"%s\"\n", + data->domain, data->map, + key[i], dn, value[j]); + map_data_set_entry(data->state, data->domain, data->map, + dn, + -1, strdup(key[i]), + -1, strdup(value[j])); + } + if (j == 0) { + slapi_log_error(SLAPI_LOG_PLUGIN, + data->state->plugin_desc->spd_id, + "no value for %s\n", dn); + } + } + if (i == 0) { + slapi_log_error(SLAPI_LOG_PLUGIN, + data->state->plugin_desc->spd_id, + "no key for %s\n", dn); + } + slapi_ch_array_free(value); + slapi_ch_array_free(key); + return 0; +} + +static char * +backend_map_config_filter(const char *fmt, const char *domain, const char *map) +{ + char *ret; + int i, j, l; + l = 0; + for (i = 0; fmt[i] != '\0'; i++) { + if (fmt[i] == '%') { + switch (fmt[i + 1]) { + case 'd': + l += strlen(domain); + i++; + break; + case 'm': + l += strlen(map); + i++; + break; + case '%': + l++; + i++; + break; + default: + l++; + break; + } + } else { + l++; + } + } + ret = malloc(l + 1); + for (i = j = 0; fmt[i] != '\0'; i++) { + if (fmt[i] == '%') { + switch (fmt[i + 1]) { + case 'd': + strcpy(ret + j, domain); + i++; + j += strlen(domain); + break; + case 'm': + strcpy(ret + j, map); + i++; + j += strlen(map); + break; + case '%': + i++; + ret[j++] = fmt[i]; + break; + default: + ret[j++] = fmt[i]; + break; + } + } else { + ret[j++] = fmt[i]; + } + } + return ret; +} + +static int +backend_map_config_entry(struct plugin_state *state, Slapi_Entry *e, + const char *domain, const char *map) +{ + Slapi_PBlock *pb; + char **base; + int i, scope; + char *entry_filter, *use_entry_filter, *key_attribute, *value_attribute; + const char *use_key_attribute, *use_value_attribute; + char *attrs[3]; /* XXX */ + struct backend_map_entry_cb_data cb_data; + + pb = slapi_pblock_new(); + base = slapi_entry_attr_get_charray(e, "base"); + entry_filter = slapi_entry_attr_get_charptr(e, "filter"); + key_attribute = slapi_entry_attr_get_charptr(e, "key"); + value_attribute = slapi_entry_attr_get_charptr(e, "value"); + use_entry_filter = backend_map_config_filter(entry_filter ? + entry_filter : + DEFAULT_ENTRY_FILTER, + domain, map); + use_key_attribute = key_attribute ? + key_attribute : + DEFAULT_KEY_ATTRIBUTE; + use_value_attribute = value_attribute ? + value_attribute : + DEFAULT_VALUE_ATTRIBUTE; + attrs[0] = (char *) use_key_attribute; /* XXX */ + attrs[1] = (char *) use_value_attribute; /* XXX */ + attrs[2] = NULL; /* XXX */ + scope = LDAP_SCOPE_SUB; + cb_data.state = state; + cb_data.domain = domain; + cb_data.map = map; + cb_data.key = use_key_attribute; + cb_data.value = use_value_attribute; + slapi_log_error(SLAPI_LOG_PLUGIN, + state->plugin_desc->spd_id, + "initializing map %s in %s (2)\n", + map, domain); + map_data_set_map(state, domain, map); + map_data_clear_map(state, domain, map); + for (i = 0; (base != NULL) && (base[i] != NULL); i++) { + slapi_log_error(SLAPI_LOG_PLUGIN, + state->plugin_desc->spd_id, + "searching %s for %s\n", + base[i], entry_filter); + slapi_search_internal_set_pb(pb, + base[i], + scope, + use_entry_filter, + attrs, 0, + NULL, + NULL, + state->plugin_identity, + 0); + slapi_search_internal_callback_pb(pb, &cb_data, + NULL, + backend_map_entry_cb, + NULL); + slapi_free_search_results_internal(pb); + } + free(use_entry_filter); + slapi_ch_free_string(&value_attribute); + slapi_ch_free_string(&key_attribute); + slapi_ch_free_string(&entry_filter); + slapi_ch_array_free(base); + slapi_pblock_destroy(pb); + return 0; +} static int backend_map_config_entry_cb(Slapi_Entry *e, void *callback_data) { + char **domains, **maps; + int i, j, ret; + struct plugin_state *state; + + state = callback_data; + domains = slapi_entry_attr_get_charray(e, "domain"); + maps = slapi_entry_attr_get_charray(e, "map"); + for (i = 0; (domains != NULL) && (domains[i] != NULL); i++) { + for (j = 0; (maps != NULL) && (maps[j] != NULL); j++) { + slapi_log_error(SLAPI_LOG_PLUGIN, + state->plugin_desc->spd_id, + "initializing map %s in %s\n", + maps[j], domains[i]); + ret = backend_map_config_entry(state, e, + domains[i], + maps[j]); + } + } + slapi_ch_array_free(maps); + slapi_ch_array_free(domains); return 0; } +/* Scan for the list of configured domains and maps. */ void backend_init(struct plugin_state *state) { Slapi_PBlock *pb; + char *attrs = NULL; pb = slapi_pblock_new(); + slapi_log_error(SLAPI_LOG_PLUGIN, + state->plugin_desc->spd_id, + "searching for maps"); slapi_search_internal_set_pb(pb, "cn=NIS Server, cn=Plugins, cn=config", LDAP_SCOPE_ONE, - NULL, + "(objectclass=*)", NULL, 0, NULL, - state->plugin_desc->spd_id, + NULL, state->plugin_identity, 0); - slapi_search_internal_callback_pb(pb, NULL, + slapi_search_internal_callback_pb(pb, state, NULL, backend_map_config_entry_cb, NULL); + slapi_free_search_results_internal(pb); slapi_pblock_destroy(pb); } |
