summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-04-18 14:24:22 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-04-18 14:24:22 -0400
commitfb2a88af049d3677a08fe824f8d163a75be78048 (patch)
treeb9a69d5afb9ba1a95b052f55a1d62afaf8535c40 /src
parentacf5c90ea58f30c017d7e40d55019d3fe27340f3 (diff)
- actually perform map initialization correctly
Diffstat (limited to 'src')
-rw-r--r--src/backend.c208
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);
}