diff options
-rw-r--r-- | configure.ac | 7 | ||||
-rw-r--r-- | src/back-nis.c | 3 | ||||
-rw-r--r-- | src/back-sch.c | 8 | ||||
-rw-r--r-- | src/back-shr.c | 31 | ||||
-rw-r--r-- | src/backend.h | 3 |
5 files changed, 47 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac index 0d05c1f..44a665e 100644 --- a/configure.ac +++ b/configure.ac @@ -466,9 +466,12 @@ AC_DEFINE_UNQUOTED(SCH_CONTAINER_CONFIGURATION_ACCESS_ATTR,"$checkaciattr", schbaseattr=schema-compat-search-base AC_DEFINE_UNQUOTED(SCH_CONTAINER_CONFIGURATION_BASE_ATTR,"$schbaseattr", [Define to name of the attribute which lists the containers to search when locating entries to be used for constructing entries for a given container.]) -schignoreattr=schema-compat-ignore-subtree -AC_DEFINE_UNQUOTED(SCH_CONTAINER_CONFIGURATION_IGNORE_SUBTREES_ATTR,"$schignoreattr", +schignoresubtreeattr=schema-compat-ignore-subtree +AC_DEFINE_UNQUOTED(SCH_CONTAINER_CONFIGURATION_IGNORE_SUBTREES_ATTR,"$schignoresubtreeattr", [Define to name of the attribute which lists the subtrees to ignore when locating entries and reading data to be used for constructing entries for a given container.]) +schrelevantsubtreeattr=schema-compat-relevant-subtree +AC_DEFINE_UNQUOTED(SCH_CONTAINER_CONFIGURATION_RELEVANT_SUBTREES_ATTR,"$schrelevantsubtreeattr", + [Define to name of the attribute which lists the only subtrees which are relevant when locating entries and reading data to be used for constructing entries for a given container.]) schfilterattr=schema-compat-search-filter AC_DEFINE_UNQUOTED(SCH_CONTAINER_CONFIGURATION_FILTER_ATTR,"$schfilterattr", [Define to name of the attribute which holds the filter for selecting entries to be used for constructing entries for a given container.]) diff --git a/src/back-nis.c b/src/back-nis.c index f747f49..69a9c73 100644 --- a/src/back-nis.c +++ b/src/back-nis.c @@ -121,6 +121,7 @@ backend_copy_set_data(const struct backend_set_data *data) ret->common.set = strdup(data->common.set); ret->common.bases = backend_shr_dup_strlist(data->common.bases); ret->common.entry_filter = strdup(data->common.entry_filter); + ret->common.relevant_subtrees = NULL; ret->common.ignore_subtrees = NULL; ret->common.rel_attrs = data->common.rel_attrs ? format_dup_attr_list(data->common.rel_attrs) : @@ -605,6 +606,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, ret.common.set = strdup(map); ret.common.bases = use_bases; ret.common.entry_filter = use_entry_filter; + ret.common.relevant_subtrees = NULL; ret.common.ignore_subtrees = NULL; ret.common.rel_attrs = NULL; ret.common.rel_attr_list = NULL; @@ -706,6 +708,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, free(ret.common.group); free(ret.common.set); backend_shr_free_strlist(ret.common.bases); + backend_shr_free_sdnlist(ret.common.relevant_subtrees); free(ret.disallowed_chars); free(ret.common.entry_filter); backend_shr_free_strlist(ret.key_formats); diff --git a/src/back-sch.c b/src/back-sch.c index 047f2dc..3130fbc 100644 --- a/src/back-sch.c +++ b/src/back-sch.c @@ -79,6 +79,7 @@ backend_set_config_free_config_contents(void *data) free(set_data->common.group); free(set_data->common.set); free(set_data->common.bases); + backend_shr_free_sdnlist(set_data->common.relevant_subtrees); backend_shr_free_sdnlist(set_data->common.ignore_subtrees); format_free_attr_list(set_data->common.rel_attrs); free(set_data->common.rel_attr_list); @@ -111,6 +112,7 @@ backend_copy_set_config(const struct backend_set_data *data) 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.relevant_subtrees = backend_shr_dup_sdnlist(data->common.relevant_subtrees); ret->common.ignore_subtrees = backend_shr_dup_sdnlist(data->common.ignore_subtrees); ret->common.rel_attrs = data->common.rel_attrs ? format_dup_attr_list(data->common.rel_attrs) : @@ -162,11 +164,13 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, bool_t check_access; struct backend_set_data ret; Slapi_DN *tmp_sdn; - const Slapi_DN **ignore_subtrees; + const Slapi_DN **relevant_subtrees, **ignore_subtrees; /* Read the values from the configuration entry. */ bases = backend_shr_get_vattr_strlist(state, e, SCH_CONTAINER_CONFIGURATION_BASE_ATTR); + relevant_subtrees = backend_shr_get_vattr_sdnlist(state, e, + SCH_CONTAINER_CONFIGURATION_RELEVANT_SUBTREES_ATTR); ignore_subtrees = backend_shr_get_vattr_sdnlist(state, e, SCH_CONTAINER_CONFIGURATION_IGNORE_SUBTREES_ATTR); entry_filter = backend_shr_get_vattr_filter(state, e, @@ -189,6 +193,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, slapi_sdn_free(&tmp_sdn); ret.common.set = strdup(container); ret.common.bases = bases; + ret.common.relevant_subtrees = relevant_subtrees; ret.common.ignore_subtrees = ignore_subtrees; ret.common.entry_filter = entry_filter; ret.common.rel_attrs = NULL; @@ -254,6 +259,7 @@ backend_set_config_read_config(struct plugin_state *state, Slapi_Entry *e, free(ret.common.group); free(ret.common.set); backend_shr_free_strlist(ret.common.bases); + backend_shr_free_sdnlist(ret.common.relevant_subtrees); backend_shr_free_sdnlist(ret.common.ignore_subtrees); free(ret.common.entry_filter); slapi_sdn_free(&ret.container_sdn); diff --git a/src/back-shr.c b/src/back-shr.c index cabd01c..00ca097 100644 --- a/src/back-shr.c +++ b/src/back-shr.c @@ -317,7 +317,7 @@ backend_shr_free_sdnlist(const Slapi_DN **sdnlist) { int i; for (i = 0; (sdnlist != NULL) && (sdnlist[i] != NULL); i++) { - slapi_sdn_free(&sdnlist[i]); + slapi_sdn_free((Slapi_DN **) &sdnlist[i]); sdnlist[i] = NULL; } free(sdnlist); @@ -791,11 +791,12 @@ static bool_t backend_shr_entry_matches_set(struct backend_shr_set_data *set_data, Slapi_PBlock *pb, Slapi_Entry *e) { - const Slapi_DN **ignore_subtrees; + const Slapi_DN **relevant_subtrees, **ignore_subtrees; char **set_bases; char *set_filter; int i; + relevant_subtrees = set_data->relevant_subtrees; ignore_subtrees = set_data->ignore_subtrees; set_bases = set_data->bases; set_filter = set_data->entry_filter; @@ -809,6 +810,19 @@ backend_shr_entry_matches_set(struct backend_shr_set_data *set_data, } } } + if (relevant_subtrees != NULL) { + for (i = 0; relevant_subtrees[i] != NULL; i++) { + if (slapi_sdn_scope_test(slapi_entry_get_sdn_const(e), + relevant_subtrees[i], + LDAP_SCOPE_SUBTREE) != 0) { + break; + } + } + if (relevant_subtrees[i] == NULL) { + /* Non-empty list, but no match. */ + return FALSE; + } + } if (set_bases != NULL) { for (i = 0; set_bases[i] != NULL; i++) { @@ -1013,6 +1027,19 @@ backend_shr_update_references_cb(const char *group, const char *set, } } } + if (set_data->relevant_subtrees != NULL) { + for (i = 0; set_data->relevant_subtrees[i] != NULL; i++) { + if (slapi_sdn_scope_test(slapi_entry_get_sdn_const(cbdata->e), + set_data->relevant_subtrees[i], + LDAP_SCOPE_SUBTREE) != 0) { + break; + } + } + if (set_data->relevant_subtrees[i] == NULL) { + /* Non-empty list, but no match. */ + return TRUE; + } + } /* If the entry didn't change any attributes which are at all relevant * to this map, then we don't need to recompute anything. */ diff --git a/src/backend.h b/src/backend.h index be6693d..8c00dd4 100644 --- a/src/backend.h +++ b/src/backend.h @@ -46,6 +46,9 @@ struct backend_shr_set_data { /* Configuration flag indicating whether or not we try to skip * recomputing data in this map. */ unsigned int skip_uninteresting_updates:1; + /* Subtrees under which all of the contents that we care about will be + * stored. Other locaoins will be silently ignored. */ + const struct slapi_dn **relevant_subtrees; /* Subtrees under which we ignore contents. */ const struct slapi_dn **ignore_subtrees; struct backend_set_data *self; |