summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@dahyabhai.net>2013-08-27 13:53:39 -0400
committerNalin Dahyabhai <nalin@dahyabhai.net>2013-08-27 13:53:39 -0400
commit0ba4eb97ce47746fc81353748d9090cedab16b26 (patch)
tree44fe98b671b05e8fb3ad5f9e0e0a8707e124e653 /src
parentae0b504db9951ded97afff8c1ed78e8916743c2e (diff)
downloadslapi-nis-0ba4eb97ce47746fc81353748d9090cedab16b26.tar.gz
slapi-nis-0ba4eb97ce47746fc81353748d9090cedab16b26.tar.xz
slapi-nis-0ba4eb97ce47746fc81353748d9090cedab16b26.zip
Directly return lists when making single queries
Diffstat (limited to 'src')
-rw-r--r--src/back-sch-nss.c77
1 files changed, 42 insertions, 35 deletions
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;
}