1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-03 12:58:35 +03:00
samba-mirror/source3/winbindd/winbindd_domain.c
Steven Danneman 96653e1ff7 Make WINBINDD_LIST_GROUPS handler asynchronous.
Previously WINBINDD_LIST_GROUPS requests (ex: wbinfo -g) were handled by the
winbindd parent process in a sequential fashion.  This patch, delegates the work
to the winbindd children so that the request is handled much faster in large
domain topologies, and doesn't block the parent from receiving new requests.

The core group enumeration and conversion that was handled in
winbindd_list_groups() has been moved into winbindd_dual_list_groups() to be
done by the child.

The parent winbindd_list_groups() simply calls each of the children
asynchronously.

listgroups_recv() aggregates the final group list that will be returned to the
client and tracks how many of the children have returned their lists.

The domain name of the child is passed back through the callbacks to be used in
debugging messages.

There are also several fixes to typos in various comments.
(This used to be commit 037b9689d9042a398cb91e4628a82fcdfa913c21)
2008-05-22 13:55:57 -05:00

116 lines
3.2 KiB
C

/*
Unix SMB/CIFS implementation.
Winbind domain child functions
Copyright (C) Stefan Metzmacher 2007
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
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
#include "winbindd.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_WINBIND
static const struct winbindd_child_dispatch_table domain_dispatch_table[];
void setup_domain_child(struct winbindd_domain *domain,
struct winbindd_child *child)
{
setup_child(child, domain_dispatch_table,
"log.wb", domain->name);
child->domain = domain;
}
static const struct winbindd_child_dispatch_table domain_dispatch_table[] = {
{
.name = "LOOKUPSID",
.struct_cmd = WINBINDD_LOOKUPSID,
.struct_fn = winbindd_dual_lookupsid,
},{
.name = "LOOKUPNAME",
.struct_cmd = WINBINDD_LOOKUPNAME,
.struct_fn = winbindd_dual_lookupname,
},{
.name = "LOOKUPRIDS",
.struct_cmd = WINBINDD_LOOKUPRIDS,
.struct_fn = winbindd_dual_lookuprids,
},{
.name = "LIST_GROUPS",
.struct_cmd = WINBINDD_LIST_GROUPS,
.struct_fn = winbindd_dual_list_groups,
},{
.name = "LIST_TRUSTDOM",
.struct_cmd = WINBINDD_LIST_TRUSTDOM,
.struct_fn = winbindd_dual_list_trusted_domains,
},{
.name = "INIT_CONNECTION",
.struct_cmd = WINBINDD_INIT_CONNECTION,
.struct_fn = winbindd_dual_init_connection,
},{
.name = "GETDCNAME",
.struct_cmd = WINBINDD_GETDCNAME,
.struct_fn = winbindd_dual_getdcname,
},{
.name = "SHOW_SEQUENCE",
.struct_cmd = WINBINDD_SHOW_SEQUENCE,
.struct_fn = winbindd_dual_show_sequence,
},{
.name = "PAM_AUTH",
.struct_cmd = WINBINDD_PAM_AUTH,
.struct_fn = winbindd_dual_pam_auth,
},{
.name = "AUTH_CRAP",
.struct_cmd = WINBINDD_PAM_AUTH_CRAP,
.struct_fn = winbindd_dual_pam_auth_crap,
},{
.name = "PAM_LOGOFF",
.struct_cmd = WINBINDD_PAM_LOGOFF,
.struct_fn = winbindd_dual_pam_logoff,
},{
.name = "CHNG_PSWD_AUTH_CRAP",
.struct_cmd = WINBINDD_PAM_CHNG_PSWD_AUTH_CRAP,
.struct_fn = winbindd_dual_pam_chng_pswd_auth_crap,
},{
.name = "PAM_CHAUTHTOK",
.struct_cmd = WINBINDD_PAM_CHAUTHTOK,
.struct_fn = winbindd_dual_pam_chauthtok,
},{
.name = "CHECK_MACHACC",
.struct_cmd = WINBINDD_CHECK_MACHACC,
.struct_fn = winbindd_dual_check_machine_acct,
},{
.name = "DUAL_USERINFO",
.struct_cmd = WINBINDD_DUAL_USERINFO,
.struct_fn = winbindd_dual_userinfo,
},{
.name = "GETUSERDOMGROUPS",
.struct_cmd = WINBINDD_GETUSERDOMGROUPS,
.struct_fn = winbindd_dual_getuserdomgroups,
},{
.name = "GETSIDALIASES",
.struct_cmd = WINBINDD_DUAL_GETSIDALIASES,
.struct_fn = winbindd_dual_getsidaliases,
},{
.name = "CCACHE_NTLM_AUTH",
.struct_cmd = WINBINDD_CCACHE_NTLMAUTH,
.struct_fn = winbindd_dual_ccache_ntlm_auth,
},{
.name = NULL,
}
};