};
static void getdcname_recv_domain(struct composite_context *ctx);
-static void getdcname_recv_dcname(struct rpc_request *req);
+static void getdcname_recv_dcname(struct tevent_req *subreq);
struct composite_context *wb_cmd_getdcname_send(TALLOC_CTX *mem_ctx,
struct wbsrv_service *service,
talloc_get_type(ctx->async.private_data,
struct cmd_getdcname_state);
struct wbsrv_domain *domain;
- struct rpc_request *req;
+ struct tevent_req *subreq;
state->ctx->status = wb_sid2domain_recv(ctx, &domain);
if (!composite_is_ok(state->ctx)) return;
state, "\\\\%s",
dcerpc_server_name(domain->netlogon_pipe));
state->g.in.domainname = state->domain_name;
- state->g.out.dcname = talloc(state, const char **);
+ state->g.out.dcname = talloc(state, const char *);
- req = dcerpc_netr_GetAnyDCName_send(domain->netlogon_pipe, state,
- &state->g);
- if (composite_nomem(req, state->ctx)) return;
+ subreq = dcerpc_netr_GetAnyDCName_r_send(state,
+ state->ctx->event_ctx,
+ domain->netlogon_pipe->binding_handle,
+ &state->g);
+ if (composite_nomem(subreq, state->ctx)) return;
- composite_continue_rpc(state->ctx, req, getdcname_recv_dcname, state);
+ tevent_req_set_callback(subreq, getdcname_recv_dcname, state);
}
-static void getdcname_recv_dcname(struct rpc_request *req)
+static void getdcname_recv_dcname(struct tevent_req *subreq)
{
struct cmd_getdcname_state *state =
- talloc_get_type(req->async.private_data,
- struct cmd_getdcname_state);
+ tevent_req_callback_data(subreq,
+ struct cmd_getdcname_state);
- state->ctx->status = dcerpc_ndr_request_recv(req);
+ state->ctx->status = dcerpc_netr_GetAnyDCName_r_recv(subreq, state);
+ TALLOC_FREE(subreq);
if (!composite_is_ok(state->ctx)) return;
state->ctx->status = werror_to_ntstatus(state->g.out.result);
if (!composite_is_ok(state->ctx)) return;
struct cmd_getdcname_state *state =
talloc_get_type(c->private_data, struct cmd_getdcname_state);
NTSTATUS status = composite_wait(c);
+ if (NT_STATUS_EQUAL(status, NT_STATUS_NO_SUCH_DOMAIN)) {
+ /* special case: queried DC is PDC */
+ state->g.out.dcname = &state->g.in.logon_server;
+ status = NT_STATUS_OK;
+ }
if (NT_STATUS_IS_OK(status)) {
const char *p = *(state->g.out.dcname);
if (*p == '\\') p += 1;