return p;
}
-static NTSTATUS rpcint_dispatch(struct pipes_struct *p,
- TALLOC_CTX *mem_ctx,
- uint32_t opnum,
- const DATA_BLOB *in_data,
- DATA_BLOB *out_data)
+struct rpcint_dispatch_state {
+ NTSTATUS status;
+ DATA_BLOB out_data;
+};
+static struct tevent_req *rpcint_dispatch_send(struct tevent_context *ev,
+ TALLOC_CTX *mem_ctx,
+ struct pipes_struct *p,
+ uint32_t opnum,
+ const DATA_BLOB *in_data)
{
struct pipe_rpc_fns *fns = find_pipe_fns_by_context(p->contexts, 0);
uint32_t num_cmds = fns->n_cmds;
const struct api_struct *cmds = fns->cmds;
uint32_t i;
bool ok;
+ struct rpcint_dispatch_state *state;
+ struct tevent_req *req = tevent_req_create(mem_ctx, &state,
+ struct rpcint_dispatch_state);
+ if (req == NULL) {
+ return NULL;
+ }
/* set opnum */
p->opnum = opnum;
}
if (i == num_cmds) {
- return NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE;
+ state->status = NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE;
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
}
p->in_data.data = *in_data;
if (!ok) {
data_blob_free(&p->out_data.rdata);
talloc_free_children(p->mem_ctx);
- return NT_STATUS_RPC_CALL_FAILED;
+ state->status = NT_STATUS_RPC_CALL_FAILED;
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
}
if (p->fault_state) {
- NTSTATUS status;
-
- status = NT_STATUS(p->fault_state);
+ state->status = NT_STATUS(p->fault_state);
p->fault_state = 0;
data_blob_free(&p->out_data.rdata);
talloc_free_children(p->mem_ctx);
- return status;
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
}
- *out_data = p->out_data.rdata;
- talloc_steal(mem_ctx, out_data->data);
+ state->out_data = p->out_data.rdata;
+ talloc_steal(state, state->out_data.data);
p->out_data.rdata = data_blob_null;
+ state->status = NT_STATUS_OK;
talloc_free_children(p->mem_ctx);
- return NT_STATUS_OK;
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+}
+
+static NTSTATUS rpcint_dispatch_recv(struct tevent_req *req,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *out_data)
+{
+ struct rpcint_dispatch_state *state
+ = tevent_req_data(req, struct rpcint_dispatch_state);
+ NTSTATUS status = state->status;
+
+ if (NT_STATUS_IS_OK(status)) {
+ *out_data = state->out_data;
+ talloc_steal(mem_ctx, out_data->data);
+ }
+ tevent_req_received(req);
+ return status;
}
struct rpcint_bh_state {
DATA_BLOB out_data;
uint32_t out_flags;
};
+static void rpcint_bh_raw_call_done(struct tevent_req *subreq);
static struct tevent_req *rpcint_bh_raw_call_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
dcerpc_binding_handle_data(h,
struct rpcint_bh_state);
struct tevent_req *req;
+ struct tevent_req *subreq;
struct rpcint_bh_raw_call_state *state;
bool ok;
- NTSTATUS status;
req = tevent_req_create(mem_ctx, &state,
struct rpcint_bh_raw_call_state);
return tevent_req_post(req, ev);
}
- /* TODO: allow async */
- status = rpcint_dispatch(hs->p, state, opnum,
- &state->in_data,
- &state->out_data);
- if (!NT_STATUS_IS_OK(status)) {
- tevent_req_nterror(req, status);
+ subreq = rpcint_dispatch_send(ev, state, hs->p, opnum,
+ &state->in_data);
+ if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
+ tevent_req_set_callback(subreq, rpcint_bh_raw_call_done, req);
+ return req;
+}
+
+static void rpcint_bh_raw_call_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(subreq,
+ struct tevent_req);
+ struct rpcint_bh_raw_call_state *state
+ = tevent_req_data(req, struct rpcint_bh_raw_call_state);
+ NTSTATUS status;
+
+ status = rpcint_dispatch_recv(subreq, state,
+ &state->out_data);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ }
tevent_req_done(req);
- return tevent_req_post(req, ev);
}
static NTSTATUS rpcint_bh_raw_call_recv(struct tevent_req *req,