diff options
Diffstat (limited to 'src/backend.c')
-rw-r--r-- | src/backend.c | 121 |
1 files changed, 75 insertions, 46 deletions
diff --git a/src/backend.c b/src/backend.c index 393cc9d..a6946a1 100644 --- a/src/backend.c +++ b/src/backend.c @@ -55,7 +55,9 @@ /* The data we ask the map cache to keep, for us, for each map. */ struct backend_map_data { struct plugin_state *state; - char *domain, *map, **bases, *entry_filter, *key_format, *value_format; + char *domain, *map, **bases, *entry_filter, **key_formats; + char *value_format; + int n_key_formats; char **ref_attrs; struct format_inref_attr **inref_attrs; }; @@ -120,6 +122,17 @@ backend_read_master_name(struct plugin_state *state, char **master) slapi_entry_free(config); return (*master != NULL) ? 0 : -1; } +static void +backend_free_strlist(char **strlist) +{ + int i; + if (strlist) { + for (i = 0; strlist[i] != NULL; i++) { + free(strlist[i]); + } + free(strlist); + } +} static char ** backend_dup_strlist(char **strlist) { @@ -168,7 +181,7 @@ backend_free_map_data_contents(void *data) format_free_attr_list(map_data->ref_attrs); format_free_inref_attrs(map_data->inref_attrs); free(map_data->entry_filter); - free(map_data->key_format); + backend_free_strlist(map_data->key_formats); free(map_data->value_format); } } @@ -198,13 +211,13 @@ backend_copy_cb_data(const struct backend_map_data *data) format_dup_inref_attrs(data->inref_attrs) : NULL; ret->entry_filter = strdup(data->entry_filter); - ret->key_format = strdup(data->key_format); + ret->key_formats = backend_dup_strlist(data->key_formats); ret->value_format = strdup(data->value_format); if ((ret->domain == NULL) || (ret->map == NULL) || (ret->bases == NULL) || (ret->entry_filter == NULL) || - (ret->key_format == NULL) || + (ret->key_formats == NULL) || (ret->value_format == NULL)) { backend_free_map_data(ret); return NULL; @@ -218,13 +231,23 @@ static int backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data) { struct backend_map_data *data; - char *key, *value, *ndn; + char **keys, *value, *ndn; int i, j; data = callback_data; /* Pull out the key and value for the entry. */ - key = format_get_data(data->state, NULL, e, data->domain, data->map, - data->key_format, - &data->ref_attrs, &data->inref_attrs); + keys = malloc((data->n_key_formats + 1) * sizeof(char *)); + if (keys != NULL) { + for (i = 0; i < data->n_key_formats; i++) { + keys[i] = format_get_data(data->state, NULL, e, + data->domain, data->map, + data->key_formats[i], + &data->ref_attrs, + &data->inref_attrs); + } + keys[i] = NULL; + } else { + return 0; + } value = format_get_data(data->state, NULL, e, data->domain, data->map, data->value_format, &data->ref_attrs, &data->inref_attrs); @@ -232,15 +255,18 @@ backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data) ndn = slapi_entry_get_ndn(e); /* If we actually generated a value, then set it, otherwise clear it in * case there was one set before. */ - if ((key != NULL) && (value != NULL)) { - 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, ndn, value); + if ((keys != NULL) && (value != NULL)) { + for (i = 0; i < data->n_key_formats; i++) { + 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, + keys[i], ndn, value); + } map_data_set_entry(data->state, data->domain, data->map, ndn, - -1, key, + data->n_key_formats, + NULL, keys, -1, value); } else { slapi_log_error(SLAPI_LOG_PLUGIN, @@ -253,7 +279,10 @@ backend_map_config_entry_add_one_cb(Slapi_Entry *e, void *callback_data) ndn); } format_free_data(value); - format_free_data(key); + for (i = 0; i < data->n_key_formats; i++) { + format_free_data(keys[i]); + } + free(keys); return 0; } @@ -372,18 +401,20 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, const char *domain, const char *map, bool_t *secure, struct backend_map_data *ret) { - const char *default_filter, *default_key_format, *default_value_format; - char **bases, *entry_filter, *key_format, *value_format, *actual_attr; + const char *default_filter, **default_key_formats; + const char *default_value_format; + char **bases, *entry_filter, **key_formats, *value_format, *actual_attr; char **ref_attrs; struct format_inref_attr **inref_attrs; - char **use_bases, *use_entry_filter, *use_key_format, *use_value_format; + char **use_bases, *use_entry_filter, **use_key_formats; + char *use_value_format; const char *cvalue; - int i, disposition, buffer_flags, count; + int i, j, disposition, buffer_flags, count; Slapi_ValueSet *values; Slapi_Value *value; /* Read the hard-coded defaults for a map with this name. */ defaults_get_map_config(map, secure, &default_filter, - &default_key_format, &default_value_format); + &default_key_formats, &default_value_format); /* Read the values from the configuration entry. */ bases = NULL; if (slapi_vattr_values_get(e, MAP_CONFIGURATION_BASE_ATTR, &values, @@ -413,16 +444,24 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, } slapi_vattr_values_free(&values, &actual_attr, buffer_flags); } - key_format = NULL; + key_formats = NULL; if (slapi_vattr_values_get(e, MAP_CONFIGURATION_KEY_ATTR, &values, &disposition, &actual_attr, 0, &buffer_flags) == 0) { - i = slapi_valueset_first_value(values, &value); - if (i != -1) { - cvalue = slapi_value_get_string(value); - key_format = strdup(cvalue); + key_formats = malloc((slapi_valueset_count(values) + 1) * + (sizeof (char *))); + if (key_formats != NULL) { + for (i = 0; i < slapi_valueset_count(values); i++) { + j = slapi_valueset_first_value(values, &value); + if (j != -1) { + cvalue = slapi_value_get_string(value); + key_formats[i] = strdup(cvalue); + } + slapi_vattr_values_free(&values, &actual_attr, + buffer_flags); + } + key_formats[i] = NULL; } - slapi_vattr_values_free(&values, &actual_attr, buffer_flags); } value_format = NULL; if (slapi_vattr_values_get(e, MAP_CONFIGURATION_VALUE_ATTR, &values, @@ -461,30 +500,25 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, entry_filter : default_filter, domain, map); - use_key_format = key_format ? - strdup(key_format) : - strdup(default_key_format); + use_key_formats = key_formats ? + backend_dup_strlist(key_formats) : + backend_dup_strlist((char **) default_key_formats); use_value_format = value_format ? strdup(value_format) : strdup(default_value_format); use_bases = backend_dup_strlist(bases); /* Free the values we read from the entry. */ free(value_format); - free(key_format); + backend_free_strlist(key_formats); free(entry_filter); - if (bases) { - for (i = 0; bases[i] != NULL; i++) { - free(bases[i]); - } - free(bases); - } + backend_free_strlist(bases); /* Populate the returned structure. */ ret->state = state; ret->domain = strdup(domain); ret->map = strdup(map); ret->bases = use_bases; ret->entry_filter = use_entry_filter; - ret->key_format = use_key_format; + ret->key_formats = use_key_formats; ret->value_format = use_value_format; ret->ref_attrs = NULL; ret->inref_attrs = NULL; @@ -495,7 +529,7 @@ backend_map_config_read_config(struct plugin_state *state, Slapi_Entry *e, "key \"%s\", " "value \"%s\"\n", map, domain, - use_entry_filter, use_key_format, use_value_format); + use_entry_filter, use_key_formats, use_value_format); } /* Given a directory server entry which represents a map's configuration, set @@ -803,12 +837,7 @@ void backend_free_map_config(char **bases, char *entry_filter) { int i; - if (bases != NULL) { - for (i = 0; bases[i] != NULL; i++) { - free(bases[i]); - } - } - free(bases); + backend_free_strlist(bases); free(entry_filter); } |