From: Samuel Cabrero Date: Wed, 27 Feb 2019 13:01:11 +0000 (+0100) Subject: s3:rpc_server: Add a function to setup the endpoints X-Git-Tag: ldb-2.2.0~1340 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c97a77297d266fa56f15f71d6978a945758d2699;p=thirdparty%2Fsamba.git s3:rpc_server: Add a function to setup the endpoints The pidl-generated initialization function for each endpoint server will register the RPC interface in all endpoints defined in the idl file. The interface registration code will create the endpoint if it does not exists (as an endpoint can serve multiple interfaces) and will add it to the endpoint list exiting in the dcesrv_context. This commit adds a generic dcesrv_setup_endpoint_sockets function which will be used by embedded services and non-preforking external daemons to setup the sockets regardless the transport. Signed-off-by: Samuel Cabrero Reviewed-by: Andrew Bartlett --- diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index 3891d5d6c40..8d96198067e 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -22,9 +22,10 @@ #include "librpc/rpc/rpc_common.h" /* For enum dcerpc_transport_t */ +#include "librpc/rpc/dcesrv_core.h" + struct pipes_struct; struct auth_session_info; -struct dcesrv_call_state; struct cli_credentials; typedef void (*dcerpc_ncacn_termination_fn)(struct pipes_struct *, void *); diff --git a/source3/rpc_server/rpc_service_setup.c b/source3/rpc_server/rpc_service_setup.c index 77b0af8bdcf..23c28469763 100644 --- a/source3/rpc_server/rpc_service_setup.c +++ b/source3/rpc_server/rpc_service_setup.c @@ -115,6 +115,77 @@ NTSTATUS rpc_setup_embedded(struct tevent_context *ev_ctx, return NT_STATUS_OK; } +NTSTATUS dcesrv_setup_endpoint_sockets(struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + struct dcesrv_context *dce_ctx, + struct dcesrv_endpoint *e, + struct dcerpc_binding_vector *bvec, + dcerpc_ncacn_termination_fn term_fn, + void *term_data) +{ + enum dcerpc_transport_t transport = + dcerpc_binding_get_transport(e->ep_description); + char *binding = NULL; + NTSTATUS status; + + binding = dcerpc_binding_string(dce_ctx, e->ep_description); + if (binding == NULL) { + return NT_STATUS_NO_MEMORY; + } + + DBG_DEBUG("Setting up endpoint '%s'\n", binding); + + switch (transport) { + case NCALRPC: + /* TODO */ + status = NT_STATUS_OK; + break; + + case NCACN_IP_TCP: + /* TODO */ + status = NT_STATUS_OK; + break; + + case NCACN_NP: + /* TODO */ + status = NT_STATUS_OK; + break; + + default: + status = NT_STATUS_NOT_SUPPORTED; + break; + } + + /* Build binding string again as the endpoint may have changed by + * dcesrv_create__socket functions */ + TALLOC_FREE(binding); + binding = dcerpc_binding_string(dce_ctx, e->ep_description); + if (binding == NULL) { + return NT_STATUS_NO_MEMORY; + } + + if (!NT_STATUS_IS_OK(status)) { + struct dcesrv_if_list *iface = NULL; + DBG_ERR("Failed to setup '%s' sockets for ", binding); + for (iface = e->interface_list; iface; iface = iface->next) { + DEBUGADD(DBGLVL_ERR, ("'%s' ", iface->iface->name)); + } + DEBUGADD(DBGLVL_ERR, (": %s\n", nt_errstr(status))); + return status; + } else { + struct dcesrv_if_list *iface = NULL; + DBG_INFO("Successfully listening on '%s' for ", binding); + for (iface = e->interface_list; iface; iface = iface->next) { + DEBUGADD(DBGLVL_INFO, ("'%s' ", iface->iface->name)); + } + DEBUGADD(DBGLVL_INFO, ("\n")); + } + + TALLOC_FREE(binding); + + return status; +} + static NTSTATUS rpc_setup_winreg(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx) { diff --git a/source3/rpc_server/rpc_service_setup.h b/source3/rpc_server/rpc_service_setup.h index 197eca91893..08bca1d4955 100644 --- a/source3/rpc_server/rpc_service_setup.h +++ b/source3/rpc_server/rpc_service_setup.h @@ -22,15 +22,23 @@ #ifndef _RPC_EP_SETUP_H #define _RPC_EP_SETUP_H -struct ndr_interface_table; -struct rpc_srv_callbacks; -struct dcesrv_context; +#include "rpc_server/rpc_server.h" + +struct dcerpc_binding_vector; NTSTATUS dcesrv_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, struct dcesrv_context *dce_ctx); +NTSTATUS dcesrv_setup_endpoint_sockets(struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + struct dcesrv_context *dce_ctx, + struct dcesrv_endpoint *e, + struct dcerpc_binding_vector *bvec, + dcerpc_ncacn_termination_fn term_fn, + void *term_data); + NTSTATUS rpc_setup_embedded(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const struct ndr_interface_table *t,