diff options
Diffstat (limited to 'src/back-sch.c')
-rw-r--r-- | src/back-sch.c | 169 |
1 files changed, 58 insertions, 111 deletions
diff --git a/src/back-sch.c b/src/back-sch.c index 0459f8c..e7e582b 100644 --- a/src/back-sch.c +++ b/src/back-sch.c @@ -50,17 +50,12 @@ #include "plugin.h" #include "map.h" -#define SCH_CONTAINER_CONFIGURATION_FILTER "(&(objectClass=*)(" SCH_CONTAINER_CONFIGURATION_BASE_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_GROUP_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_FILTER_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_ENTRY_FORMAT_ATTR "=*))" +#define SCH_CONTAINER_CONFIGURATION_FILTER "(&(objectClass=*)(" SCH_CONTAINER_CONFIGURATION_GROUP_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_CONTAINER_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_BASE_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_FILTER_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_RDN_ATTR "=*)(" SCH_CONTAINER_CONFIGURATION_ATTR_ATTR "=*))" /* The data we ask the map cache to keep, for us, for each set. */ struct backend_set_data { - /* Common data. */ - struct plugin_state *state; - char *group, *container, **bases, *entry_filter; - char **ref_attrs; - struct format_inref_attr **inref_attrs; + struct backend_shr_set_data common; /* Schema compatibility-specific data. */ - char *entry_format; }; /* Read the name of the NIS master. A dummy function for the schema @@ -78,62 +73,26 @@ backend_read_master_name(struct plugin_state *state, char **master) } /* Manipulate a backend map configuration. */ -struct plugin_state * -backend_set_config_get_state(struct backend_set_data *set_data) -{ - return set_data->state; -} -char ** -backend_set_config_get_bases(struct backend_set_data *set_data) -{ - return set_data->bases; -} -char * -backend_set_config_get_filter(struct backend_set_data *set_data) -{ - return set_data->entry_filter; -} -char * -backend_set_config_get_group(struct backend_set_data *set_data) -{ - return set_data->group; -} -char * -backend_set_config_get_set(struct backend_set_data *set_data) -{ - return set_data->container; -} -struct format_inref_attr ** -backend_set_config_get_inref_attrs(struct backend_set_data *set_data) -{ - return set_data->inref_attrs; -} -char ** -backend_set_config_get_ref_attrs(struct backend_set_data *set_data) -{ - return set_data->ref_attrs; -} static void backend_set_config_free_config_contents(void *data) { struct backend_set_data *set_data = data; if (set_data != NULL) { - free(set_data->group); - free(set_data->container); - free(set_data->bases); - format_free_attr_list(set_data->ref_attrs); - format_free_inref_attrs(set_data->inref_attrs); - free(set_data->entry_filter); - free(set_data->entry_format); + free(set_data->common.group); + free(set_data->common.set); + free(set_data->common.bases); + format_free_attr_list(set_data->common.ref_attrs); + format_free_inref_attrs(set_data->common.inref_attrs); + free(set_data->common.entry_filter); } } void -backend_set_config_free_config(struct backend_set_data *data) +backend_set_config_free_config(struct backend_shr_set_data *data) { - backend_set_config_free_config_contents(data); + backend_set_config_free_config_contents(data->self); free(data); } -static struct backend_set_data * +static struct backend_shr_set_data * backend_copy_set_config(const struct backend_set_data *data) { struct backend_set_data *ret; @@ -141,27 +100,26 @@ backend_copy_set_config(const struct backend_set_data *data) if (ret == NULL) { return NULL; } - ret->state = data->state; - ret->group = strdup(data->group); - ret->container = strdup(data->container); - ret->bases = backend_shr_dup_strlist(data->bases); - ret->ref_attrs = data->ref_attrs ? - format_dup_attr_list(data->ref_attrs) : - NULL; - ret->inref_attrs = data->inref_attrs ? - format_dup_inref_attrs(data->inref_attrs) : - NULL; - ret->entry_filter = strdup(data->entry_filter); - ret->entry_format = strdup(data->entry_format); - if ((ret->group == NULL) || - (ret->container == NULL) || - (ret->bases == NULL) || - (ret->entry_filter == NULL) || - (ret->entry_format == NULL)) { - backend_set_config_free_config(ret); + ret->common.self = ret; + ret->common.state = data->common.state; + ret->common.group = strdup(data->common.group); + ret->common.set = strdup(data->common.set); + ret->common.bases = backend_shr_dup_strlist(data->common.bases); + ret->common.ref_attrs = data->common.ref_attrs ? + format_dup_attr_list(data->common.ref_attrs) : + NULL; + ret->common.inref_attrs = data->common.inref_attrs ? + format_dup_inref_attrs(data->common.inref_attrs) : + NULL; + ret->common.entry_filter = strdup(data->common.entry_filter); + if ((ret->common.group == NULL) || + (ret->common.set == NULL) || + (ret->common.bases == NULL) || + (ret->common.entry_filter == NULL)) { + backend_set_config_free_config(&ret->common); return NULL; } - return ret; + return &ret->common; } /* Given a configuration entry, read the map configuration for the given group @@ -169,9 +127,9 @@ backend_copy_set_config(const struct backend_set_data *data) void backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, const char *group, const char *container, - bool_t *flag, struct backend_set_data **pret) + bool_t *flag, struct backend_shr_set_data **pret) { - char **bases, *entry_filter, *entry_format; + char **bases, *entry_filter; char *actual_attr; const char *cvalue; int i, j, disposition, buffer_flags, count; @@ -224,38 +182,24 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, } slapi_vattr_values_free(&values, &actual_attr, buffer_flags); } - entry_format = NULL; - if (slapi_vattr_values_get(e, SCH_CONTAINER_CONFIGURATION_ENTRY_FORMAT_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); - entry_format = strdup(cvalue); - } - slapi_vattr_values_free(&values, &actual_attr, buffer_flags); - } /* Populate the returned structure. */ - ret.state = state; - ret.group = strdup(group); - ret.container = strdup(container); - ret.bases = bases; - ret.entry_filter = entry_filter; - ret.entry_format = entry_format; - ret.ref_attrs = NULL; - ret.inref_attrs = NULL; + ret.common.state = state; + ret.common.group = strdup(group); + ret.common.set = strdup(container); + ret.common.bases = bases; + ret.common.entry_filter = entry_filter; + ret.common.ref_attrs = NULL; + ret.common.inref_attrs = NULL; *pret = backend_copy_set_config(&ret); - free(ret.group); - free(ret.container); - if (ret.bases != NULL) { - for (i = 0; ret.bases[i] != NULL; i++) { - free(ret.bases[i]); + free(ret.common.group); + free(ret.common.set); + if (ret.common.bases != NULL) { + for (i = 0; ret.common.bases[i] != NULL; i++) { + free(ret.common.bases[i]); } - free(ret.bases); + free(ret.common.bases); } - free(ret.entry_filter); - free(ret.entry_format); + free(ret.common.entry_filter); } /* Given a map-entry directory entry, determine a key, a value, and extra data @@ -264,33 +208,36 @@ void backend_set_entry_one(Slapi_Entry *e, struct backend_set_data *data) { char *ldif, *ndn, *plugin_id, *ndns[2]; - plugin_id = data->state->plugin_desc->spd_id; + plugin_id = data->common.state->plugin_desc->spd_id; /* Pull out the NDN of this entry. */ ndn = slapi_entry_get_ndn(e); ndns[0] = ndn; ndns[1] = NULL; /* Generate the LDIF for the entry. */ - ldif = format_get_data(data->state, e, data->group, data->container, - data->entry_format, NULL, - &data->ref_attrs, &data->inref_attrs); + ldif = format_get_data(data->common.state, e, + data->common.group, data->common.set, + "", NULL, + &data->common.ref_attrs, + &data->common.inref_attrs); /* If we actually generated a new entry for this entry, then set it, * otherwise clear it in case there was one set before. */ if (ldif == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "setting group/container/key/value " "\"%s\"/\"%s\"/\"%s\"(\"%s\")=\"%s\"\n", - data->group, data->container, ndn, ndn, ldif); - map_data_set_entry(data->state, - data->group, data->container, ndn, + data->common.group, data->common.set, + ndn, ndn, ldif); + map_data_set_entry(data->common.state, + data->common.group, data->common.set, ndn, NULL, ndns, -1, ldif, NULL, NULL); } else { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_id, "no value for %s, unsetting domain/map/id" "\"%s\"/\"%s\"/(\"%s\")\n", - ndn, data->group, data->container, ndn); - map_data_unset_entry_id(data->state, - data->group, data->container, + ndn, data->common.group, data->common.set, ndn); + map_data_unset_entry_id(data->common.state, + data->common.group, data->common.set, ndn); } format_free_data(ldif); |