summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2007-08-29 12:43:23 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:30:20 -0500
commit53d41f3b1b0b7fc3550e0ee4906405f7afbf114c (patch)
tree9c1536eecde13786d596e57be2910cf896e75ada
parent4429a01c83f8900d318c7c162f004d1e5764556a (diff)
downloadsamba-53d41f3b1b0b7fc3550e0ee4906405f7afbf114c.tar.gz
samba-53d41f3b1b0b7fc3550e0ee4906405f7afbf114c.tar.bz2
samba-53d41f3b1b0b7fc3550e0ee4906405f7afbf114c.zip
r24778: Make sure krb5 locator requests go to a separate locator winbind child.
Guenther (This used to be commit fb9228b8d167552f0a046ab674f66d4e5b73f5b6)
-rw-r--r--source3/nsswitch/winbindd.c1
-rw-r--r--source3/nsswitch/winbindd_dual.c8
-rw-r--r--source3/nsswitch/winbindd_misc.c15
-rw-r--r--source3/nsswitch/winbindd_util.c12
4 files changed, 31 insertions, 5 deletions
diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c
index 3bf054eb4f..ecc30e140a 100644
--- a/source3/nsswitch/winbindd.c
+++ b/source3/nsswitch/winbindd.c
@@ -1184,6 +1184,7 @@ int main(int argc, char **argv, char **envp)
}
init_idmap_child();
+ init_locator_child();
smb_nscd_flush_user_cache();
smb_nscd_flush_group_cache();
diff --git a/source3/nsswitch/winbindd_dual.c b/source3/nsswitch/winbindd_dual.c
index c6cafe79ec..b79445ee86 100644
--- a/source3/nsswitch/winbindd_dual.c
+++ b/source3/nsswitch/winbindd_dual.c
@@ -579,9 +579,9 @@ void winbind_msg_offline(struct messaging_context *msg_ctx,
}
for (child = children; child != NULL; child = child->next) {
- /* Don't send message to idmap child. We've already
+ /* Don't send message to internal childs. We've already
done so above. */
- if (!child->domain || (child == idmap_child())) {
+ if (!child->domain || winbindd_internal_child(child)) {
continue;
}
@@ -655,8 +655,8 @@ void winbind_msg_online(struct messaging_context *msg_ctx,
}
for (child = children; child != NULL; child = child->next) {
- /* Don't send message to idmap child. */
- if (!child->domain || (child == idmap_child())) {
+ /* Don't send message to internal childs. */
+ if (!child->domain || winbindd_internal_child(child)) {
continue;
}
diff --git a/source3/nsswitch/winbindd_misc.c b/source3/nsswitch/winbindd_misc.c
index 8f1e653619..c32f052e3c 100644
--- a/source3/nsswitch/winbindd_misc.c
+++ b/source3/nsswitch/winbindd_misc.c
@@ -270,6 +270,18 @@ enum winbindd_result winbindd_dual_getdcname(struct winbindd_domain *domain,
return WINBINDD_OK;
}
+static struct winbindd_child static_locator_child;
+
+void init_locator_child(void)
+{
+ setup_domain_child(NULL, &static_locator_child, "locator");
+}
+
+struct winbindd_child *locator_child(void)
+{
+ return &static_locator_child;
+}
+
void winbindd_dsgetdcname(struct winbindd_cli_state *state)
{
state->request.domain_name
@@ -278,7 +290,7 @@ void winbindd_dsgetdcname(struct winbindd_cli_state *state)
DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
state->request.domain_name));
- sendto_domain(state, find_our_domain());
+ sendto_child(state, locator_child());
}
enum winbindd_result winbindd_dual_dsgetdcname(struct winbindd_domain *domain,
@@ -603,3 +615,4 @@ void winbindd_priv_pipe_dir(struct winbindd_cli_state *state)
request_ok(state);
}
+
diff --git a/source3/nsswitch/winbindd_util.c b/source3/nsswitch/winbindd_util.c
index 591d2355d9..e8831b3653 100644
--- a/source3/nsswitch/winbindd_util.c
+++ b/source3/nsswitch/winbindd_util.c
@@ -1353,3 +1353,15 @@ BOOL winbindd_can_contact_domain( struct winbindd_domain *domain )
return True;
}
+
+/*********************************************************************
+ ********************************************************************/
+
+BOOL winbindd_internal_child(struct winbindd_child *child)
+{
+ if (child == idmap_child() || child == locator_child()) {
+ return True;
+ }
+
+ return False;
+}