diff options
Diffstat (limited to 'source3/nsswitch')
-rw-r--r-- | source3/nsswitch/wb_client.c | 122 |
1 files changed, 0 insertions, 122 deletions
diff --git a/source3/nsswitch/wb_client.c b/source3/nsswitch/wb_client.c index 613bb1cc60..afb6202754 100644 --- a/source3/nsswitch/wb_client.c +++ b/source3/nsswitch/wb_client.c @@ -539,128 +539,6 @@ BOOL winbind_set_gid_hwm(unsigned long id) return (result == NSS_STATUS_SUCCESS); } -/* Fetch the list of groups a user is a member of from winbindd. This is - used by winbind_getgroups. */ - -static int wb_getgroups(const char *user, gid_t **groups) -{ - struct winbindd_request request; - struct winbindd_response response; - int result; - - /* Call winbindd */ - - ZERO_STRUCT(request); - fstrcpy(request.data.username, user); - - ZERO_STRUCT(response); - - result = winbindd_request_response(WINBINDD_GETGROUPS, &request, &response); - - if (result == NSS_STATUS_SUCCESS) { - - /* Return group list. Don't forget to free the group list - when finished. */ - - *groups = (gid_t *)response.extra_data.data; - return response.data.num_entries; - } - - return -1; -} - -/* Call winbindd to initialise group membership. This is necessary for - some systems (i.e RH5.2) that do not have an initgroups function as part - of the nss extension. In RH5.2 this is implemented using getgrent() - which can be amazingly inefficient as well as having problems with - username case. */ - -int winbind_initgroups(char *user, gid_t gid) -{ - gid_t *groups = NULL; - int result; - - /* Call normal initgroups if we are a local user */ - - if (!strchr(user, *lp_winbind_separator())) { - return initgroups(user, gid); - } - - result = wb_getgroups(user, &groups); - - DEBUG(10,("winbind_getgroups: %s: result = %s\n", user, - result == -1 ? "FAIL" : "SUCCESS")); - - if (result != -1) { - int ngroups = result, i; - BOOL is_member = False; - - /* Check to see if the passed gid is already in the list */ - - for (i = 0; i < ngroups; i++) { - if (groups[i] == gid) { - is_member = True; - } - } - - /* Add group to list if necessary */ - - if (!is_member) { - groups = SMB_REALLOC_ARRAY(groups, gid_t, ngroups + 1); - if (!groups) { - errno = ENOMEM; - result = -1; - goto done; - } - - groups[ngroups] = gid; - ngroups++; - } - - /* Set the groups */ - - if (sys_setgroups(ngroups, groups) == -1) { - errno = EPERM; - result = -1; - goto done; - } - - } else { - - /* The call failed. Set errno to something so we don't get - a bogus value from the last failed system call. */ - - errno = EIO; - } - - /* Free response data if necessary */ - - done: - SAFE_FREE(groups); - - return result; -} - -/* Return a list of groups the user is a member of. This function is - useful for large systems where inverting the group database would be too - time consuming. If size is zero, list is not modified and the total - number of groups for the user is returned. */ - -int winbind_getgroups(const char *user, gid_t **list) -{ - /* - * Don't do the lookup if the name has no separator _and_ we are not in - * 'winbind use default domain' mode. - */ - - if (!(strchr(user, *lp_winbind_separator()) || lp_winbind_use_default_domain())) - return -1; - - /* Fetch list of groups */ - - return wb_getgroups(user, list); -} - /********************************************************************** simple wrapper function to see if winbindd is alive **********************************************************************/ |