s4:librpc: factor out xxx_shutdown_pipe() to dcerpc_shutdown_pipe()
authorGregor Beck <gbeck@sernet.de>
Tue, 24 Sep 2013 10:45:26 +0000 (12:45 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 7 Jan 2014 07:37:46 +0000 (08:37 +0100)
Signed-off-by: Gregor Beck <gbeck@sernet.de>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source4/librpc/rpc/dcerpc.c
source4/librpc/rpc/dcerpc.h
source4/librpc/rpc/dcerpc_smb.c
source4/librpc/rpc/dcerpc_sock.c

index a2223851707773b03583f364fe59fa0d2adff05b..a55f3d646845dabbfdb1aff5ae619cd908a2f805 100644 (file)
@@ -31,6 +31,8 @@
 #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,
@@ -1009,6 +1011,7 @@ static int dcerpc_req_dequeue(struct rpc_request *req)
 }
 
 
+static NTSTATUS dcerpc_shutdown_pipe(struct dcecli_connection *p, NTSTATUS status);
 /*
   mark the dcerpc connection dead. All outstanding requests get an error
 */
@@ -1023,9 +1026,7 @@ static void dcerpc_connection_dead(struct dcecli_connection *conn, NTSTATUS stat
 
        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) {
@@ -2269,3 +2270,58 @@ void dcerpc_transport_dead(struct dcecli_connection *c, NTSTATUS status)
                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);
+}
index 61141c2b1b97ba52abf397f51b0bc20e76b66f26..cb78421cb2f9a5e22cca3e50244b009273f0b01a 100644 (file)
@@ -78,8 +78,6 @@ struct dcecli_connection {
                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);
 
index d55ce6fd837fff1307a934a314c133965005419f..5e282d65d19b2c7580db403bcaac6ff8713e9418 100644 (file)
@@ -283,62 +283,6 @@ static void smb_send_request_done(struct tevent_req *subreq)
        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 
 */
@@ -454,7 +398,6 @@ static void dcerpc_pipe_open_smb_done(struct tevent_req *subreq)
        */
        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;
index ad7771ea8df4ffadadf7bce23dbe7d5858ec3207..87c7ff494abbe3b8f27bdba7ae87063e1e9b67a2 100644 (file)
@@ -212,20 +212,6 @@ static void sock_send_request_done(struct tevent_req *subreq)
        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;
@@ -281,8 +267,6 @@ static void continue_socket_connect(struct composite_context *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)