From 0ba4eb97ce47746fc81353748d9090cedab16b26 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Tue, 27 Aug 2013 13:53:39 -0400 Subject: Directly return lists when making single queries --- src/back-sch-nss.c | 77 +++++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/back-sch-nss.c b/src/back-sch-nss.c index fd13c8e..79efd0b 100644 --- a/src/back-sch-nss.c +++ b/src/back-sch-nss.c @@ -248,13 +248,14 @@ backend_make_user_entry_from_nsswitch_passwd(struct passwd *pwd, return entry; } -static Slapi_Entry * +static Slapi_Entry ** backend_retrieve_user_entry_from_nsswitch(char *user_name, bool_t is_uid, char *container_sdn, - struct backend_search_cbdata *cbdata) + struct backend_search_cbdata *cbdata, + int *count) { struct passwd pwd, *result; - Slapi_Entry *entry; + Slapi_Entry *entry, **entries; int rc; char *name; char *buf = NULL; @@ -290,8 +291,16 @@ repeat: entry = backend_make_user_entry_from_nsswitch_passwd(&pwd, container_sdn, cbdata); + entries = malloc(sizeof(entries[0]) * 2); + if (entries != NULL) { + entries[0] = entry; + entries[1] = NULL; + *count = 1; + } else { + slapi_entry_free(entry); + } - return entry; + return entries; } static Slapi_Entry * @@ -352,13 +361,14 @@ backend_make_group_entry_from_nsswitch_group(struct group *grp, return entry; } -static Slapi_Entry * +static Slapi_Entry ** backend_retrieve_group_entry_from_nsswitch(char *group_name, bool_t is_gid, char *container_sdn, - struct backend_search_cbdata *cbdata) + struct backend_search_cbdata *cbdata, + int *count) { struct group grp, *result; - Slapi_Entry *entry; + Slapi_Entry *entry, **entries; int rc; char *buf = NULL; @@ -393,8 +403,16 @@ repeat: entry = backend_make_group_entry_from_nsswitch_group(&grp, container_sdn, cbdata); + entries = malloc(sizeof(entries[0]) * 2); + if (entries != NULL) { + entries[0] = entry; + entries[1] = NULL; + *count = 1; + } else { + slapi_entry_free(entry); + } - return entry; + return entries; } static Slapi_Entry * @@ -490,7 +508,7 @@ repeat: } } while (rc != ngroups); - entries = calloc(ngroups, sizeof(Slapi_Entry *)); + entries = calloc(ngroups + 1, sizeof(entries[0])); if (entries == NULL) { free(grouplist); return NULL; @@ -504,11 +522,12 @@ repeat: if (entry != NULL) { entries[idx] = entry; idx++; + entries[idx] = NULL; } } if (idx != ngroups) { - tmp = realloc(entries, idx * sizeof(Slapi_Entry *)); + tmp = realloc(entries, (idx + 1) * sizeof(entries[0])); if (tmp != NULL) { entries = tmp; } @@ -630,7 +649,7 @@ bool_t backend_retrieve_from_nsswitch(struct backend_staged_search *staged, struct backend_search_cbdata *cbdata) { - Slapi_Entry *entry, **entries; + Slapi_Entry **entries; if (((staged->type == SCH_NSSWITCH_GROUP) && staged->search_members) && (NULL != staged->name)) { @@ -644,35 +663,23 @@ backend_retrieve_from_nsswitch(struct backend_staged_search *staged, } if ((staged->type == SCH_NSSWITCH_GROUP) && (NULL != staged->name)) { - entry = backend_retrieve_group_entry_from_nsswitch(staged->name, staged->is_id, - staged->container_sdn, - cbdata); - if (entry != NULL) { - staged->entries = malloc(sizeof(staged->entries[0])); - if (staged->entries != NULL) { - staged->entries[0] = entry; - staged->count = 1; - return TRUE; - } else { - slapi_entry_free(entry); - } + entries = backend_retrieve_group_entry_from_nsswitch(staged->name, staged->is_id, + staged->container_sdn, + cbdata, &staged->count); + if (entries != NULL) { + staged->entries = entries; + return TRUE; } return FALSE; } if ((staged->type == SCH_NSSWITCH_USER) && (NULL != staged->name)) { - entry = backend_retrieve_user_entry_from_nsswitch(staged->name, staged->is_id, - staged->container_sdn, - cbdata); - if (entry != NULL) { - staged->entries = malloc(sizeof(staged->entries[0])); - if (staged->entries != NULL) { - staged->entries[0] = entry; - staged->count = 1; - return TRUE; - } else { - slapi_entry_free(entry); - } + entries = backend_retrieve_user_entry_from_nsswitch(staged->name, staged->is_id, + staged->container_sdn, + cbdata, &staged->count); + if (entries != NULL) { + staged->entries = entries; + return TRUE; } return FALSE; } -- cgit