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;
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_<transport>_socket functions */
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_<transport>_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;
#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;
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,
* 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;
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: */