diff options
author | Jeremy Allison <jra@samba.org> | 2001-12-14 21:51:09 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2001-12-14 21:51:09 +0000 |
commit | 59e01a22c5cb1046758c8cd6b09333c19d6cd26e (patch) | |
tree | 8a88477f609d2d33943acfb7839590414a7dda63 /source/lib | |
parent | 07ea83e6f0f03ba4706c98abb58346a4f4ec983c (diff) | |
download | samba-59e01a22c5cb1046758c8cd6b09333c19d6cd26e.tar.gz samba-59e01a22c5cb1046758c8cd6b09333c19d6cd26e.tar.xz samba-59e01a22c5cb1046758c8cd6b09333c19d6cd26e.zip |
Added the group enum code from 2.2
Jeremy.
Diffstat (limited to 'source/lib')
-rw-r--r-- | source/lib/username.c | 28 | ||||
-rw-r--r-- | source/lib/util_getent.c | 81 |
2 files changed, 96 insertions, 13 deletions
diff --git a/source/lib/username.c b/source/lib/username.c index 3562ab3b958..e65f1338123 100644 --- a/source/lib/username.c +++ b/source/lib/username.c @@ -344,10 +344,10 @@ failed with error %s\n", strerror(errno) )); goto err; } - /* - * Now we have the gid list for this user - convert the gname - * to a gid_t via either winbind or the local UNIX lookup and do the comparison. - */ + /* + * Now we have the gid list for this user - convert the gname + * to a gid_t via either winbind or the local UNIX lookup and do the comparison. + */ if ((gid = nametogid(gname)) == (gid_t)-1) { DEBUG(0,("user_in_winbind_group_list: winbind_lookup_name for group %s failed.\n", @@ -379,9 +379,9 @@ failed with error %s\n", strerror(errno) )); static BOOL user_in_unix_group_list(const char *user,const char *gname) { - struct group *gptr; - char **member; struct passwd *pass = Get_Pwnam(user); + struct sys_userlist *user_list; + struct sys_userlist *member; DEBUG(10,("user_in_unix_group_list: checking user %s in group %s\n", user, gname)); @@ -397,20 +397,22 @@ static BOOL user_in_unix_group_list(const char *user,const char *gname) } } - if ((gptr = (struct group *)getgrnam(gname)) == NULL) { + user_list = get_users_in_group(gname); + if (user_list == NULL) { DEBUG(10,("user_in_unix_group_list: no such group %s\n", gname )); return False; } - - member = gptr->gr_mem; - while (member && *member) { - DEBUG(10,("user_in_unix_group_list: checking user %s against member %s\n", user, *member )); - if (strequal(*member,user)) { + + for (member = user_list; member; member = member->next) { + DEBUG(10,("user_in_unix_group_list: checking user %s against member %s\n", + user, member->unix_name )); + if (strequal(member->unix_name,user)) { + free_userlist(user_list); return(True); } - member++; } + free_userlist(user_list); return False; } diff --git a/source/lib/util_getent.c b/source/lib/util_getent.c index 4393debabae..81b36effcb4 100644 --- a/source/lib/util_getent.c +++ b/source/lib/util_getent.c @@ -3,6 +3,7 @@ Version 3.0 Samba utility functions Copyright (C) Simo Sorce 2001 + Copyright (C) Jeremy Allison 2001 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -230,3 +231,83 @@ void pwent_free (struct sys_pwent *plist) SAFE_FREE(prev); } } + +/**************************************************************** + Add the individual group users onto the list. +****************************************************************/ + +static struct sys_userlist *add_members_to_userlist(struct sys_userlist *list_head, const struct group *grp) +{ + size_t num_users, i; + + /* Count the number of users. */ + for (num_users = 0; grp->gr_mem[num_users]; num_users++) + ; + + for (i = 0; i < num_users; i++) { + struct sys_userlist *entry = (struct sys_userlist *)malloc(sizeof(*entry)); + size_t len = strlen(grp->gr_mem[i])+1; + if (entry == NULL) { + free_userlist(list_head); + return NULL; + } + entry->unix_name = (char *)malloc(len); + if (entry->unix_name == NULL) { + SAFE_FREE(entry); + free_userlist(list_head); + return NULL; + } + safe_strcpy(entry->unix_name, grp->gr_mem[i],len); + DLIST_ADD(list_head, entry); + } + return list_head; +} + +/**************************************************************** + Get the list of UNIX users in a group. + We have to enumerate the /etc/group file as some UNIX getgrnam() + calls won't do that for us (notably Tru64 UNIX). +****************************************************************/ + +struct sys_userlist *get_users_in_group(const char *gname) +{ + struct sys_userlist *list_head = NULL; + struct group *gptr; + + /* + * If we're doing this via winbindd, don't do the + * entire group list enumeration as we know this is + * pointless (and slow). + */ + + if (strchr(gname,*lp_winbind_separator())) { + if ((gptr = (struct group *)getgrnam(gname)) == NULL) + return NULL; + return add_members_to_userlist(list_head, gptr); + } + + setgrent(); + while((gptr = getgrent()) != NULL) { + if (strequal(gname, gptr->gr_name)) { + list_head = add_members_to_userlist(list_head, gptr); + if (list_head == NULL) + return NULL; + } + } + endgrent(); + return list_head; +} + +/**************************************************************** + Free list allocated above. +****************************************************************/ + +void free_userlist(struct sys_userlist *list_head) +{ + while (list_head) { + struct sys_userlist *old_head = list_head; + DLIST_REMOVE(list_head, list_head); + SAFE_FREE(old_head->unix_name); + SAFE_FREE(old_head); + } +} |