diff options
author | Luke Leighton <lkcl@samba.org> | 1999-02-03 00:49:24 +0000 |
---|---|---|
committer | Luke Leighton <lkcl@samba.org> | 1999-02-03 00:49:24 +0000 |
commit | 1153f00f889e5bb310e895d319eed75bc93deef4 (patch) | |
tree | 992b761fc48443b56324b1403708d4d0ff22c813 /source3/groupdb/groupunix.c | |
parent | fe609d810e145d5491968fee5d691d6eee41e152 (diff) | |
download | samba-1153f00f889e5bb310e895d319eed75bc93deef4.tar.gz samba-1153f00f889e5bb310e895d319eed75bc93deef4.tar.bz2 samba-1153f00f889e5bb310e895d319eed75bc93deef4.zip |
cache unix groups so that two-level getgrent calls don't occur.
(This used to be commit f7dfa55a2e191ae780d399026bce48f68cda4bf0)
Diffstat (limited to 'source3/groupdb/groupunix.c')
-rw-r--r-- | source3/groupdb/groupunix.c | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/source3/groupdb/groupunix.c b/source3/groupdb/groupunix.c index 35f386cbf8..a8f40a313a 100644 --- a/source3/groupdb/groupunix.c +++ b/source3/groupdb/groupunix.c @@ -31,10 +31,32 @@ extern DOM_SID global_sam_sid; to ensure no modification outside this module. ****************************************************************/ +struct unix_entries +{ + struct group *grps; + int num_grps; + int grp_idx; +}; + static void *startgrpunixpwent(BOOL update) { - setgrent(); - return (void*)(-1); + struct unix_entries *grps; + grps = (struct unix_entries*)malloc(sizeof(struct unix_entries)); + + if (grps == NULL) + { + return NULL; + } + + if (!get_unix_grps(&grps->num_grps, &grps->grps)) + { + free(grps); + return NULL; + } + + grps->grp_idx = 0; + + return (void*)grps; } /*************************************************************** @@ -43,7 +65,13 @@ static void *startgrpunixpwent(BOOL update) static void endgrpunixpwent(void *vp) { - endgrent(); + struct unix_entries *grps = (struct unix_entries *)vp; + + if (grps != NULL) + { + free_unix_grps(grps->num_grps, grps->grps); + free(vp); + } } /************************************************************************* @@ -142,7 +170,13 @@ static DOMAIN_GRP *getgrpunixpwent(void *vp, DOMAIN_GRP_MEMBER **mem, int *num_m { /* Static buffers we will return. */ static DOMAIN_GRP gp_buf; - struct group *unix_grp; + struct group *unix_grp = NULL; + struct unix_entries *grps = (struct unix_entries *)vp; + + if (grps == NULL) + { + return NULL; + } if (lp_server_role() == ROLE_DOMAIN_NONE || lp_server_role() == ROLE_DOMAIN_MEMBER) @@ -161,10 +195,17 @@ static DOMAIN_GRP *getgrpunixpwent(void *vp, DOMAIN_GRP_MEMBER **mem, int *num_m fstrcpy(gp_buf.comment, ""); gp_buf.attr = 0x07; + /* get array of unix names + gids. this function does NOT + get a copy of the unix group members + */ + /* cycle through unix groups */ - while ((unix_grp = getgrent()) != NULL) + for (; grps->grp_idx < grps->num_grps; grps->grp_idx++) { DOM_NAME_MAP gmep; + + unix_grp = &grps->grps[grps->grp_idx]; + DEBUG(10,("getgrpunixpwent: enum unix group entry %s\n", unix_grp->gr_name)); @@ -186,10 +227,11 @@ static DOMAIN_GRP *getgrpunixpwent(void *vp, DOMAIN_GRP_MEMBER **mem, int *num_m } fstrcpy(gp_buf.name, gmep.nt_name); + grps->grp_idx++; break; } - if (unix_grp == NULL) + if (unix_grp == NULL || grps->grp_idx >= grps->num_grps) { return NULL; } @@ -201,6 +243,7 @@ static DOMAIN_GRP *getgrpunixpwent(void *vp, DOMAIN_GRP_MEMBER **mem, int *num_m (*mem) = NULL; (*num_mem) = 0; + unix_grp = getgrgid(unix_grp->gr_gid); get_unixgroup_members(unix_grp, num_mem, mem); } |