[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Fri Aug 24 21:07:02 MDT 2012
The branch, master has been updated
via b05d28e s4:winbind: let wb_update_rodc_dns_send/recv use netlogon_queue (bug #9097)
via 6460129 s4:winbind: let wb_sam_logon_send/recv() use the netlogon_queue (bug #9097)
via 19daec6 s4:winbind: add a netlogon_queue (tevent_queue)
via d4aa897 s4:winbind: convert wb_update_rodc_dns_send/recv to tevent_req
via 0ccdaa9 s4:winbind: convert wb_sam_logon_send/recv to tevent_req
via d3756d8 s4:winbind: convert wb_sid2domain to tevent_req internally
via 89a5a71 s4:librpc/rpc: don't do async requests if gensec doesn't support async replies (bug #9097)
via 0bd0ad9 s4:librpc/rpc: also call dcerpc_schedule_io_trigger() after bind and alter_context responses
via e44b5bd s4:librpc/rpc: use dcerpc_req_dequeue() in dcerpc_request_recv_data()
via 81bc57d s4:librpc/rpc: use talloc_zero for 'struct rpc_request'
via 28350ae libcli/smb: split out a smb_transport private library
via 5eec19b libcli/smb: wscript_build => wscript
from aca444c Remove useless bool "upper_case_domain" parameter from ntv2_owf_gen().
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit b05d28ebddb7ebd4f8e28a80489fceb8703a9868
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 17:42:18 2012 +0200
s4:winbind: let wb_update_rodc_dns_send/recv use netlogon_queue (bug #9097)
metze
Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
Autobuild-Date(master): Sat Aug 25 05:06:18 CEST 2012 on sn-devel-104
commit 646012954c4704375912ba2c049266f122c76f97
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 13:40:13 2012 +0200
s4:winbind: let wb_sam_logon_send/recv() use the netlogon_queue (bug #9097)
metze
commit 19daec6a95fd89b34f126118fcd3d3c4e7db72e6
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 13:39:14 2012 +0200
s4:winbind: add a netlogon_queue (tevent_queue)
This will protect the netlogon_creds later.
metze
commit d4aa8978ccecc40e3fd4fb89e76199b82ddf87ff
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 17:39:58 2012 +0200
s4:winbind: convert wb_update_rodc_dns_send/recv to tevent_req
metze
commit 0ccdaa940a80181d1f263386324668a0a715dbf9
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 13:15:42 2012 +0200
s4:winbind: convert wb_sam_logon_send/recv to tevent_req
metze
commit d3756d87389fb7111c35e1e01f23abfb13f814a7
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Aug 23 13:14:17 2012 +0200
s4:winbind: convert wb_sid2domain to tevent_req internally
The public wrapper still uses composite_context, because I don't
have time to fix all the callers...
metze
commit 89a5a7165469da35f0f6c87c4c34579aa4f75531
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 08:29:21 2012 +0200
s4:librpc/rpc: don't do async requests if gensec doesn't support async replies (bug #9097)
metze
commit 0bd0ad967d1b5f82cbbd2df8fcb8a54d1ed5db40
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 08:27:47 2012 +0200
s4:librpc/rpc: also call dcerpc_schedule_io_trigger() after bind and alter_context responses
metze
commit e44b5bdb2cc756620517a7341e1ad81d606e359d
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 08:26:53 2012 +0200
s4:librpc/rpc: use dcerpc_req_dequeue() in dcerpc_request_recv_data()
metze
commit 81bc57d39536516d64fd59978e300d64eac1d97c
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 24 13:17:23 2012 +0200
s4:librpc/rpc: use talloc_zero for 'struct rpc_request'
metze
commit 28350aeaa19d419bfc8f2fef69b136f42a0234ae
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 10 12:34:59 2012 +0200
libcli/smb: split out a smb_transport private library
metze
commit 5eec19bc838a276eeea10ddedc50d5f0697f120e
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Aug 10 12:38:41 2012 +0200
libcli/smb: wscript_build => wscript
We'll need some configure checks in future.
metze
-----------------------------------------------------------------------
Summary of changes:
libcli/smb/{wscript_build => wscript} | 21 +++-
source4/librpc/rpc/dcerpc.c | 53 ++++++--
source4/winbind/wb_init_domain.c | 10 ++
source4/winbind/wb_irpc.c | 48 ++++---
source4/winbind/wb_pam_auth.c | 21 ++--
source4/winbind/wb_sam_logon.c | 220 +++++++++++++++++++----------
source4/winbind/wb_server.h | 2 +
source4/winbind/wb_sid2domain.c | 248 +++++++++++++++++++++++----------
source4/winbind/wb_update_rodc_dns.c | 206 ++++++++++++++++++---------
9 files changed, 564 insertions(+), 265 deletions(-)
rename libcli/smb/{wscript_build => wscript} (58%)
Changeset truncated at 500 lines:
diff --git a/libcli/smb/wscript_build b/libcli/smb/wscript
similarity index 58%
rename from libcli/smb/wscript_build
rename to libcli/smb/wscript
index 40c3c17..ae65d68 100755
--- a/libcli/smb/wscript_build
+++ b/libcli/smb/wscript
@@ -1,11 +1,24 @@
#!/usr/bin/env python
-bld.SAMBA_LIBRARY('cli_smb_common',
+def build(bld):
+ bld.SAMBA_LIBRARY('smb_transport',
+ source='''
+ read_smb.c
+ ''',
+ deps='errors LIBASYNC_REQ',
+ public_deps='talloc tevent samba-util',
+ private_library=True,
+ public_headers='''
+ read_smb.h
+ ''',
+ )
+
+ bld.SAMBA_LIBRARY('cli_smb_common',
source='''
smb_signing.c smb_seal.c
smb2_create_blob.c smb2_signing.c
- util.c read_smb.c
+ util.c
smbXcli_base.c
smb1cli_trans.c
smb2cli_session.c
@@ -19,14 +32,14 @@ bld.SAMBA_LIBRARY('cli_smb_common',
smb2cli_query_directory.c
smb2cli_ioctl.c
''',
- deps='LIBCRYPTO errors gensec krb5samba LIBASYNC_REQ',
+ deps='LIBCRYPTO errors gensec krb5samba smb_transport',
public_deps='talloc samba-util',
private_library=True,
public_headers='''
smb_common.h smb2_constants.h smb_constants.h
smb_signing.h smb_seal.h
smb2_create_blob.h smb2_signing.h
- smb_util.h read_smb.h
+ smb_util.h
smb_unix_ext.h
''',
)
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index 4cec4b5..4440395 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -60,6 +60,7 @@ struct rpc_request {
uint16_t opnum;
DATA_BLOB request_data;
bool ignore_timeout;
+ bool wait_for_sync;
/* use by the ndr level async recv call */
struct {
@@ -1395,6 +1396,13 @@ static void dcerpc_request_recv_data(struct dcecli_connection *c,
if (req->recv_handler != NULL) {
dcerpc_req_dequeue(req);
req->state = RPC_REQUEST_DONE;
+
+ /*
+ * We have to look at shipping further requests before calling
+ * the async function, that one might close the pipe
+ */
+ dcerpc_schedule_io_trigger(c);
+
req->recv_handler(req, raw_packet, pkt);
return;
}
@@ -1451,8 +1459,8 @@ static void dcerpc_request_recv_data(struct dcecli_connection *c,
req_done:
/* we've got the full payload */
+ dcerpc_req_dequeue(req);
req->state = RPC_REQUEST_DONE;
- DLIST_REMOVE(c->pending, req);
/*
* We have to look at shipping further requests before calling
@@ -1478,22 +1486,14 @@ static struct rpc_request *dcerpc_request_send(TALLOC_CTX *mem_ctx,
p->conn->transport.recv_data = dcerpc_recv_data;
- req = talloc(mem_ctx, struct rpc_request);
+ req = talloc_zero(mem_ctx, struct rpc_request);
if (req == NULL) {
return NULL;
}
req->p = p;
req->call_id = next_call_id(p->conn);
- req->status = NT_STATUS_OK;
req->state = RPC_REQUEST_QUEUED;
- req->payload = data_blob(NULL, 0);
- req->flags = 0;
- req->fault_code = 0;
- req->ignore_timeout = false;
- req->async.callback = NULL;
- req->async.private_data = NULL;
- req->recv_handler = NULL;
if (object != NULL) {
req->object = (struct GUID *)talloc_memdup(req, (const void *)object, sizeof(*object));
@@ -1501,8 +1501,6 @@ static struct rpc_request *dcerpc_request_send(TALLOC_CTX *mem_ctx,
talloc_free(req);
return NULL;
}
- } else {
- req->object = NULL;
}
req->opnum = opnum;
@@ -1538,6 +1536,7 @@ static void dcerpc_ship_next_request(struct dcecli_connection *c)
bool first_packet = true;
size_t sig_size = 0;
bool need_async = false;
+ bool can_async = true;
req = c->request_queue;
if (req == NULL) {
@@ -1551,6 +1550,32 @@ static void dcerpc_ship_next_request(struct dcecli_connection *c)
need_async = true;
}
+ if (c->security_state.auth_info &&
+ c->security_state.generic_state)
+ {
+ struct gensec_security *gensec = c->security_state.generic_state;
+
+ switch (c->security_state.auth_info->auth_level) {
+ case DCERPC_AUTH_LEVEL_PRIVACY:
+ case DCERPC_AUTH_LEVEL_INTEGRITY:
+ can_async = gensec_have_feature(gensec,
+ GENSEC_FEATURE_ASYNC_REPLIES);
+ break;
+ case DCERPC_AUTH_LEVEL_CONNECT:
+ case DCERPC_AUTH_LEVEL_NONE:
+ can_async = true;
+ break;
+ default:
+ can_async = false;
+ break;
+ }
+ }
+
+ if (need_async && !can_async) {
+ req->wait_for_sync = true;
+ return;
+ }
+
DLIST_REMOVE(c->request_queue, req);
DLIST_ADD(c->pending, req);
req->state = RPC_REQUEST_PENDING;
@@ -1665,6 +1690,10 @@ static void dcerpc_schedule_io_trigger(struct dcecli_connection *c)
return;
}
+ if (c->request_queue->wait_for_sync && c->pending) {
+ return;
+ }
+
if (c->io_trigger_pending) {
return;
}
diff --git a/source4/winbind/wb_init_domain.c b/source4/winbind/wb_init_domain.c
index 45a4b98..5e2aa47 100644
--- a/source4/winbind/wb_init_domain.c
+++ b/source4/winbind/wb_init_domain.c
@@ -160,6 +160,13 @@ struct composite_context *wb_init_domain_send(TALLOC_CTX *mem_ctx,
state->domain->netlogon_pipe = NULL;
+ state->domain->netlogon_queue = tevent_queue_create(state->domain,
+ "netlogon_queue");
+ if (state->domain->netlogon_queue == NULL) goto failed;
+
+ /* We start the queue when the connection is usable */
+ tevent_queue_stop(state->domain->netlogon_queue);
+
if ((!cli_credentials_is_anonymous(state->domain->libnet_ctx->cred)) &&
((lpcfg_server_role(service->task->lp_ctx) == ROLE_DOMAIN_MEMBER) ||
(lpcfg_server_role(service->task->lp_ctx) == ROLE_ACTIVE_DIRECTORY_DC)) &&
@@ -211,6 +218,9 @@ static void init_domain_recv_netlogonpipe(struct composite_context *ctx)
}
talloc_reparent(state, state->domain->netlogon_pipe, state->domain->netlogon_binding);
+ /* the netlogon connection is ready */
+ tevent_queue_start(state->domain->netlogon_queue);
+
state->domain->lsa_binding = init_domain_binding(state, &ndr_table_lsarpc);
/* For debugging, it can be a real pain if all the traffic is encrypted */
diff --git a/source4/winbind/wb_irpc.c b/source4/winbind/wb_irpc.c
index 2f2b078..628114e 100644
--- a/source4/winbind/wb_irpc.c
+++ b/source4/winbind/wb_irpc.c
@@ -30,7 +30,7 @@ struct wb_irpc_SamLogon_state {
struct winbind_SamLogon *req;
};
-static void wb_irpc_SamLogon_callback(struct composite_context *ctx);
+static void wb_irpc_SamLogon_callback(struct tevent_req *subreq);
static NTSTATUS wb_irpc_SamLogon(struct irpc_message *msg,
struct winbind_SamLogon *req)
@@ -38,7 +38,7 @@ static NTSTATUS wb_irpc_SamLogon(struct irpc_message *msg,
struct wbsrv_service *service = talloc_get_type(msg->private_data,
struct wbsrv_service);
struct wb_irpc_SamLogon_state *s;
- struct composite_context *ctx;
+ struct tevent_req *subreq;
DEBUG(5, ("wb_irpc_SamLogon called\n"));
@@ -48,25 +48,28 @@ static NTSTATUS wb_irpc_SamLogon(struct irpc_message *msg,
s->msg = msg;
s->req = req;
- ctx = wb_sam_logon_send(msg, service, req);
- NT_STATUS_HAVE_NO_MEMORY(ctx);
+ subreq = wb_sam_logon_send(s,
+ service->task->event_ctx,
+ service, req);
+ NT_STATUS_HAVE_NO_MEMORY(subreq);
- ctx->async.fn = wb_irpc_SamLogon_callback;
- ctx->async.private_data = s;
+ tevent_req_set_callback(subreq, wb_irpc_SamLogon_callback, s);
msg->defer_reply = true;
return NT_STATUS_OK;
}
-static void wb_irpc_SamLogon_callback(struct composite_context *ctx)
+static void wb_irpc_SamLogon_callback(struct tevent_req *subreq)
{
- struct wb_irpc_SamLogon_state *s = talloc_get_type(ctx->async.private_data,
- struct wb_irpc_SamLogon_state);
+ struct wb_irpc_SamLogon_state *s =
+ tevent_req_callback_data(subreq,
+ struct wb_irpc_SamLogon_state);
NTSTATUS status;
DEBUG(5, ("wb_irpc_SamLogon_callback called\n"));
- status = wb_sam_logon_recv(ctx, s, s->req);
+ status = wb_sam_logon_recv(subreq, s, s->req);
+ TALLOC_FREE(subreq);
irpc_send_reply(s->msg, status);
}
@@ -76,7 +79,7 @@ struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state {
struct winbind_DsrUpdateReadOnlyServerDnsRecords *req;
};
-static void wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback(struct composite_context *ctx);
+static void wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback(struct tevent_req *subreq);
static NTSTATUS wb_irpc_DsrUpdateReadOnlyServerDnsRecords(struct irpc_message *msg,
struct winbind_DsrUpdateReadOnlyServerDnsRecords *req)
@@ -84,7 +87,7 @@ static NTSTATUS wb_irpc_DsrUpdateReadOnlyServerDnsRecords(struct irpc_message *m
struct wbsrv_service *service = talloc_get_type(msg->private_data,
struct wbsrv_service);
struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state *s;
- struct composite_context *ctx;
+ struct tevent_req *subreq;
DEBUG(5, ("wb_irpc_DsrUpdateReadOnlyServerDnsRecords called\n"));
@@ -94,25 +97,30 @@ static NTSTATUS wb_irpc_DsrUpdateReadOnlyServerDnsRecords(struct irpc_message *m
s->msg = msg;
s->req = req;
- ctx = wb_update_rodc_dns_send(msg, service, req);
- NT_STATUS_HAVE_NO_MEMORY(ctx);
+ subreq = wb_update_rodc_dns_send(s,
+ service->task->event_ctx,
+ service, req);
+ NT_STATUS_HAVE_NO_MEMORY(subreq);
- ctx->async.fn = wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback;
- ctx->async.private_data = s;
+ tevent_req_set_callback(subreq,
+ wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback,
+ s);
msg->defer_reply = true;
return NT_STATUS_OK;
}
-static void wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback(struct composite_context *ctx)
+static void wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback(struct tevent_req *subreq)
{
- struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state *s = talloc_get_type(ctx->async.private_data,
- struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state);
+ struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state *s =
+ tevent_req_callback_data(subreq,
+ struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state);
NTSTATUS status;
DEBUG(5, ("wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback called\n"));
- status = wb_update_rodc_dns_recv(ctx, s, s->req);
+ status = wb_update_rodc_dns_recv(subreq, s, s->req);
+ TALLOC_FREE(subreq);
irpc_send_reply(s->msg, status);
}
diff --git a/source4/winbind/wb_pam_auth.c b/source4/winbind/wb_pam_auth.c
index bcbc628..c84b51f 100644
--- a/source4/winbind/wb_pam_auth.c
+++ b/source4/winbind/wb_pam_auth.c
@@ -54,7 +54,7 @@ struct pam_auth_crap_state {
* NTLM authentication.
*/
-static void pam_auth_crap_recv_logon(struct composite_context *ctx);
+static void pam_auth_crap_recv_logon(struct tevent_req *subreq);
struct composite_context *wb_cmd_pam_auth_crap_send(TALLOC_CTX *mem_ctx,
struct wbsrv_service *service,
@@ -66,10 +66,11 @@ struct composite_context *wb_cmd_pam_auth_crap_send(TALLOC_CTX *mem_ctx,
DATA_BLOB nt_resp,
DATA_BLOB lm_resp)
{
- struct composite_context *result, *ctx;
+ struct composite_context *result;
struct pam_auth_crap_state *state;
struct netr_NetworkInfo *ninfo;
DATA_BLOB tmp_nt_resp, tmp_lm_resp;
+ struct tevent_req *subreq;
result = composite_create(mem_ctx, service->task->event_ctx);
if (result == NULL) goto failed;
@@ -113,10 +114,11 @@ struct composite_context *wb_cmd_pam_auth_crap_send(TALLOC_CTX *mem_ctx,
state->unix_username = NULL;
- ctx = wb_sam_logon_send(mem_ctx, service, state->req);
- if (ctx == NULL) goto failed;
-
- composite_continue(result, ctx, pam_auth_crap_recv_logon, state);
+ subreq = wb_sam_logon_send(state,
+ service->task->event_ctx,
+ service, state->req);
+ if (subreq == NULL) goto failed;
+ tevent_req_set_callback(subreq, pam_auth_crap_recv_logon, state);
return result;
failed:
@@ -129,16 +131,17 @@ struct composite_context *wb_cmd_pam_auth_crap_send(TALLOC_CTX *mem_ctx,
Send of a SamLogon request to authenticate a user.
*/
-static void pam_auth_crap_recv_logon(struct composite_context *ctx)
+static void pam_auth_crap_recv_logon(struct tevent_req *subreq)
{
DATA_BLOB tmp_blob;
enum ndr_err_code ndr_err;
struct netr_SamBaseInfo *base;
struct pam_auth_crap_state *state =
- talloc_get_type(ctx->async.private_data,
+ tevent_req_callback_data(subreq,
struct pam_auth_crap_state);
- state->ctx->status = wb_sam_logon_recv(ctx, state, state->req);
+ state->ctx->status = wb_sam_logon_recv(subreq, state, state->req);
+ TALLOC_FREE(subreq);
if (!composite_is_ok(state->ctx)) return;
ndr_err = ndr_push_struct_blob(
diff --git a/source4/winbind/wb_sam_logon.c b/source4/winbind/wb_sam_logon.c
index 028871a..32fddd2 100644
--- a/source4/winbind/wb_sam_logon.c
+++ b/source4/winbind/wb_sam_logon.c
@@ -22,6 +22,8 @@
*/
#include "includes.h"
+#include <tevent.h>
+#include "../lib/util/tevent_ntstatus.h"
#include "libcli/composite/composite.h"
#include "winbind/wb_server.h"
#include "smbd/service_task.h"
@@ -31,10 +33,12 @@
#include "librpc/gen_ndr/winbind.h"
struct wb_sam_logon_state {
- struct composite_context *ctx;
+ struct tevent_context *ev;
struct winbind_SamLogon *req;
+ struct wbsrv_domain *domain;
+ struct tevent_queue_entry *queue_entry;
struct netlogon_creds_CredentialState *creds_state;
struct netr_Authenticator auth1, auth2;
@@ -43,82 +47,123 @@ struct wb_sam_logon_state {
};
static void wb_sam_logon_recv_domain(struct composite_context *ctx);
+static void wb_sam_logon_queue_trigger(struct tevent_req *req, void *priv);
static void wb_sam_logon_recv_samlogon(struct tevent_req *subreq);
/*
Find the connection to the DC (or find an existing connection)
*/
-struct composite_context *wb_sam_logon_send(TALLOC_CTX *mem_ctx,
- struct wbsrv_service *service,
- struct winbind_SamLogon *req)
+struct tevent_req *wb_sam_logon_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct wbsrv_service *service,
+ struct winbind_SamLogon *_req)
{
- struct composite_context *c, *creq;
- struct wb_sam_logon_state *s;
-
- c = composite_create(mem_ctx, service->task->event_ctx);
- if (!c) return NULL;
-
- s = talloc_zero(c, struct wb_sam_logon_state);
- if (composite_nomem(s, c)) return c;
- s->ctx = c;
- s->req = req;
+ struct tevent_req *req;
+ struct wb_sam_logon_state *state;
+ struct composite_context *csubreq;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct wb_sam_logon_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ state->ev = ev;
+ state->req = _req;
- c->private_data = s;
+ csubreq = wb_sid2domain_send(state, service, service->primary_sid);
+ if (tevent_req_nomem(csubreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ csubreq->async.fn = wb_sam_logon_recv_domain;
+ csubreq->async.private_data = req;
- creq = wb_sid2domain_send(s, service, service->primary_sid);
- composite_continue(c, creq, wb_sam_logon_recv_domain, s);
- return c;
+ return req;
}
/*
Having finished making the connection to the DC
Send of a SamLogon request to authenticate a user.
*/
-static void wb_sam_logon_recv_domain(struct composite_context *creq)
+static void wb_sam_logon_recv_domain(struct composite_context *csubreq)
{
- struct wb_sam_logon_state *s = talloc_get_type(creq->async.private_data,
- struct wb_sam_logon_state);
- struct wbsrv_domain *domain;
- struct tevent_req *subreq;
+ struct tevent_req *req =
+ talloc_get_type_abort(csubreq->async.private_data,
+ struct tevent_req);
+ struct wb_sam_logon_state *state =
+ tevent_req_data(req,
+ struct wb_sam_logon_state);
+ NTSTATUS status;
+ struct tevent_queue_entry *e;
+
+ status = wb_sid2domain_recv(csubreq, &state->domain);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
- s->ctx->status = wb_sid2domain_recv(creq, &domain);
- if (!composite_is_ok(s->ctx)) return;
+ /*
+ * Because of the netlogon_creds behavior we have to
+ * queue the netr_LogonSamLogon() calls
+ */
+ e = tevent_queue_add_entry(state->domain->netlogon_queue,
+ state->ev,
+ req,
+ wb_sam_logon_queue_trigger,
+ NULL);
+ state->queue_entry = e;
+}
- s->creds_state = cli_credentials_get_netlogon_creds(domain->libnet_ctx->cred);
--
Samba Shared Repository
More information about the samba-cvs
mailing list