diff options
author | Nalin Dahyabhai <nalin@dahyabhai.net> | 2013-09-12 15:32:27 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin@dahyabhai.net> | 2013-09-12 15:32:27 -0400 |
commit | fc646c3c86afc0c7817207bb598deb0df11387fa (patch) | |
tree | b54902510bb308fe5b61496bf1ed9f6cf7eac704 /src/back-shr.c | |
parent | eb43fd14cbe47e014139838200f31e01e1fc8a10 (diff) | |
download | slapi-nis-fc646c3c86afc0c7817207bb598deb0df11387fa.tar.gz slapi-nis-fc646c3c86afc0c7817207bb598deb0df11387fa.tar.xz slapi-nis-fc646c3c86afc0c7817207bb598deb0df11387fa.zip |
Add schema-compat-relevant-subtree
Add a schema-compat-relevant-subtree configuration option, listing the
only parts of the DIT that we should ever look at, either as source
entries or as other entries which contain data which might be pulled in
as part of computing the contents of compat entries.
This is more or less the whitelist to schema-compat-ignore-subtree's
blacklist.
Diffstat (limited to 'src/back-shr.c')
-rw-r--r-- | src/back-shr.c | 31 |
1 files changed, 29 insertions, 2 deletions
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. */ |