s4:rpc_server: Add public function dcesrv_connection_loop_start
authorSamuel Cabrero <scabrero@suse.de>
Thu, 24 Jan 2019 14:59:04 +0000 (15:59 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Fri, 18 Oct 2019 16:07:37 +0000 (16:07 +0000)
This function starts the server loop and will be called from s3 and s4
implementations.

Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source4/rpc_server/dcerpc_server.c
source4/rpc_server/dcerpc_server.h

index af39a997985e1ff767a73ca11bc04b6e369d1ea0..ac91c7e640614d6c8b12caff6d630ab3118a3747 100644 (file)
@@ -2787,9 +2787,6 @@ struct dcesrv_socket_context {
        struct dcesrv_context *dcesrv_ctx;
 };
 
-
-static void dcesrv_read_fragment_done(struct tevent_req *subreq);
-
 static void dcesrv_sock_accept(struct stream_connection *srv_conn)
 {
        NTSTATUS status;
@@ -2799,7 +2796,6 @@ static void dcesrv_sock_accept(struct stream_connection *srv_conn)
                dcerpc_binding_get_transport(dcesrv_sock->endpoint->ep_description);
        struct dcesrv_connection *dcesrv_conn = NULL;
        int ret;
-       struct tevent_req *subreq;
        struct loadparm_context *lp_ctx = dcesrv_sock->dcesrv_ctx->lp_ctx;
 
        dcesrv_cleanup_broken_connections(dcesrv_sock->dcesrv_ctx);
@@ -2914,17 +2910,13 @@ static void dcesrv_sock_accept(struct stream_connection *srv_conn)
 
        srv_conn->private_data = dcesrv_conn;
 
-       subreq = dcerpc_read_ncacn_packet_send(dcesrv_conn,
-                                              dcesrv_conn->event_ctx,
-                                              dcesrv_conn->stream);
-       if (!subreq) {
-               status = NT_STATUS_NO_MEMORY;
+       status = dcesrv_connection_loop_start(dcesrv_conn);
+       if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0,("dcesrv_sock_accept: dcerpc_read_fragment_buffer_send(%s)\n",
                        nt_errstr(status)));
                stream_terminate_connection(srv_conn, nt_errstr(status));
                return;
        }
-       tevent_req_set_callback(subreq, dcesrv_read_fragment_done, dcesrv_conn);
 
        return;
 }
@@ -3023,15 +3015,11 @@ static void dcesrv_conn_wait_done(struct tevent_req *subreq)
                return;
        }
 
-       subreq = dcerpc_read_ncacn_packet_send(dce_conn,
-                                              dce_conn->event_ctx,
-                                              dce_conn->stream);
-       if (!subreq) {
-               status = NT_STATUS_NO_MEMORY;
+       status = dcesrv_connection_loop_start(dce_conn);
+       if (!NT_STATUS_IS_OK(status)) {
                dcesrv_terminate_connection(dce_conn, nt_errstr(status));
                return;
        }
-       tevent_req_set_callback(subreq, dcesrv_read_fragment_done, dce_conn);
 }
 
 static void dcesrv_sock_recv(struct stream_connection *conn, uint16_t flags)
@@ -3483,3 +3471,18 @@ void dcesrv_transport_terminate_connection(struct dcesrv_connection *dce_conn,
                                      struct stream_connection);
        stream_terminate_connection(srv_conn, reason);
 }
+
+_PUBLIC_ NTSTATUS dcesrv_connection_loop_start(struct dcesrv_connection *conn)
+{
+       struct tevent_req *subreq;
+
+       subreq = dcerpc_read_ncacn_packet_send(conn,
+                                              conn->event_ctx,
+                                              conn->stream);
+       if (subreq == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       tevent_req_set_callback(subreq, dcesrv_read_fragment_done, conn);
+
+       return NT_STATUS_OK;
+}
index 0f83fef6d31f9730df219efbce29e517ab4fa81b..2341de05b1236a313c639aea4b81de5a3a0bc1e9 100644 (file)
@@ -596,4 +596,6 @@ _PUBLIC_ struct imessaging_context *dcesrv_imessaging_context(
                                        struct dcesrv_connection *conn);
 _PUBLIC_ struct server_id dcesrv_server_id(struct dcesrv_connection *conn);
 
+_PUBLIC_ NTSTATUS dcesrv_connection_loop_start(struct dcesrv_connection *conn);
+
 #endif /* SAMBA_DCERPC_SERVER_H */