From: Samuel Cabrero Date: Mon, 18 Feb 2019 17:48:57 +0000 (+0100) Subject: s3:rpc_server: Add termination function and data to dcerpc_ncacn_conn X-Git-Tag: talloc-2.3.0~27 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=61fb17f85bf7c6a33253d9b34a044d614b733c2b;p=thirdparty%2Fsamba.git s3:rpc_server: Add termination function and data to dcerpc_ncacn_conn 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 Reviewed-by: Andreas Schneider --- diff --git a/source3/rpc_server/lsasd.c b/source3/rpc_server/lsasd.c index be99f825693..a1fa3a71746 100644 --- a/source3/rpc_server/lsasd.c +++ b/source3/rpc_server/lsasd.c @@ -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")); diff --git a/source3/rpc_server/mdssd.c b/source3/rpc_server/mdssd.c index 5b39bda2369..2b712acc048 100644 --- a/source3/rpc_server/mdssd.c +++ b/source3/rpc_server/mdssd.c @@ -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")); diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 625669c294f..96d80599112 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -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")) { diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index 2b2bd253629..9a900f3a2fb 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -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_ */