static void dcerpc_connection_dead(struct dcecli_connection *conn, NTSTATUS status);
static void dcerpc_schedule_io_trigger(struct dcecli_connection *c);
-static int dcerpc_req_dequeue(struct rpc_request *req);
static struct rpc_request *dcerpc_request_send(TALLOC_CTX *mem_ctx,
struct dcerpc_pipe *p,
DATA_BLOB in_data;
DATA_BLOB out_data;
uint32_t out_flags;
- struct rpc_request *subreq;
};
static void dcerpc_bh_raw_call_done(struct rpc_request *subreq);
-static bool dcerpc_bh_raw_call_cancel(struct tevent_req *req);
static struct tevent_req *dcerpc_bh_raw_call_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct tevent_req *req;
struct dcerpc_bh_raw_call_state *state;
bool ok;
+ struct rpc_request *subreq;
req = tevent_req_create(mem_ctx, &state,
struct dcerpc_bh_raw_call_state);
return tevent_req_post(req, ev);
}
- state->subreq = dcerpc_request_send(state,
- hs->p,
- object,
- opnum,
- &state->in_data);
- if (tevent_req_nomem(state->subreq, req)) {
+ subreq = dcerpc_request_send(state,
+ hs->p,
+ object,
+ opnum,
+ &state->in_data);
+ if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
- state->subreq->async.callback = dcerpc_bh_raw_call_done;
- state->subreq->async.private_data = req;
-
- tevent_req_set_cancel_fn(req, dcerpc_bh_raw_call_cancel);
+ subreq->async.callback = dcerpc_bh_raw_call_done;
+ subreq->async.private_data = req;
return req;
}
-static bool dcerpc_bh_raw_call_cancel(struct tevent_req *req)
-{
- struct dcerpc_bh_raw_call_state *state = tevent_req_data(
- req, struct dcerpc_bh_raw_call_state);
- struct rpc_request *subreq = state->subreq;
-
- switch (subreq->state) {
- case RPC_REQUEST_DONE:
- /* Can't cancel a complete request */
- return false;
- case RPC_REQUEST_PENDING:
- {
- /* TODO Send CO_CANCEL PDU */
- return false;
- }
- case RPC_REQUEST_QUEUED:
- {
- /*
- * If still queued, just remove from queue and call
- * its callback
- */
- dcerpc_req_dequeue(subreq);
- subreq->payload = data_blob_null;
- subreq->state = RPC_REQUEST_DONE;
- subreq->status = NT_STATUS_RPC_CALL_CANCELLED;
-
- /*
- * We have to look at shipping further requests before calling
- * the async function, that one might close the pipe
- */
- dcerpc_schedule_io_trigger(subreq->p->conn);
-
- if (subreq->async.callback) {
- subreq->async.callback(subreq);
- }
- return true;
- }
- }
-
- return false;
-}
-
static void dcerpc_bh_raw_call_done(struct rpc_request *subreq)
{
struct tevent_req *req =