diff options
author | Nalin Dahyabhai <nalin@redhat.com> | 2010-11-18 13:09:06 -0500 |
---|---|---|
committer | Nalin Dahyabhai <nalin@redhat.com> | 2010-11-18 13:09:06 -0500 |
commit | 6f1e6643a7afe4ee553a211a15a91cb363ec4356 (patch) | |
tree | 9419026b074395c6df925e03a318bff5c554819b /src | |
parent | c78d5a258960a0836cbf127a69c9ff9a9670bacf (diff) | |
download | slapi-nis-6f1e6643a7afe4ee553a211a15a91cb363ec4356.tar.gz slapi-nis-6f1e6643a7afe4ee553a211a15a91cb363ec4356.tar.xz slapi-nis-6f1e6643a7afe4ee553a211a15a91cb363ec4356.zip |
- manage filters along with chains of attributes and search bases
Diffstat (limited to 'src')
-rw-r--r-- | src/format.c | 26 | ||||
-rw-r--r-- | src/format.h | 1 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/format.c b/src/format.c index aa49cda..a877e35 100644 --- a/src/format.c +++ b/src/format.c @@ -182,7 +182,7 @@ format_add_sdn_list(struct slapi_dn ***list, const char *dn) } /* Maintain a reference attribute list, which is group of lists of attribute - * names and search bases. */ + * names, filters, and search bases. */ void format_free_ref_attr_list(struct format_ref_attr_list **list) { @@ -193,6 +193,7 @@ format_free_ref_attr_list(struct format_ref_attr_list **list) for (i = 0; list[i] != NULL; i++) { for (j = 0; j < list[i]->n_links; j++) { free(list[i]->links[j].attribute); + free(list[i]->links[j].filter); sdn_list = list[i]->links[j].base_sdn_list; format_free_sdn_list(sdn_list); } @@ -231,6 +232,8 @@ format_dup_ref_attr_list(struct format_ref_attr_list **list) format_free_ref_attr_list(ret); return NULL; } + memset(ret[i]->links, 0, + sizeof(*(ret[i]->links)) * list[i]->n_links); for (j = 0; j < list[i]->n_links; j++) { ret[i]->links[j].attribute = strdup(list[i]->links[j].attribute); @@ -238,6 +241,14 @@ format_dup_ref_attr_list(struct format_ref_attr_list **list) format_free_ref_attr_list(ret); return NULL; } + if (list[i]->links[j].filter != NULL) { + ret[i]->links[j].filter = + strdup(list[i]->links[j].filter); + if (ret[i]->links[j].filter == NULL) { + format_free_ref_attr_list(ret); + return NULL; + } + } sdn_list = list[i]->links[j].base_sdn_list; ret[i]->links[j].base_sdn_list = format_dup_sdn_list(sdn_list); @@ -278,7 +289,7 @@ format_find_ref_attr_list(struct format_ref_attr_list **list, static struct format_ref_attr_list ** format_add_ref_attr_list(struct format_ref_attr_list ***list, const char *group, const char *set, - const char **names) + const char **names, const char **filters) { struct format_ref_attr_list **ret; unsigned int i; @@ -318,6 +329,13 @@ format_add_ref_attr_list(struct format_ref_attr_list ***list, format_free_ref_attr_list(ret); return NULL; } + if ((filters != NULL) && (filters[j] != NULL)) { + ret[i]->links[j].filter = strdup(names[j]); + if (ret[i]->links[j].filter == NULL) { + format_free_ref_attr_list(ret); + return NULL; + } + } ret[i]->links[j].base_sdn_list = NULL; } ret[i]->group = strdup(group); @@ -1043,7 +1061,7 @@ format_deref_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, /* Note that this list of attributes is used for pulling up data. */ format_add_ref_attr_list(ref_attr_list, group, set, - (const char **) argv); + (const char **) argv, NULL); list = format_find_ref_attr_list(*ref_attr_list, group, set, (const char **) argv); @@ -1489,7 +1507,7 @@ format_referred_r(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e, attr_links[i] = NULL; /* Note this list of attributes. */ - format_add_ref_attr_list(inref_attr_list, group, set, attr_links); + format_add_ref_attr_list(inref_attr_list, group, set, attr_links, NULL); list = format_find_ref_attr_list(*inref_attr_list, group, set, attr_links); free(attr_links); diff --git a/src/format.h b/src/format.h index d9e8302..1a30965 100644 --- a/src/format.h +++ b/src/format.h @@ -33,6 +33,7 @@ struct format_ref_attr_list { char *group, *set; struct format_ref_attr_list_link { char *attribute; + char *filter; struct slapi_dn **base_sdn_list; } *links; int n_links; |