diff options
| author | Nalin Dahyabhai <nalin@dahyabhai.net> | 2012-01-16 14:17:28 -0500 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin@dahyabhai.net> | 2012-01-16 14:17:28 -0500 |
| commit | a4547135db29233dedc4b6bf429d3cfe89182e75 (patch) | |
| tree | eea0028ee1e573e39ebfecce9b7426b87fdcea62 /src | |
| parent | c0b3083e1e71e90ce83a6f33fe8bebb9c6e17722 (diff) | |
| download | slapi-nis-a4547135db29233dedc4b6bf429d3cfe89182e75.tar.gz slapi-nis-a4547135db29233dedc4b6bf429d3cfe89182e75.tar.xz slapi-nis-a4547135db29233dedc4b6bf429d3cfe89182e75.zip | |
- in callbacks, only use pblocks that are built from pblocks that we
already have, so that we can pass the transaction ID around; this
includes additional parameters for a number of functions and a new
callback data type for backend_set_config_entry_add_cb()
Diffstat (limited to 'src')
| -rw-r--r-- | src/back-nis.c | 52 | ||||
| -rw-r--r-- | src/back-sch.c | 38 | ||||
| -rw-r--r-- | src/back-shr.c | 115 | ||||
| -rw-r--r-- | src/back-shr.h | 7 | ||||
| -rw-r--r-- | src/backend.h | 23 | ||||
| -rw-r--r-- | src/format.c | 61 | ||||
| -rw-r--r-- | src/format.h | 6 | ||||
| -rw-r--r-- | src/map.c | 10 | ||||
| -rw-r--r-- | src/plug-nis.c | 2 | ||||
| -rw-r--r-- | src/plug-sch.c | 4 |
10 files changed, 195 insertions, 123 deletions
diff --git a/src/back-nis.c b/src/back-nis.c index c824312..e7ba2dc 100644 --- a/src/back-nis.c +++ b/src/back-nis.c @@ -72,9 +72,10 @@ backend_free_master_name(struct plugin_state *state, char *master) backend_shr_free_server_name(state, master); } int -backend_read_master_name(struct plugin_state *state, char **master) +backend_read_master_name(struct plugin_state *state, Slapi_PBlock *pb, + char **master) { - return backend_shr_read_server_name(state, master); + return backend_shr_read_server_name(pb, state, master); } /* Manipulate map configuration data. */ @@ -189,7 +190,8 @@ backend_free_gathered_data(char **all, unsigned int *all_lengths, free(group_lengths); } static char ** -backend_gather_data(struct plugin_state *state, Slapi_Entry *e, +backend_gather_data(struct plugin_state *state, + Slapi_PBlock *pb, Slapi_Entry *e, const char *domain, const char *map, char **single_formats, char **group_formats, const char *disallowed_chars, @@ -250,7 +252,7 @@ backend_gather_data(struct plugin_state *state, Slapi_Entry *e, } n = 0; for (i = 0; i < n_singles; i++) { - singles[i] = format_get_data(state, e, domain, map, + singles[i] = format_get_data(state, pb, e, domain, map, single_formats[i], disallowed_chars, rel_attrs, ref_attrs, inref_attrs, @@ -278,7 +280,7 @@ backend_gather_data(struct plugin_state *state, Slapi_Entry *e, } } for (i = 0, j = 0; i < n_groups; i++) { - groups[j] = format_get_data_set(state, e, domain, map, + groups[j] = format_get_data_set(state, pb, e, domain, map, group_formats[i], disallowed_chars, rel_attrs, ref_attrs, inref_attrs, @@ -333,7 +335,8 @@ backend_gather_data(struct plugin_state *state, Slapi_Entry *e, * determine which value should be associated with those keys, and add them to * the map cache. */ void -backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) +backend_set_entry(Slapi_PBlock *pb, Slapi_Entry *e, + struct backend_set_data *data) { char **all_keys, **all_values, *ndn, *plugin_id; char **key_singles, ***key_groups, **value_singles, ***value_groups; @@ -352,7 +355,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) "examining unnamed input entry(?)\n"); } /* Pull out the keys and value for the entry. */ - all_keys = backend_gather_data(data->common.state, e, + all_keys = backend_gather_data(data->common.state, pb, e, data->common.group, data->common.set, data->key_formats, @@ -369,7 +372,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) &n_key_groups, &key_groups, &key_group_lengths); - all_values = backend_gather_data(data->common.state, e, + all_values = backend_gather_data(data->common.state, pb, e, data->common.group, data->common.set, data->value_formats, @@ -549,7 +552,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, (keys_formats ? NULL : (default_key_format ? backend_shr_dup_strlist_n((char **) &default_key_format, - 1) : + 1) : NULL)); /* Use the supplied keys-format. If there is none, and there is also * not a supplied key-format, use the default. */ @@ -558,7 +561,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, (key_formats ? NULL : (default_keys_format ? backend_shr_dup_strlist_n((char **) &default_keys_format, - 1) : + 1) : NULL)); /* Use the supplied value-format. If there is none, and there is also * not a supplied values-format, use the default. */ @@ -567,7 +570,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, (values_formats ? NULL : (default_value_format ? backend_shr_dup_strlist_n((char **) &default_value_format, - 1) : + 1) : NULL)); /* Use the supplied values-format. If there is none, and there is also * not a supplied value-format, use the default. */ @@ -576,7 +579,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, (value_formats ? NULL : (default_values_format ? backend_shr_dup_strlist_n((char **) &default_values_format, - 1) : + 1) : NULL)); /* We don't supply defaults for search locations. */ use_bases = backend_shr_dup_strlist(bases); @@ -717,16 +720,18 @@ backend_set_config_entry_add_cb(Slapi_Entry *e, void *callback_data) { char **domains, **maps; int i, j, ret; - struct plugin_state *state; + struct backend_set_config_entry_add_cbdata *cbdata; - state = callback_data; - domains = backend_shr_get_vattr_strlist(state, e, + cbdata = callback_data; + domains = backend_shr_get_vattr_strlist(cbdata->state, e, NIS_MAP_CONFIGURATION_DOMAIN_ATTR); - maps = backend_shr_get_vattr_strlist(state, e, + maps = backend_shr_get_vattr_strlist(cbdata->state, e, NIS_MAP_CONFIGURATION_MAP_ATTR); for (i = 0; (domains != NULL) && (domains[i] != NULL); i++) { for (j = 0; (maps != NULL) && (maps[j] != NULL); j++) { - ret = backend_shr_set_config_entry_add(state, e, + ret = backend_shr_set_config_entry_add(cbdata->state, + cbdata->pb, + e, domains[i], maps[j]); } @@ -738,7 +743,7 @@ backend_set_config_entry_add_cb(Slapi_Entry *e, void *callback_data) /* Update/initialize parameters stored in the plugin's configuration entry. */ void -backend_update_params(struct plugin_state *state) +backend_update_params(Slapi_PBlock *pb, struct plugin_state *state) { Slapi_DN *our_dn; Slapi_Entry *our_entry; @@ -757,7 +762,7 @@ backend_update_params(struct plugin_state *state) state->plugin_base ? "\"" : ""); return; } - wrap_search_internal_get_entry(our_dn, NULL, NULL, &our_entry, + wrap_search_internal_get_entry(pb, our_dn, NULL, NULL, &our_entry, state->plugin_identity); slapi_sdn_free(&our_dn); our_dn = NULL; @@ -853,7 +858,8 @@ backend_get_set_config_entry_cb(Slapi_Entry *e, void *callback_data) } void -backend_get_set_config(struct plugin_state *state, +backend_get_set_config(Slapi_PBlock *parent_pb, + struct plugin_state *state, const char *domain, const char *map, char ***bases, char **entry_filter) { @@ -891,7 +897,7 @@ backend_get_set_config(struct plugin_state *state, state->plugin_desc->spd_id, "searching from \"%s\" for \"%s\" for configuration\n", state->plugin_base, filter); - pb = slapi_pblock_new(); + pb = wrap_pblock_new(parent_pb); slapi_search_internal_set_pb(pb, state->plugin_base, LDAP_SCOPE_SUBTREE, @@ -958,9 +964,9 @@ backend_check_empty(struct plugin_state *state, /* Scan for the list of configured domains and maps. */ void -backend_startup(struct plugin_state *state) +backend_startup(Slapi_PBlock *pb, struct plugin_state *state) { - backend_shr_startup(state, NIS_MAP_CONFIGURATION_FILTER); + backend_shr_startup(state, pb, NIS_MAP_CONFIGURATION_FILTER); } /* Set up our post-op callbacks. */ diff --git a/src/back-sch.c b/src/back-sch.c index 3a91a74..4fc2c2b 100644 --- a/src/back-sch.c +++ b/src/back-sch.c @@ -75,7 +75,8 @@ backend_free_master_name(struct plugin_state *state, char *master) } int -backend_read_master_name(struct plugin_state *state, char **master) +backend_read_master_name(struct plugin_state *state, Slapi_PBlock *pb, + char **master) { *master = "localhost"; return -1; @@ -283,7 +284,8 @@ backend_set_operational_attributes(Slapi_Entry *e, /* Given a map-entry directory entry, determine a key, a value, and extra data * to be stored in the map cache, and add them to the map cache. */ void -backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) +backend_set_entry(Slapi_PBlock *pb, Slapi_Entry *e, + struct backend_set_data *data) { char *dn, *rdn, *ndn, *ldif, *plugin_id, *keys[2], *values[2], **ava; char *attr, *val; @@ -306,7 +308,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) "examining unnamed input entry(?)\n"); } /* Generate the RDN for the entry. */ - rdn = format_get_data(data->common.state, e, + rdn = format_get_data(data->common.state, pb, e, data->common.group, data->common.set, data->rdn_format, NULL, &data->common.rel_attrs, @@ -338,7 +340,7 @@ backend_set_entry(Slapi_Entry *e, struct backend_set_data *data) for (i = 0; data->attribute_format[i] != NULL; i++) { /* Expand the format specifier into a list. */ ava_lens = NULL; - ava = format_get_data_set(data->common.state, e, + ava = format_get_data_set(data->common.state, pb, e, data->common.group, data->common.set, data->attribute_format[i], @@ -475,25 +477,29 @@ backend_set_config_entry_add_cb(Slapi_Entry *e, void *callback_data) { char **groups, **containers; int i, j, ret; - struct plugin_state *state; + struct backend_set_config_entry_add_cbdata *cbdata; - state = callback_data; - groups = backend_shr_get_vattr_strlist(state, e, + cbdata = callback_data; + groups = backend_shr_get_vattr_strlist(cbdata->state, e, SCH_CONTAINER_CONFIGURATION_GROUP_ATTR); - containers = backend_shr_get_vattr_strlist(state, e, + containers = backend_shr_get_vattr_strlist(cbdata->state, e, SCH_CONTAINER_CONFIGURATION_CONTAINER_ATTR); for (i = 0; (groups != NULL) && (groups[i] != NULL); i++) { /* If this is a multiple-container group, walk the list. */ for (j = 0; (containers != NULL) && (containers[j] != NULL); j++) { - ret = backend_shr_set_config_entry_add(state, e, + ret = backend_shr_set_config_entry_add(cbdata->state, + cbdata->pb, + e, groups[i], containers[j]); } /* If there are no containers, add one with an empty name. */ if (containers == NULL) { - ret = backend_shr_set_config_entry_add(state, e, + ret = backend_shr_set_config_entry_add(cbdata->state, + cbdata->pb, + e, groups[i], ""); } @@ -582,7 +588,7 @@ backend_get_set_config_entry_if_matching_cb(Slapi_Entry *e, void *callback_data) } void -backend_get_set_config(struct plugin_state *state, +backend_get_set_config(Slapi_PBlock *parent_pb, struct plugin_state *state, const char *group, const char *container, char ***bases, char **entry_filter) { @@ -647,7 +653,7 @@ backend_get_set_config(struct plugin_state *state, state->plugin_desc->spd_id, "searching from \"%s\" for \"%s\" for configuration\n", state->plugin_base, SCH_CONTAINER_CONFIGURATION_FILTER); - pb = slapi_pblock_new(); + pb = wrap_pblock_new(parent_pb); slapi_search_internal_set_pb(pb, state->plugin_base, LDAP_SCOPE_SUBTREE, @@ -691,7 +697,7 @@ backend_entry_get_set_config_entry_filter(void) /* Re-read plugin-wide settings that may have changed. Nothing to do. */ void -backend_update_params(struct plugin_state *state) +backend_update_params(Slapi_PBlock *pb, struct plugin_state *state) { } @@ -952,7 +958,7 @@ backend_search_group_cb(const char *group, void *cb_data) group_dn, LDAP_SCOPE_SUBTREE)) { cbdata->answer = TRUE; } - + slapi_sdn_free(&group_dn); return TRUE; @@ -1266,9 +1272,9 @@ backend_check_empty(struct plugin_state *state, /* Populate our data cache. */ void -backend_startup(struct plugin_state *state) +backend_startup(Slapi_PBlock *pb, struct plugin_state *state) { - backend_shr_startup(state, SCH_CONTAINER_CONFIGURATION_FILTER); + backend_shr_startup(state, pb, SCH_CONTAINER_CONFIGURATION_FILTER); } int diff --git a/src/back-shr.c b/src/back-shr.c index 003a728..803435a 100644 --- a/src/back-shr.c +++ b/src/back-shr.c @@ -66,7 +66,8 @@ backend_shr_free_server_name(struct plugin_state *state, char *master) free(master); } int -backend_shr_read_server_name(struct plugin_state *state, char **master) +backend_shr_read_server_name(Slapi_PBlock *pb, struct plugin_state *state, + char **master) { Slapi_DN *config_dn; Slapi_Entry *config; @@ -86,7 +87,7 @@ backend_shr_read_server_name(struct plugin_state *state, char **master) "error parsing \"cn=config\"\n"); return -1; } - wrap_search_internal_get_entry(config_dn, NULL, attrs, &config, + wrap_search_internal_get_entry(pb, config_dn, NULL, attrs, &config, state->plugin_identity); if (config == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, @@ -267,20 +268,27 @@ backend_shr_add_strlist(char ***strlist, const char *value) /* Set or unset the entry using information in the callback data. */ static void -backend_shr_set_entry(Slapi_Entry *e, struct backend_set_data *set_data) +backend_shr_set_entry(Slapi_PBlock *pb, Slapi_Entry *e, struct backend_set_data *set_data) { - backend_set_entry(e, set_data); + backend_set_entry(pb, e, set_data); } +struct backend_shr_set_entry_cbdata { + Slapi_PBlock *pb; + struct backend_set_data *set_data; +}; static int -backend_shr_set_entry_cb(Slapi_Entry *e, void *set_data) +backend_shr_set_entry_cb(Slapi_Entry *e, void *callback_data) { - backend_shr_set_entry(e, set_data); + struct backend_shr_set_entry_cbdata *cbdata; + cbdata = callback_data; + backend_shr_set_entry(cbdata->pb, e, cbdata->set_data); return 0; } /* Set or unset the named entry using information in the callback data. */ static void backend_shr_set_config_entry_set_one_dn(struct plugin_state *state, + Slapi_PBlock *pb, const char *dn, struct backend_set_data *set_data) { @@ -293,14 +301,14 @@ backend_shr_set_config_entry_set_one_dn(struct plugin_state *state, "error parsing DN \"%s\"\n", dn); return; } else { - wrap_search_internal_get_entry(sdn, NULL, NULL, &entry, + wrap_search_internal_get_entry(pb, sdn, NULL, NULL, &entry, state->plugin_identity); if (entry == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, "failure reading entry \"%s\"\n", dn); } else { - backend_shr_set_entry(entry, set_data); + backend_shr_set_entry(pb, entry, set_data); slapi_entry_free(entry); } slapi_sdn_free(&sdn); @@ -335,7 +343,7 @@ backend_shr_entry_matches(Slapi_PBlock *pb, Slapi_Entry *e, ret = FALSE; } else { ret = TRUE; - } + } slapi_sdn_free(&containing_sdn); slapi_sdn_free(&entry_sdn); @@ -368,16 +376,17 @@ backend_shr_set_config_free_config(void *cb_data) struct backend_shr_set_data *set_data; set_data = cb_data; backend_set_config_free_config(set_data); - } int -backend_shr_set_config_entry_add(struct plugin_state *state, Slapi_Entry *e, +backend_shr_set_config_entry_add(struct plugin_state *state, + Slapi_PBlock *parent_pb, Slapi_Entry *e, const char *group, const char *set) { Slapi_PBlock *pb; int i; bool_t flag; struct backend_shr_set_data *set_data; + struct backend_shr_set_entry_cbdata cbdata; char **set_bases; char *set_entry_filter; @@ -406,7 +415,7 @@ backend_shr_set_config_entry_add(struct plugin_state *state, Slapi_Entry *e, state->plugin_desc->spd_id, "searching '%s' for '%s'\n", set_bases[i], set_entry_filter); - pb = slapi_pblock_new(); + pb = wrap_pblock_new(parent_pb); slapi_search_internal_set_pb(pb, set_bases[i], LDAP_SCOPE_SUBTREE, @@ -416,7 +425,9 @@ backend_shr_set_config_entry_add(struct plugin_state *state, Slapi_Entry *e, NULL, state->plugin_identity, 0); - slapi_search_internal_callback_pb(pb, set_data, + cbdata.set_data = set_data->self; + cbdata.pb = pb; + slapi_search_internal_callback_pb(pb, &cbdata, NULL, backend_shr_set_entry_cb, NULL); @@ -552,17 +563,20 @@ backend_shr_get_vattr_boolean(struct plugin_state *state, /* Scan for the list of configured groups and sets. */ void -backend_shr_startup(struct plugin_state *state, const char *filter) +backend_shr_startup(struct plugin_state *state, + Slapi_PBlock *parent_pb, + const char *filter) { Slapi_PBlock *pb; + struct backend_set_config_entry_add_cbdata set_cbdata; - backend_update_params(state); + backend_update_params(parent_pb, state); slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, "searching under \"%s\" for configuration\n", state->plugin_base); - pb = slapi_pblock_new(); + pb = wrap_pblock_new(parent_pb); slapi_search_internal_set_pb(pb, state->plugin_base, LDAP_SCOPE_ONELEVEL, @@ -573,7 +587,9 @@ backend_shr_startup(struct plugin_state *state, const char *filter) state->plugin_identity, 0); map_wrlock(); - slapi_search_internal_callback_pb(pb, state, + set_cbdata.state = state; + set_cbdata.pb = pb; + slapi_search_internal_callback_pb(pb, &set_cbdata, NULL, backend_set_config_entry_add_cb, NULL); @@ -833,6 +849,7 @@ backend_shr_mods_as_string(LDAPMod **mods) /* Update any entries in the map for which the passed-in entry will affect the * values which are derived. */ struct backend_shr_update_references_cbdata { + Slapi_PBlock *pb; Slapi_Entry *e; LDAPMod **mods; }; @@ -845,6 +862,7 @@ backend_shr_update_references_cb(const char *group, const char *set, struct plugin_state *state; struct backend_shr_set_data *set_data; struct backend_shr_update_references_cbdata *cbdata; + struct backend_shr_set_entry_cbdata set_cbdata; struct backend_shr_note_entry_sdn_cbdata note_cbdata; Slapi_DN *referred_to_sdn, **these_entries, **prev_entries; Slapi_DN **next_entries, **these_bases, **prev_bases; @@ -923,7 +941,7 @@ backend_shr_update_references_cb(const char *group, const char *set, for (i = 0; (set_bases != NULL) && (set_bases[i] != NULL); i++) { - pb = slapi_pblock_new(); + pb = wrap_pblock_new(cbdata->pb); slapi_search_internal_set_pb(pb, set_bases[i], LDAP_SCOPE_SUBTREE, @@ -933,7 +951,9 @@ backend_shr_update_references_cb(const char *group, const char *set, NULL, state->plugin_identity, 0); - slapi_search_internal_callback_pb(pb, set_data, + set_cbdata.set_data = set_data->self; + set_cbdata.pb = pb; + slapi_search_internal_callback_pb(pb, &set_cbdata, NULL, backend_shr_set_entry_cb, NULL); @@ -983,6 +1003,7 @@ backend_shr_update_references_cb(const char *group, const char *set, if (map_data_check_entry(state, group, set, ndn)) { /* ...update it. */ backend_shr_set_config_entry_set_one_dn(state, + cbdata->pb, ndn, set_data->self); } @@ -1083,7 +1104,7 @@ backend_shr_update_references_cb(const char *group, const char *set, "with scope %d\n", slapi_sdn_get_ndn(these_bases[l]), filter, scope); - pb = slapi_pblock_new(); + pb = wrap_pblock_new(cbdata->pb); slapi_search_internal_set_pb(pb, slapi_sdn_get_ndn(these_bases[l]), scope, @@ -1124,7 +1145,7 @@ backend_shr_update_references_cb(const char *group, const char *set, "scope %d\n", slapi_sdn_get_ndn(prev_bases[l]), filter, scope); - pb = slapi_pblock_new(); + pb = wrap_pblock_new(cbdata->pb); slapi_search_internal_set_pb(pb, slapi_sdn_get_ndn(prev_bases[l]), scope, @@ -1189,6 +1210,7 @@ backend_shr_update_references_cb(const char *group, const char *set, "dependent entry: \"%s\"\n", ndn); backend_shr_set_config_entry_set_one_dn(state, + cbdata->pb, ndn, set_data->self); } @@ -1249,7 +1271,8 @@ backend_shr_update_references_cb(const char *group, const char *set, /* Read the linked-to DN from the named * attribute in the entry. */ values = NULL; - wrap_search_internal_get_entry(these_entries[k], + wrap_search_internal_get_entry(cbdata->pb, + these_entries[k], NULL, these_attrs, &this_entry, @@ -1262,10 +1285,10 @@ backend_shr_update_references_cb(const char *group, const char *set, slapi_sdn_get_ndn(these_entries[k])); continue; } - pb = slapi_pblock_new(); + pb = wrap_pblock_new(cbdata->pb); if ((next_filter != NULL) && (slapi_filter_test(pb, this_entry, - next_filter, 0) != 0)) { + next_filter, 0) != 0)) { slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, "entry \"%s\" did not " @@ -1291,7 +1314,7 @@ backend_shr_update_references_cb(const char *group, const char *set, &value); l != -1; l = slapi_valueset_next_value(values, l, - &value)) { + &value)) { /* Pull out the value, which is a * referred-to entry's DN. */ dn = slapi_value_get_string(value); @@ -1316,7 +1339,8 @@ backend_shr_update_references_cb(const char *group, const char *set, /* Read the linked-to DN from the named * attribute in the entry. */ values = NULL; - wrap_search_internal_get_entry(these_entries[k], + wrap_search_internal_get_entry(cbdata->pb, + these_entries[k], NULL, next_attrs, &this_entry, @@ -1343,7 +1367,7 @@ backend_shr_update_references_cb(const char *group, const char *set, &value); l != -1; l = slapi_valueset_next_value(values, l, - &value)) { + &value)) { /* Pull out the value, which is a * referred-to entry's DN. */ dn = slapi_value_get_string(value); @@ -1399,6 +1423,7 @@ backend_shr_update_references_cb(const char *group, const char *set, "dependent entry: \"%s\"\n", ndn); backend_shr_set_config_entry_set_one_dn(state, + cbdata->pb, ndn, set_data->self); } @@ -1409,10 +1434,13 @@ backend_shr_update_references_cb(const char *group, const char *set, } void -backend_shr_update_references(struct plugin_state *state, Slapi_Entry *e, +backend_shr_update_references(struct plugin_state *state, + Slapi_PBlock *pb, + Slapi_Entry *e, LDAPMod **mods) { struct backend_shr_update_references_cbdata cbdata; + cbdata.pb = pb; cbdata.e = e; cbdata.mods = mods; if (!map_data_foreach_map(state, NULL, @@ -1456,7 +1484,7 @@ backend_shr_add_entry_cb(const char *group, const char *set, bool_t secure, /* Set the entry in the map which corresponds to this entry, or clear * any that might if this entry doesn't have a key and value. */ - backend_set_entry(cbdata->e, set_data->self); + backend_set_entry(cbdata->pb, cbdata->e, set_data->self); return TRUE; } @@ -1465,6 +1493,7 @@ static int backend_shr_add_cb(Slapi_PBlock *pb) { struct backend_add_entry_cbdata cbdata; + struct backend_set_config_entry_add_cbdata set_cbdata; char *dn; /* If we somehow recursed here from ourselves, just bail. */ @@ -1514,11 +1543,13 @@ backend_shr_add_cb(Slapi_PBlock *pb) slapi_log_error(SLAPI_LOG_PLUGIN, cbdata.state->plugin_desc->spd_id, "new entry \"%s\" is a set\n", cbdata.ndn); - backend_set_config_entry_add_cb(cbdata.e, cbdata.state); + set_cbdata.state = cbdata.state; + set_cbdata.pb = pb; + backend_set_config_entry_add_cb(cbdata.e, &set_cbdata); } /* Update entries in maps which are affected by this entry. */ - backend_shr_update_references(cbdata.state, cbdata.e, NULL); + backend_shr_update_references(cbdata.state, pb, cbdata.e, NULL); map_unlock(); wrap_dec_call_level(); @@ -1600,7 +1631,7 @@ backend_shr_modify_entry_cb(const char *group, const char *set, bool_t flag, /* Set the entry in the set which corresponds to this entry, or * remove any that might if this entry doesn't produce a useful * value. */ - backend_shr_set_entry(cbdata->e_post, set_data->self); + backend_shr_set_entry(cbdata->pb, cbdata->e_post, set_data->self); } return TRUE; } @@ -1611,6 +1642,7 @@ backend_shr_modify_cb(Slapi_PBlock *pb) Slapi_DN *sdn; char *dn; struct backend_shr_modify_entry_cbdata cbdata; + struct backend_set_config_entry_add_cbdata set_cbdata; /* If we somehow recursed here from ourselves, just bail. */ if (wrap_get_call_level() > 0) { @@ -1659,10 +1691,10 @@ backend_shr_modify_cb(Slapi_PBlock *pb) } /* Update entries which need to be updated in case they are no longer * affected by this entry. */ - backend_shr_update_references(cbdata.state, cbdata.e_pre, cbdata.mods); + backend_shr_update_references(cbdata.state, pb, cbdata.e_pre, cbdata.mods); /* Update entries which need to be updated in case they are now * affected by this entry. */ - backend_shr_update_references(cbdata.state, cbdata.e_post, cbdata.mods); + backend_shr_update_references(cbdata.state, pb, cbdata.e_post, cbdata.mods); /* If it's a map configuration entry, reconfigure, clear, and * repopulate the map. */ if (backend_shr_entry_is_a_set(cbdata.state, pb, cbdata.e_pre)) { @@ -1677,7 +1709,9 @@ backend_shr_modify_cb(Slapi_PBlock *pb) cbdata.state->plugin_desc->spd_id, "modified entry \"%s\" is now a set\n", cbdata.ndn); - backend_set_config_entry_add_cb(cbdata.e_post, cbdata.state); + set_cbdata.state = cbdata.state; + set_cbdata.pb = pb; + backend_set_config_entry_add_cb(cbdata.e_post, &set_cbdata); } /* Lastly, if the entry is our own entry, re-read parameters. */ sdn = slapi_sdn_new_dn_byref(cbdata.state->plugin_base); @@ -1686,7 +1720,7 @@ backend_shr_modify_cb(Slapi_PBlock *pb) slapi_sdn_get_ndn(sdn)) == 0) || (strcmp(slapi_entry_get_ndn(cbdata.e_post), slapi_sdn_get_ndn(sdn)) == 0)) { - backend_update_params(cbdata.state); + backend_update_params(pb, cbdata.state); } slapi_sdn_free(&sdn); } @@ -1738,7 +1772,7 @@ backend_shr_modrdn_entry_cb(const char *group, const char *set, bool_t secure, cbdata->pb, cbdata->e_post); if (matched_post) { - backend_set_entry(cbdata->e_post, set_data->self); + backend_set_entry(cbdata->pb, cbdata->e_post, set_data->self); } return TRUE; } @@ -1747,6 +1781,7 @@ static int backend_shr_modrdn_cb(Slapi_PBlock *pb) { struct backend_shr_modrdn_entry_cbdata cbdata; + struct backend_set_config_entry_add_cbdata set_cbdata; /* If we somehow recursed here from ourselves, just bail. */ if (wrap_get_call_level() > 0) { @@ -1807,7 +1842,9 @@ backend_shr_modrdn_cb(Slapi_PBlock *pb) cbdata.state->plugin_desc->spd_id, "renamed entry \"%s\" is now a set\n", slapi_entry_get_ndn(cbdata.e_post)); - backend_set_config_entry_add_cb(cbdata.e_post, cbdata.state); + set_cbdata.state = cbdata.state; + set_cbdata.pb = pb; + backend_set_config_entry_add_cb(cbdata.e_post, &set_cbdata); } map_unlock(); wrap_dec_call_level(); @@ -1896,7 +1933,7 @@ backend_shr_delete_cb(Slapi_PBlock *pb) } /* Update entries which need to be updated in case they are no longer * affected by this entry. */ - backend_shr_update_references(cbdata.state, cbdata.e, NULL); + backend_shr_update_references(cbdata.state, pb, cbdata.e, NULL); map_unlock(); wrap_dec_call_level(); return 0; diff --git a/src/back-shr.h b/src/back-shr.h index 4e56605..dd9d424 100644 --- a/src/back-shr.h +++ b/src/back-shr.h @@ -25,7 +25,8 @@ struct plugin_state; void backend_shr_free_server_name(struct plugin_state *state, char *master); -int backend_shr_read_server_name(struct plugin_state *state, char **master); +int backend_shr_read_server_name(Slapi_PBlock *pb, struct plugin_state *state, + char **master); void backend_shr_free_strlist(char **strlist); char **backend_shr_dup_strlist_n(char **strlist, int n); @@ -33,7 +34,8 @@ char **backend_shr_dup_strlist(char **strlist); char **backend_shr_dup_strlist_unless_empty(char **strlist); void backend_shr_add_strlist(char ***strlist, const char *item); -void backend_shr_startup(struct plugin_state *state, const char *set_filter); +void backend_shr_startup(struct plugin_state *state, + Slapi_PBlock *pb, const char *set_filter); int backend_shr_postop_init(Slapi_PBlock *pb, struct plugin_state *state); int backend_shr_internal_postop_init(Slapi_PBlock *pb, struct plugin_state *state); #ifdef USE_SLAPI_BE_TXNS @@ -41,6 +43,7 @@ int backend_shr_be_txn_postop_init(Slapi_PBlock *pb, struct plugin_state *state) #endif int backend_shr_set_config_entry_add(struct plugin_state *state, + Slapi_PBlock *pb, Slapi_Entry *e, const char *group_name, const char *set_name); diff --git a/src/backend.h b/src/backend.h index bf58456..f981300 100644 --- a/src/backend.h +++ b/src/backend.h @@ -50,32 +50,41 @@ struct backend_shr_set_data { }; /* Startup/initialization functions called through the map. */ -void backend_startup(struct plugin_state *state); +void backend_startup(struct slapi_pblock *pb, struct plugin_state *state); int backend_init_preop(struct slapi_pblock *pb, struct plugin_state *state); int backend_init_postop(struct slapi_pblock *pb, struct plugin_state *state); -int backend_init_internal_postop(struct slapi_pblock *pb, struct plugin_state *state); +int backend_init_internal_postop(struct slapi_pblock *pb, + struct plugin_state *state); #ifdef USE_SLAPI_BE_TXNS -int backend_init_be_txn_postop(struct slapi_pblock *pb, struct plugin_state *state); +int backend_init_be_txn_postop(struct slapi_pblock *pb, + struct plugin_state *state); #endif /* Read the server's name. */ -int backend_read_master_name(struct plugin_state *state, char **master); +int backend_read_master_name(struct plugin_state *state, + struct slapi_pblock *pb, + char **master); void backend_free_master_name(struct plugin_state *state, char *master); /* Read enough of the set's configuration for the formatter to be able to * resolve references correctly. */ -void backend_get_set_config(struct plugin_state *state, +void backend_get_set_config(Slapi_PBlock *pb, struct plugin_state *state, const char *group, const char *set, char ***bases, char **entry_filter); void backend_free_set_config(char **bases, char *entry_filter); /* Check if an entry is a set configuration, and add or remove one. */ const char *backend_entry_get_set_config_entry_filter(void); +struct backend_set_config_entry_add_cbdata { + struct plugin_state *state; + Slapi_PBlock *pb; +}; int backend_set_config_entry_add_cb(Slapi_Entry *e, void *callback_data); int backend_set_config_entry_delete_cb(Slapi_Entry *e, void *callback_data); /* Set an entry in a set. */ -void backend_set_entry(Slapi_Entry *e, struct backend_set_data *set_data); +void backend_set_entry(Slapi_PBlock *pb, Slapi_Entry *e, + struct backend_set_data *set_data); /* Read and free set configurations. */ void backend_set_config_read_config(struct plugin_state *state, @@ -91,7 +100,7 @@ void backend_check_empty(struct plugin_state *state, /* Re-read any plugin configuration data which can be modified without * requiring a restart. */ -void backend_update_params(struct plugin_state *state); +void backend_update_params(Slapi_PBlock *pb, struct plugin_state *state); /* Check if the operation which this pblock describes was initiated by the * current plugin. */ diff --git a/src/format.c b/src/format.c index ba09b41..60c3bf6 100644 --- a/src/format.c +++ b/src/format.c @@ -286,13 +286,14 @@ format_add_sdn_list(struct slapi_dn ***list, struct slapi_dn ***list2, } static int -format_check_entry(const char *dn, char *filter, void *identity) +format_check_entry(Slapi_PBlock *pb, const char *dn, char *filter, + void *identity) { Slapi_DN *sdn; Slapi_Entry *entry; sdn = slapi_sdn_new_dn_byval(dn); - wrap_search_internal_get_entry(sdn, filter, NULL, &entry, identity); + wrap_search_internal_get_entry(pb, sdn, filter, NULL, &entry, identity); slapi_sdn_free(&sdn); if (entry != NULL) { slapi_entry_free(entry); @@ -303,10 +304,11 @@ format_check_entry(const char *dn, char *filter, void *identity) } static void -format_add_filtered_sdn_list(struct slapi_dn ***list, struct slapi_dn ***list2, +format_add_filtered_sdn_list(Slapi_PBlock *pb, + struct slapi_dn ***list, struct slapi_dn ***list2, const char *dn, char *filter, void *identity) { - if (format_check_entry(dn, filter, identity) == 0) { + if (format_check_entry(pb, dn, filter, identity) == 0) { format_add_sdn_list(list, list2, dn); } } @@ -947,7 +949,7 @@ format_first(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, default_value = argv[1]; } ret = -ENOENT; - values = format_get_data_set(state, e, group, set, + values = format_get_data_set(state, pb, e, group, set, value_format, disallowed, rel_attrs, ref_attrs, inref_attrs, ref_attr_list, inref_attr_list, @@ -1057,7 +1059,7 @@ format_deref_x(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, "\"%s\"\n", fname, cref); continue; } - wrap_search_internal_get_entry(refdn, filter, attrs, &ref, + wrap_search_internal_get_entry(pb, refdn, filter, attrs, &ref, state->plugin_identity); if (ref == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, @@ -1271,7 +1273,7 @@ format_deref_rx(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, &list->links[i].base_sdn_list2, slapi_sdn_get_ndn(parent)); /* Pull up the named entry. */ - wrap_search_internal_get_entry(these[j], + wrap_search_internal_get_entry(pb, these[j], NULL, attrs, &entry, state->plugin_identity); @@ -1315,13 +1317,13 @@ format_deref_rx(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, } /* Let's visit the named entry this * time, in case we're nesting. */ - format_add_filtered_sdn_list(&these, &these2, + format_add_filtered_sdn_list(pb, &these, &these2, cvalue, list->links[i + 1].filter_str, state->plugin_identity); /* We need to visit the named entry * next time. */ - format_add_filtered_sdn_list(&next, &next2, + format_add_filtered_sdn_list(pb, &next, &next2, cvalue, list->links[i + 1].filter_str, state->plugin_identity); @@ -1586,7 +1588,7 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, * examine. */ set_filter = NULL; set_bases = NULL; - backend_get_set_config(state, group, other_set, + backend_get_set_config(pb, state, group, other_set, &set_bases, &set_filter); if (set_bases == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, @@ -1640,7 +1642,7 @@ format_referred(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, attrs[1] = NULL; for (i = 0; (set_bases != NULL) && (set_bases[i] != NULL); i++) { /* Set up the search. */ - local_pb = slapi_pblock_new(); + local_pb = wrap_pblock_new(pb); slapi_search_internal_set_pb(local_pb, set_bases[i], LDAP_SCOPE_SUBTREE, filter, attrs, FALSE, @@ -1828,7 +1830,7 @@ format_referred_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, /* Get the searching parameters for the set which contains the entry, * and all of the referred-to sets, and save them for use at the last * link in the chain. */ - backend_get_set_config(state, group, set, + backend_get_set_config(pb, state, group, set, &set_bases, &set_filter); for (i = 0; (set_bases != NULL) && (set_bases[i] != NULL); i++) { format_add_sdn_list(&(list->links[0].base_sdn_list), @@ -1837,7 +1839,7 @@ format_referred_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, } backend_free_set_config(set_bases, set_filter); for (i = 0; i < list->n_links - 1; i++) { - backend_get_set_config(state, group, argv[i * 2], + backend_get_set_config(pb, state, group, argv[i * 2], &set_bases, &set_filter); for (j = 0; (set_bases != NULL) && (set_bases[j] != NULL); @@ -1896,7 +1898,7 @@ format_referred_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, "referred_r: searching under %s" " for \"%s\" (link=1.%d)\n", ndn, filter, i); - local_pb = slapi_pblock_new(); + local_pb = wrap_pblock_new(pb); slapi_search_internal_set_pb(local_pb, ndn, LDAP_SCOPE_SUBTREE, @@ -1937,7 +1939,7 @@ format_referred_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, "referred_r: searching under %s" " for \"%s\" (link=2.%d)\n", ndn, filter, i); - local_pb = slapi_pblock_new(); + local_pb = wrap_pblock_new(pb); slapi_search_internal_set_pb(local_pb, ndn, LDAP_SCOPE_SUBTREE, @@ -2017,7 +2019,7 @@ format_merge(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, /* Expand this argument. */ slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, "merge: expanding ->%s<-\n", argv[i]); - values = format_get_data_set(state, e, group, set, + values = format_get_data_set(state, pb, e, group, set, argv[i], disallowed, rel_attrs, ref_attrs, inref_attrs, ref_attr_list, inref_attr_list, @@ -2105,7 +2107,7 @@ format_match_generic(struct plugin_state *state, matches = NULL; count = 0; lengths = NULL; - values = format_get_data_set(state, e, group, set, + values = format_get_data_set(state, pb, e, group, set, argv[0], disallowed, rel_attrs, ref_attrs, inref_attrs, ref_attr_list, inref_attr_list, @@ -2157,7 +2159,7 @@ format_match_generic(struct plugin_state *state, /* Either no matches, or too many matches to store. */ default_value = NULL; if ((default_arg >= 0) && (argv[default_arg] != NULL)) { - default_value = format_get_data(state, e, + default_value = format_get_data(state, pb, e, group, set, argv[default_arg], disallowed, @@ -2553,7 +2555,7 @@ format_ifeq(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, } /* Evaluate the value expression to get a list of candidate values. */ - values = format_get_data_set(state, e, group, set, + values = format_get_data_set(state, pb, e, group, set, argv[1], disallowed, rel_attrs, ref_attrs, inref_attrs, ref_attr_list, inref_attr_list, @@ -2636,7 +2638,7 @@ format_collect(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, choices = NULL; for (i = 0; i < argc; i++) { /* Evaluate this argument. */ - values = format_get_data_set(state, e, group, set, + values = format_get_data_set(state, pb, e, group, set, argv[i], disallowed, rel_attrs, ref_attrs, inref_attrs, ref_attr_list, inref_attr_list, @@ -2752,7 +2754,7 @@ format_link(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, for (i = 0; i < argc; i += 3) { slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, "link: evaluating \"%s\"\n", argv[i]); - values[i / 3] = format_get_data_set(state, e, group, set, + values[i / 3] = format_get_data_set(state, pb, e, group, set, argv[i], disallowed, rel_attrs, ref_attrs, inref_attrs, @@ -2925,7 +2927,7 @@ format_unique(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, default_value = argv[1]; } ret = -ENOENT; - values = format_get_data_set(state, e, group, set, + values = format_get_data_set(state, pb, e, group, set, value_format, disallowed, rel_attrs, ref_attrs, inref_attrs, ref_attr_list, inref_attr_list, @@ -3821,7 +3823,8 @@ format_expand(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, } static char * -format_format(struct plugin_state *state, Slapi_Entry *e, +format_format(struct plugin_state *state, + Slapi_PBlock *parent_pb, Slapi_Entry *e, const char *group, const char *set, const char *fmt, const char *disallowed, struct format_choice **choices, @@ -3849,7 +3852,7 @@ format_format(struct plugin_state *state, Slapi_Entry *e, return NULL; } - pb = slapi_pblock_new(); + pb = wrap_pblock_new(parent_pb); i = format_expand(state, pb, e, group, set, fmt, disallowed, buf, buflen, choices, @@ -3909,7 +3912,8 @@ format_free_data(char *data) } } char * -format_get_data(struct plugin_state *state, Slapi_Entry *e, +format_get_data(struct plugin_state *state, + Slapi_PBlock *pb, Slapi_Entry *e, const char *group, const char *set, const char *fmt, const char *disallowed, char ***rel_attrs, @@ -3920,7 +3924,7 @@ format_get_data(struct plugin_state *state, Slapi_Entry *e, unsigned int *data_length) { unsigned int ignored; - return format_format(state, e, group, set, fmt, + return format_format(state, pb, e, group, set, fmt, disallowed, NULL, rel_attrs, ref_attrs, inref_attrs, @@ -3941,7 +3945,8 @@ format_free_data_set(char **data, unsigned int *data_lengths) free(data_lengths); } char ** -format_get_data_set(struct plugin_state *state, Slapi_Entry *e, +format_get_data_set(struct plugin_state *state, + Slapi_PBlock *pb, Slapi_Entry *e, const char *group, const char *set, const char *fmt, const char *disallowed, char ***rel_attrs, @@ -3957,7 +3962,7 @@ format_get_data_set(struct plugin_state *state, Slapi_Entry *e, int combinations, groupsize, i, j, k, offset, length, prev_offset; unsigned int template_len; choices = NULL; - template = format_format(state, e, group, set, fmt, disallowed, + template = format_format(state, pb, e, group, set, fmt, disallowed, &choices, rel_attrs, ref_attrs, inref_attrs, ref_attr_list, inref_attr_list, diff --git a/src/format.h b/src/format.h index ff3edda..0aa7d20 100644 --- a/src/format.h +++ b/src/format.h @@ -54,7 +54,8 @@ void format_add_sdn_list(struct slapi_dn ***list, struct slapi_dn ***list2, const char *dn); void format_free_data(char *data); -char *format_get_data(struct plugin_state *state, struct slapi_entry *e, +char *format_get_data(struct plugin_state *state, + struct slapi_pblock *pb, struct slapi_entry *e, const char *domain, const char *map, const char *fmt, const char *disallowed_chars, @@ -65,7 +66,8 @@ char *format_get_data(struct plugin_state *state, struct slapi_entry *e, struct format_ref_attr_list ***inref_attr_list, unsigned int *data_length); void format_free_data_set(char **data_set, unsigned int *data_lengths); -char **format_get_data_set(struct plugin_state *state, Slapi_Entry *e, +char **format_get_data_set(struct plugin_state *state, + Slapi_PBlock *pb, Slapi_Entry *e, const char *domain, const char *map, const char *fmt, const char *disallowed, @@ -293,7 +293,7 @@ bool_t map_data_foreach_entry_id(struct plugin_state *state, const char *domain, const char *map, const char *id, bool_t (*fn)(const char *domain, const char *map, - bool_t secure, + bool_t secure, const char *key, unsigned int key_len, const char *value, @@ -389,7 +389,10 @@ int map_master_name(struct plugin_state *state, const char **master) { char *tmp, hostname[HOST_NAME_MAX + 1]; - if (backend_read_master_name(state, &tmp) == 0) { + Slapi_PBlock *pb; + + pb = slapi_pblock_new(); + if (backend_read_master_name(state, pb, &tmp) == 0) { free(map_data.master); map_data.master = strdup(tmp); backend_free_master_name(state, tmp); @@ -402,6 +405,7 @@ map_master_name(struct plugin_state *state, const char **master) map_data.master = strdup(hostname); } *master = map_data.master; + slapi_pblock_destroy(pb); return 0; } @@ -640,7 +644,7 @@ map_data_check_entry(struct plugin_state *state, { return (map_data_find_map_entry_id(state, map_data_find_map(state, - domain_name, + domain_name, map_name), id) != NULL); } diff --git a/src/plug-nis.c b/src/plug-nis.c index ca3a253..bc6b899 100644 --- a/src/plug-nis.c +++ b/src/plug-nis.c @@ -88,7 +88,7 @@ plugin_startup(Slapi_PBlock *pb) state->plugin_base ? state->plugin_base : "NULL", state->plugin_base ? "\"" : ""); /* Populate the maps and data. */ - backend_startup(state); + backend_startup(pb, state); /* Start a new listening thread to handle incoming traffic. */ state->tid = wrap_start_thread(&dispatch_thread, state); if (state->tid == NULL) { diff --git a/src/plug-sch.c b/src/plug-sch.c index 5315acd..e39b0cf 100644 --- a/src/plug-sch.c +++ b/src/plug-sch.c @@ -105,7 +105,7 @@ plugin_startup(Slapi_PBlock *pb) state->plugin_base ? state->plugin_base : "NULL", state->plugin_base ? "\"" : ""); /* Populate the tree of fake entries. */ - backend_startup(state); + backend_startup(pb, state); /* Note that the plugin is ready to go. */ slapi_log_error(SLAPI_LOG_PLUGIN, plugin_description.spd_id, "plugin startup completed\n"); @@ -229,8 +229,8 @@ schema_compat_plugin_init(Slapi_PBlock *pb) "error registering internal postoperation plugin\n"); return -1; } -#if 0 #ifdef USE_SLAPI_BE_TXNS +#if 0 if (slapi_register_plugin("betxnpostoperation", TRUE, "schema_compat_plugin_init_be_txn_postop", schema_compat_plugin_init_be_txn_postop, |
