From: Volker Lendecke Date: Sat, 16 Jan 2021 21:40:37 +0000 (+0100) Subject: rpc_server: Consolidate transport-specific socket creation X-Git-Tag: tevent-0.11.0~1984 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4e46cae4c85151dde14f7fd1ad2bda065687cfc;p=thirdparty%2Fsamba.git rpc_server: Consolidate transport-specific socket creation We had the transport switch in two places, put them together into dcesrv_create_binding_sockets(). This makes the transport-specific socket creation functions static to rpc_sock_helper.c. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/rpc_server/rpc_service_setup.c b/source3/rpc_server/rpc_service_setup.c index 411880d5536..4d4af724126 100644 --- a/source3/rpc_server/rpc_service_setup.c +++ b/source3/rpc_server/rpc_service_setup.c @@ -93,7 +93,6 @@ NTSTATUS dcesrv_create_endpoint_sockets(struct tevent_context *ev_ctx, int **pfds) { struct dcerpc_binding *b = e->ep_description; - enum dcerpc_transport_t transport = dcerpc_binding_get_transport(b); char *binding = NULL; int *fds = NULL; size_t num_fds; @@ -106,33 +105,7 @@ NTSTATUS dcesrv_create_endpoint_sockets(struct tevent_context *ev_ctx, DBG_DEBUG("Creating endpoint '%s'\n", binding); TALLOC_FREE(binding); - fds = talloc(mem_ctx, int); - if (fds == NULL) { - return NT_STATUS_NO_MEMORY; - } - num_fds = 1; - - switch (transport) { - case NCALRPC: - status = dcesrv_create_ncalrpc_socket(b, fds); - break; - - case NCACN_IP_TCP: { - TALLOC_FREE(fds); - - status = dcesrv_create_ncacn_ip_tcp_sockets( - b, talloc_tos(), &num_fds, &fds); - break; - } - - case NCACN_NP: - status = dcesrv_create_ncacn_np_socket(b, fds); - break; - - default: - status = NT_STATUS_NOT_SUPPORTED; - break; - } + status = dcesrv_create_binding_sockets(b, mem_ctx, &num_fds, &fds); /* Build binding string again as the endpoint may have changed by * dcesrv_create__socket functions */ @@ -250,47 +223,27 @@ NTSTATUS dcesrv_setup_endpoint_sockets(struct tevent_context *ev_ctx, void *term_data) { TALLOC_CTX *frame = talloc_stackframe(); - enum dcerpc_transport_t transport = - dcerpc_binding_get_transport(e->ep_description); + struct dcerpc_binding *b = e->ep_description; char *binding = NULL; NTSTATUS status = NT_STATUS_NO_MEMORY; struct dcesrv_if_list *iface = NULL; - int fd = -1; - int *fds = &fd; - size_t i, num_fds = 1; + int *fds = NULL; + size_t i, num_fds = 0; struct dcerpc_ncacn_listen_state **listen_states = NULL; - binding = dcerpc_binding_string(frame, e->ep_description); + binding = dcerpc_binding_string(frame, b); if (binding == NULL) { goto fail; } DBG_DEBUG("Setting up endpoint '%s'\n", binding); + TALLOC_FREE(binding); - switch (transport) { - case NCALRPC: - status = dcesrv_create_ncalrpc_socket(e->ep_description, &fd); - break; - - case NCACN_IP_TCP: - status = dcesrv_create_ncacn_ip_tcp_sockets( - e->ep_description, frame, &num_fds, &fds); - break; - - case NCACN_NP: - status = dcesrv_create_ncacn_np_socket( - e->ep_description, &fd); - break; - - default: - status = NT_STATUS_NOT_SUPPORTED; - break; - } + status = dcesrv_create_binding_sockets(b, frame, &num_fds, &fds); /* Build binding string again as the endpoint may have changed by * dcesrv_create__socket functions */ - TALLOC_FREE(binding); - binding = dcerpc_binding_string(frame, e->ep_description); + binding = dcerpc_binding_string(frame, b); if (binding == NULL) { status = NT_STATUS_NO_MEMORY; goto fail; diff --git a/source3/rpc_server/rpc_sock_helper.c b/source3/rpc_server/rpc_sock_helper.c index 852c87498ce..7bd929db96d 100644 --- a/source3/rpc_server/rpc_sock_helper.c +++ b/source3/rpc_server/rpc_sock_helper.c @@ -32,7 +32,8 @@ #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV -NTSTATUS dcesrv_create_ncacn_np_socket(struct dcerpc_binding *b, int *out_fd) +static NTSTATUS dcesrv_create_ncacn_np_socket( + struct dcerpc_binding *b, int *out_fd) { char *np_dir = NULL; int fd = -1; @@ -152,7 +153,7 @@ static NTSTATUS dcesrv_create_ncacn_ip_tcp_socket( return NT_STATUS_OK; } -NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets( +static NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets( struct dcerpc_binding *b, TALLOC_CTX *mem_ctx, size_t *pnum_fds, @@ -276,7 +277,8 @@ fail: * Start listening on the ncalrpc socket ********************************************************************/ -NTSTATUS dcesrv_create_ncalrpc_socket(struct dcerpc_binding *b, int *out_fd) +static NTSTATUS dcesrv_create_ncalrpc_socket( + struct dcerpc_binding *b, int *out_fd) { int fd = -1; const char *endpoint = NULL; @@ -338,4 +340,48 @@ out: return status; } +NTSTATUS dcesrv_create_binding_sockets( + struct dcerpc_binding *b, + TALLOC_CTX *mem_ctx, + size_t *pnum_fds, + int **pfds) +{ + enum dcerpc_transport_t transport = dcerpc_binding_get_transport(b); + size_t num_fds = 1; + int *fds = NULL; + NTSTATUS status; + + if ((transport == NCALRPC) || (transport == NCACN_NP)) { + fds = talloc(mem_ctx, int); + if (fds == NULL) { + return NT_STATUS_NO_MEMORY; + } + } + + switch(transport) { + case NCALRPC: + status = dcesrv_create_ncalrpc_socket(b, fds); + break; + case NCACN_NP: + status = dcesrv_create_ncacn_np_socket(b, fds); + break; + case NCACN_IP_TCP: + status = dcesrv_create_ncacn_ip_tcp_sockets( + b, talloc_tos(), &num_fds, &fds); + break; + default: + status = NT_STATUS_NOT_SUPPORTED; + break; + } + + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(fds); + return status; + } + + *pfds = fds; + *pnum_fds = num_fds; + return NT_STATUS_OK; +} + /* vim: set ts=8 sw=8 noet cindent syntax=c.doxygen: */ diff --git a/source3/rpc_server/rpc_sock_helper.h b/source3/rpc_server/rpc_sock_helper.h index 0404a0e8d6c..9c8128afe8c 100644 --- a/source3/rpc_server/rpc_sock_helper.h +++ b/source3/rpc_server/rpc_sock_helper.h @@ -25,15 +25,11 @@ #include "rpc_server.h" -struct pf_listen_fd; - -NTSTATUS dcesrv_create_ncacn_np_socket(struct dcerpc_binding *b, int *out_fd); -NTSTATUS dcesrv_create_ncalrpc_socket(struct dcerpc_binding *b, int *fd); -NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets( +NTSTATUS dcesrv_create_binding_sockets( struct dcerpc_binding *b, TALLOC_CTX *mem_ctx, size_t *pnum_fds, - int **pfds); + int **fds); #endif /* _RPC_SOCK_HELPER_H_ */