struct iovec vector;
};
+static void dcerpc_submit_fault_done(struct tevent_req *subreq);
+
static NTSTATUS dcerpc_submit_fault(struct dcerpc_connection *conn,
+ struct tevent_context *ev,
uint32_t call_id,
uint32_t context_id,
NTSTATUS nt_status)
{
struct dcerpc_submit_fault_frag *frag;
- enum dcerpc_nca_status status = DCERPC_NCA_S_PROTO_ERROR;
+ NTSTATUS error;
union dcerpc_payload u;
struct tevent_req *subreq;
return NT_STATUS_OK;
}
- // TODO map from NTSTATUS to dcerpc_nca_status
- if (
/*
* the fragment belongs to the connection instead of the request
* because it has to remain in case the request is canceled
ZERO_STRUCT(u.fault);
u.fault.context_id = context_id;
- u.fault.status = status;
-
- status = dcerpc_ncacn_packet_blob(frag,
- DCERPC_PKT_FAULT,
- DCERPC_PFC_FLAG_FIRST |
- DCERPC_PFC_FLAG_LAST,
- 0,
- call_id,
- &u,
- &frag->blob);
- if (!NT_STATUS_IS_OK(status)) {
+ u.fault.status = dcerpc_fault_from_nt_status(nt_status);
+
+ error = dcerpc_ncacn_packet_blob(frag,
+ DCERPC_PKT_FAULT,
+ DCERPC_PFC_FLAG_FIRST |
+ DCERPC_PFC_FLAG_LAST,
+ 0,
+ call_id,
+ &u,
+ &frag->blob);
+ if (!NT_STATUS_IS_OK(error)) {
TALLOC_FREE(frag);
- return status;
+ return error;
}
/* explicitly set frag_len here as dcerpc_push_ncacn_packet() can't
return NT_STATUS_OK;
}
+
+static void dcerpc_submit_fault_done(struct tevent_req *subreq)
+{
+ struct dcerpc_submit_fault_frag *frag =
+ tevent_req_callback_data(subreq,
+ struct dcerpc_submit_fault_frag);
+
+ TALLOC_FREE(subreq);
+
+ TALLOC_FREE(frag);
+}