#include "param/param.h"
#include "lib/util/tevent_ntstatus.h"
#include "librpc/rpc/rpc_common.h"
+#include "lib/tsocket/tsocket.h"
+
enum rpc_request_state {
RPC_REQUEST_QUEUED,
}
+static NTSTATUS dcerpc_shutdown_pipe(struct dcecli_connection *p, NTSTATUS status);
/*
mark the dcerpc connection dead. All outstanding requests get an error
*/
conn->transport.recv_data = NULL;
- if (conn->transport.shutdown_pipe) {
- conn->transport.shutdown_pipe(conn, status);
- }
+ dcerpc_shutdown_pipe(conn, status);
/* all pending requests get the error */
while (conn->pending) {
c->transport.recv_data(c, NULL, status);
}
}
+
+
+/*
+ shutdown SMB pipe connection
+*/
+struct dcerpc_shutdown_pipe_state {
+ struct dcecli_connection *c;
+ NTSTATUS status;
+};
+
+static void dcerpc_shutdown_pipe_done(struct tevent_req *subreq);
+
+static NTSTATUS dcerpc_shutdown_pipe(struct dcecli_connection *c, NTSTATUS status)
+{
+ struct dcerpc_shutdown_pipe_state *state;
+ struct tevent_req *subreq;
+
+ if (c->transport.stream == NULL) {
+ return NT_STATUS_OK;
+ }
+
+ state = talloc_zero(c, struct dcerpc_shutdown_pipe_state);
+ if (state == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ state->c = c;
+ state->status = status;
+
+ subreq = tstream_disconnect_send(state, c->event_ctx, c->transport.stream);
+ if (subreq == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ tevent_req_set_callback(subreq, dcerpc_shutdown_pipe_done, state);
+
+ return status;
+}
+
+static void dcerpc_shutdown_pipe_done(struct tevent_req *subreq)
+{
+ struct dcerpc_shutdown_pipe_state *state =
+ tevent_req_callback_data(subreq, struct dcerpc_shutdown_pipe_state);
+ struct dcecli_connection *c = state->c;
+ NTSTATUS status = state->status;
+ int error;
+
+ /*
+ * here we ignore the return values...
+ */
+ tstream_disconnect_recv(subreq, &error);
+ TALLOC_FREE(subreq);
+
+ TALLOC_FREE(state);
+
+ dcerpc_transport_dead(c, status);
+}
enum dcerpc_transport_t transport;
void *private_data;
- NTSTATUS (*shutdown_pipe)(struct dcecli_connection *, NTSTATUS status);
-
/* send a request to the server */
NTSTATUS (*send_request)(struct dcecli_connection *, DATA_BLOB *, bool trigger_read);
TALLOC_FREE(state);
}
-/*
- shutdown SMB pipe connection
-*/
-struct smb_shutdown_pipe_state {
- struct dcecli_connection *c;
- NTSTATUS status;
-};
-
-static void smb_shutdown_pipe_done(struct tevent_req *subreq);
-
-static NTSTATUS smb_shutdown_pipe(struct dcecli_connection *c, NTSTATUS status)
-{
- struct smb_private *smb = talloc_get_type_abort(
- c->transport.private_data, struct smb_private);
- struct smb_shutdown_pipe_state *state;
- struct tevent_req *subreq;
-
- if (c->transport.stream == NULL) {
- return NT_STATUS_OK;
- }
-
- state = talloc_zero(smb, struct smb_shutdown_pipe_state);
- if (state == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- state->c = c;
- state->status = status;
-
- subreq = tstream_disconnect_send(state, c->event_ctx, c->transport.stream);
- if (subreq == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- tevent_req_set_callback(subreq, smb_shutdown_pipe_done, state);
-
- return status;
-}
-
-static void smb_shutdown_pipe_done(struct tevent_req *subreq)
-{
- struct smb_shutdown_pipe_state *state =
- tevent_req_callback_data(subreq, struct smb_shutdown_pipe_state);
- struct dcecli_connection *c = state->c;
- NTSTATUS status = state->status;
- int error;
-
- /*
- * here we ignore the return values...
- */
- tstream_disconnect_recv(subreq, &error);
- TALLOC_FREE(subreq);
-
- TALLOC_FREE(state);
-
- dcerpc_transport_dead(c, status);
-}
-
/*
fetch the user session key
*/
*/
c->transport.transport = NCACN_NP;
c->transport.private_data = NULL;
- c->transport.shutdown_pipe = smb_shutdown_pipe;
c->transport.send_request = smb_send_request;
c->transport.send_read = smb_send_read;
TALLOC_FREE(state);
}
-/*
- shutdown sock pipe connection
-*/
-static NTSTATUS sock_shutdown_pipe(struct dcecli_connection *p, NTSTATUS status)
-{
- if (p->transport.stream == NULL) {
- return NT_STATUS_OK;
- }
-
- dcerpc_transport_dead(p, status);
-
- return status;
-}
-
struct pipe_open_socket_state {
struct dcecli_connection *conn;
struct socket_context *socket_ctx;
conn->transport.send_read = sock_send_read;
conn->transport.recv_data = NULL;
- conn->transport.shutdown_pipe = sock_shutdown_pipe;
-
/*
* Windows uses 5840 for ncacn_ip_tcp,
* so we also use it (for every transport which uses bsd sockets)