diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-09 17:38:50 -0400 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-09 17:38:50 -0400 |
| commit | 85231a962d194bebd40357e9efc4a14859ff483d (patch) | |
| tree | d04b65ceb55b763720cf417e4b94bdca02a47692 /src | |
| parent | e678eda5091c418b8e0fde4a827ca35171bc178c (diff) | |
| download | slapi-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.c | 81 |
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; } |
