summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@redhat.com>2010-11-18 13:09:06 -0500
committerNalin Dahyabhai <nalin@redhat.com>2010-11-18 13:09:06 -0500
commit6f1e6643a7afe4ee553a211a15a91cb363ec4356 (patch)
tree9419026b074395c6df925e03a318bff5c554819b
parentc78d5a258960a0836cbf127a69c9ff9a9670bacf (diff)
downloadslapi-nis-6f1e6643a7afe4ee553a211a15a91cb363ec4356.tar.gz
slapi-nis-6f1e6643a7afe4ee553a211a15a91cb363ec4356.tar.xz
slapi-nis-6f1e6643a7afe4ee553a211a15a91cb363ec4356.zip
- manage filters along with chains of attributes and search bases
-rw-r--r--src/format.c26
-rw-r--r--src/format.h1
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;