s3:rpc_server: Add termination function and data to dcerpc_ncacn_conn
authorSamuel Cabrero <scabrero@suse.de>
Mon, 18 Feb 2019 17:48:57 +0000 (18:48 +0100)
committerStefan Metzmacher <metze@samba.org>
Mon, 22 Jul 2019 16:49:14 +0000 (16:49 +0000)
In preparation to remove the named_pipe_client structure, this function
will be called from ncacn_conn destructor passing the private data pointer
as argument. It is mainly used by preforked childs in "process model" to
attend the next client as soon as the previous client ends the connection.

Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/rpc_server/lsasd.c
source3/rpc_server/mdssd.c
source3/rpc_server/rpc_server.c
source3/rpc_server/rpc_server.h

index be99f825693f13f65a03b36d893e49dc5efcb54c..a1fa3a717463169e26b37adad3d49f177a9fad6d 100644 (file)
@@ -447,7 +447,9 @@ static void lsasd_handle_client(struct tevent_req *req)
                                    cli_addr,
                                    srv_addr,
                                    sd,
-                                   NULL);
+                                   NULL,  /* disconnect function */
+                                   lsasd_client_terminated,
+                                   data);
        } else if (tsocket_address_is_unix(srv_addr)) {
                const char *p;
                const char *b;
@@ -480,7 +482,9 @@ static void lsasd_handle_client(struct tevent_req *req)
                                            cli_addr,
                                            srv_addr,
                                            sd,
-                                           NULL);
+                                           NULL,  /* disconnect function */
+                                           lsasd_client_terminated,
+                                           data);
                }
        } else {
                DEBUG(0, ("ERROR: Unsupported socket!\n"));
index 5b39bda23690da6b237a56363886a5c10df2c006..2b712acc048b9bb4a4224d0235bf4a3c13e26c96 100644 (file)
@@ -390,7 +390,9 @@ static void mdssd_handle_client(struct tevent_req *req)
                                    cli_addr,
                                    srv_addr,
                                    sd,
-                                   NULL);
+                                   NULL,  /* disconnect function */
+                                   mdssd_client_terminated,
+                                   data);
        } else if (tsocket_address_is_unix(srv_addr)) {
                const char *p;
                const char *b;
@@ -423,7 +425,9 @@ static void mdssd_handle_client(struct tevent_req *req)
                                            cli_addr,
                                            srv_addr,
                                            sd,
-                                           NULL);
+                                           NULL,  /* disconnect function */
+                                           mdssd_client_terminated,
+                                           data);
                }
        } else {
                DEBUG(0, ("ERROR: Unsupported socket!\n"));
index 625669c294f1ba3df13c1ba64b15af2867ce29c6..96d80599112439359ba82e1b0e27b20f277032be 100644 (file)
@@ -89,6 +89,8 @@ struct dcerpc_ncacn_listen_state {
        struct tevent_context *ev_ctx;
        struct messaging_context *msg_ctx;
        dcerpc_ncacn_disconnect_fn disconnect_fn;
+       dcerpc_ncacn_termination_fn termination_fn;
+       void *termination_data;
 };
 
 static void dcesrv_ncacn_np_listener(struct tevent_context *ev,
@@ -782,7 +784,9 @@ static void dcesrv_ncacn_ip_tcp_listener(struct tevent_context *ev,
                            cli_addr,
                            srv_addr,
                            s,
-                           NULL);
+                           state->disconnect_fn,
+                           state->termination_fn,
+                           state->termination_data);
 }
 
 /********************************************************************
@@ -964,7 +968,9 @@ static void dcesrv_ncalrpc_listener(struct tevent_context *ev,
                            NCALRPC,
                            state->ep.name,
                            cli_addr, srv_addr, sd,
-                           state->disconnect_fn);
+                           state->disconnect_fn,
+                           state->termination_fn,
+                           state->termination_data);
 }
 
 static int dcerpc_ncacn_conn_destructor(struct dcerpc_ncacn_conn *ncacn_conn)
@@ -975,6 +981,11 @@ static int dcerpc_ncacn_conn_destructor(struct dcerpc_ncacn_conn *ncacn_conn)
                        DBG_WARNING("Failed to call disconnect function\n");
                }
        }
+
+       if (ncacn_conn->termination_fn != NULL) {
+               ncacn_conn->termination_fn(ncacn_conn->termination_data);
+       }
+
        return 0;
 }
 
@@ -988,7 +999,10 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
                         struct tsocket_address *cli_addr,
                         struct tsocket_address *srv_addr,
                         int s,
-                        dcerpc_ncacn_disconnect_fn fn) {
+                        dcerpc_ncacn_disconnect_fn disconnect_fn,
+                        dcerpc_ncacn_termination_fn termination_fn,
+                        void *termination_data)
+{
        struct dcerpc_ncacn_conn *ncacn_conn;
        struct tevent_req *subreq;
        char *pipe_name;
@@ -1012,7 +1026,9 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
        ncacn_conn->ev_ctx = ev_ctx;
        ncacn_conn->msg_ctx = msg_ctx;
        ncacn_conn->sock = s;
-       ncacn_conn->disconnect_fn = fn;
+       ncacn_conn->disconnect_fn = disconnect_fn;
+       ncacn_conn->termination_fn = termination_fn;
+       ncacn_conn->termination_data = termination_data;
 
        ncacn_conn->remote_client_addr = talloc_move(ncacn_conn, &cli_addr);
        if (tsocket_address_is_inet(ncacn_conn->remote_client_addr, "ip")) {
index 2b2bd253629a2d7569bacd048d0e277a0e8077bb..9a900f3a2fbddcff20d5424687802af141ae3c0f 100644 (file)
@@ -27,6 +27,7 @@ struct auth_session_info;
 
 typedef bool (*dcerpc_ncacn_disconnect_fn)(struct pipes_struct *p);
 typedef void (*named_pipe_termination_fn)(void *private_data);
+typedef void (*dcerpc_ncacn_termination_fn)(void *private_data);
 
 struct dcerpc_ncacn_conn {
        enum dcerpc_transport_t transport;
@@ -35,6 +36,8 @@ struct dcerpc_ncacn_conn {
 
        struct pipes_struct *p;
        dcerpc_ncacn_disconnect_fn disconnect_fn;
+       dcerpc_ncacn_termination_fn termination_fn;
+       void *termination_data;
 
        struct tevent_context *ev_ctx;
        struct messaging_context *msg_ctx;
@@ -136,6 +139,8 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
                         struct tsocket_address *cli_addr,
                         struct tsocket_address *srv_addr,
                         int s,
-                        dcerpc_ncacn_disconnect_fn fn);
+                        dcerpc_ncacn_disconnect_fn disconnect_fn,
+                        dcerpc_ncacn_termination_fn termination_fn,
+                        void *termination_data);
 
 #endif /* _PRC_SERVER_H_ */