summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-09 17:38:50 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-09 17:38:50 -0400
commit85231a962d194bebd40357e9efc4a14859ff483d (patch)
treed04b65ceb55b763720cf417e4b94bdca02a47692 /src
parente678eda5091c418b8e0fde4a827ca35171bc178c (diff)
downloadslapi-nis-85231a962d194bebd40357e9efc4a14859ff483d.tar.gz
slapi-nis-85231a962d194bebd40357e9efc4a14859ff483d.tar.xz
slapi-nis-85231a962d194bebd40357e9efc4a14859ff483d.zip
- track the search base and filter for each map, too
Diffstat (limited to 'src')
-rw-r--r--src/backend.c81
1 files changed, 61 insertions, 20 deletions
diff --git a/src/backend.c b/src/backend.c
index 28f6275..adb81e9 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -20,33 +20,43 @@
/* The data we ask the map cache to keep, for us, for each map. */
struct backend_map_entry_cb_data {
struct plugin_state *state;
- char *domain, *map, *key_attr, *value_fmt;
+ char *domain, *map, **bases, *filter, *key_attr, *value_fmt;
};
-static struct backend_map_entry_cb_data *
-backend_copy_cb_data(const struct backend_map_entry_cb_data *data)
+static char **
+backend_dup_strlist(char **strlist)
{
- struct backend_map_entry_cb_data *ret;
- ret = malloc(sizeof(*ret));
- if (ret == NULL) {
+ int i, l;
+ char **ret, *s;
+ /* Handle the NULL case. */
+ if (strlist == NULL) {
return NULL;
}
- ret->state = data->state;
- ret->domain = strdup(data->domain);
- ret->map = strdup(data->map);
- ret->key_attr = strdup(data->key_attr);
- ret->value_fmt = strdup(data->value_fmt);
- if ((ret->domain == NULL) ||
- (ret->map == NULL) ||
- (ret->key_attr == NULL) ||
- (ret->value_fmt == NULL)) {
- free(ret->domain);
- free(ret->map);
- free(ret->key_attr);
- free(ret->value_fmt);
- free(ret);
+ /* Count the amount of space needed for the strings. */
+ for (i = 0, l = 0; (strlist[i] != NULL); i++) {
+ l += (strlen(strlist[i]) + 1);
+ }
+ /* No strings = no list. */
+ if (i == 0) {
return NULL;
}
+ /* Allocate space for the array of pointers (with NULL terminator) and
+ * then the string data. */
+ ret = malloc((i + 1) * sizeof(char *) + l);
+ if (ret != NULL) {
+ /* Figure out where the string data will start. */
+ s = (char *) &ret[i + 1];
+ for (i = 0; (strlist[i] != NULL); i++) {
+ /* Set the address of this string, copy the data
+ * around, and then prepare the address of the next
+ * string. */
+ ret[i] = s;
+ strcpy(s, strlist[i]);
+ s += (strlen(s) + 1);
+ }
+ /* NULL-terminate the array. */
+ ret[i] = NULL;
+ }
return ret;
}
@@ -57,12 +67,40 @@ backend_free_cb_data(void *data)
if (cb_data != NULL) {
free(cb_data->domain);
free(cb_data->map);
+ free(cb_data->bases);
+ free(cb_data->filter);
free(cb_data->key_attr);
free(cb_data->value_fmt);
free(cb_data);
}
}
+static struct backend_map_entry_cb_data *
+backend_copy_cb_data(const struct backend_map_entry_cb_data *data)
+{
+ struct backend_map_entry_cb_data *ret;
+ ret = malloc(sizeof(*ret));
+ if (ret == NULL) {
+ return NULL;
+ }
+ ret->state = data->state;
+ ret->domain = strdup(data->domain);
+ ret->map = strdup(data->map);
+ ret->bases = backend_dup_strlist(data->bases);
+ ret->filter = strdup(data->filter);
+ ret->key_attr = strdup(data->key_attr);
+ ret->value_fmt = strdup(data->value_fmt);
+ if ((ret->domain == NULL) ||
+ (ret->map == NULL) ||
+ (ret->bases == NULL) ||
+ (ret->filter == NULL) ||
+ (ret->key_attr == NULL) ||
+ (ret->value_fmt == NULL)) {
+ backend_free_cb_data(ret);
+ return NULL;
+ } return ret;
+}
+
/* Given a map-entry directory entry, determine which keys it should have,
* determine which value should be associated with those keys, and add them to
* the map cache. */
@@ -222,6 +260,8 @@ backend_map_config_entry(struct plugin_state *state, Slapi_Entry *e,
cb_data.map = (char *) map;
cb_data.key_attr = use_key_attribute;
cb_data.value_fmt = use_value_attribute;
+ cb_data.filter = use_entry_filter;
+ cb_data.bases = base;
slapi_log_error(SLAPI_LOG_PLUGIN,
state->plugin_desc->spd_id,
"initializing map %s in %s (2)\n",
@@ -330,6 +370,7 @@ backend_add_entry_cb(const char *domain, const char *map, void *backend_data,
struct backend_map_entry_cb_data *data;
data = backend_data;
dn = cbdata;
+ /* Decide if the directory server entry belongs in this map. */
return PR_TRUE;
}