DBG_INFO("Initializing DCE/RPC connection endpoints\n");
for (e = dce_ctx->endpoint_list; e; e = e->next) {
+ int *fds = NULL;
+ size_t j, num_fds;
+
status = dcesrv_create_endpoint_sockets(ev_ctx,
msg_ctx,
dce_ctx,
e,
- listen_fd,
- listen_fd_size);
+ dce_ctx,
+ &num_fds,
+ &fds);
if (!NT_STATUS_IS_OK(status)) {
char *ep_string = dcerpc_binding_string(
dce_ctx, e->ep_description);
TALLOC_FREE(ep_string);
goto done;
}
+ for (j=0; j<num_fds; j++) {
+ listen_fd[*listen_fd_size].fd = fds[j];
+ listen_fd[*listen_fd_size].fd_data = e;
+ (*listen_fd_size)++;
+ }
+ TALLOC_FREE(fds);
}
for (i = 0; i < *listen_fd_size; i++) {
DBG_INFO("Initializing DCE/RPC connection endpoints\n");
for (e = dce_ctx->endpoint_list; e; e = e->next) {
+ int *fds = NULL;
+ size_t j, num_fds;
+
status = dcesrv_create_endpoint_sockets(ev_ctx,
msg_ctx,
dce_ctx,
e,
- listen_fd,
- listen_fd_size);
+ dce_ctx,
+ &num_fds,
+ &fds);
if (!NT_STATUS_IS_OK(status)) {
char *ep_string = dcerpc_binding_string(
dce_ctx, e->ep_description);
TALLOC_FREE(ep_string);
goto done;
}
+ for (j=0; j<num_fds; j++) {
+ listen_fd[*listen_fd_size].fd = fds[j];
+ listen_fd[*listen_fd_size].fd_data = e;
+ (*listen_fd_size)++;
+ }
+ TALLOC_FREE(fds);
}
for (i = 0; i < *listen_fd_size; i++) {
DBG_INFO("Initializing DCE/RPC connection endpoints\n");
for (e = dce_ctx->endpoint_list; e; e = e->next) {
+ int *fds = NULL;
+ size_t j, num_fds;
+
status = dcesrv_create_endpoint_sockets(ev_ctx,
msg_ctx,
dce_ctx,
e,
- listen_fd,
- listen_fd_size);
+ dce_ctx,
+ &num_fds,
+ &fds);
if (!NT_STATUS_IS_OK(status)) {
char *ep_string = dcerpc_binding_string(
dce_ctx, e->ep_description);
TALLOC_FREE(ep_string);
goto done;
}
+ for (j=0; j<num_fds; j++) {
+ listen_fd[*listen_fd_size].fd = fds[j];
+ listen_fd[*listen_fd_size].fd_data = e;
+ (*listen_fd_size)++;
+ }
+ TALLOC_FREE(fds);
}
for (i = 0; i < *listen_fd_size; i++) {
struct messaging_context *msg_ctx,
struct dcesrv_context *dce_ctx,
struct dcesrv_endpoint *e,
- struct pf_listen_fd *listen_fds,
- int *listen_fds_size)
+ TALLOC_CTX *mem_ctx,
+ size_t *pnum_fds,
+ int **pfds)
{
enum dcerpc_transport_t transport =
dcerpc_binding_get_transport(e->ep_description);
char *binding = NULL;
+ int *fds = NULL;
+ size_t num_fds;
NTSTATUS status;
- int out_fd;
- binding = dcerpc_binding_string(dce_ctx, e->ep_description);
+ binding = dcerpc_binding_string(mem_ctx, e->ep_description);
if (binding == NULL) {
return NT_STATUS_NO_MEMORY;
}
-
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(e, &out_fd);
- if (NT_STATUS_IS_OK(status)) {
- listen_fds[*listen_fds_size].fd = out_fd;
- listen_fds[*listen_fds_size].fd_data = e;
- (*listen_fds_size)++;
- }
+ status = dcesrv_create_ncalrpc_socket(e, fds);
break;
case NCACN_IP_TCP: {
- int *fds = NULL;
- size_t num_fds;
+ TALLOC_FREE(fds);
status = dcesrv_create_ncacn_ip_tcp_sockets(
e, talloc_tos(), &num_fds, &fds);
- if (NT_STATUS_IS_OK(status)) {
- size_t i;
- for (i=0; i<num_fds; i++) {
- listen_fds[*listen_fds_size].fd = fds[i];
- listen_fds[*listen_fds_size].fd_data = e;
- (*listen_fds_size)++;
- }
- }
- TALLOC_FREE(fds);
break;
}
case NCACN_NP:
- status = dcesrv_create_ncacn_np_socket(e, &out_fd);
- if (NT_STATUS_IS_OK(status)) {
- listen_fds[*listen_fds_size].fd = out_fd;
- listen_fds[*listen_fds_size].fd_data = e;
- (*listen_fds_size)++;
- }
+ status = dcesrv_create_ncacn_np_socket(e, fds);
break;
default:
/* Build binding string again as the endpoint may have changed by
* dcesrv_create_<transport>_socket functions */
- TALLOC_FREE(binding);
- binding = dcerpc_binding_string(dce_ctx, e->ep_description);
+ binding = dcerpc_binding_string(mem_ctx, e->ep_description);
if (binding == NULL) {
return NT_STATUS_NO_MEMORY;
}
TALLOC_FREE(binding);
+ *pnum_fds = num_fds;
+ *pfds = fds;
+
return status;
}
struct messaging_context *msg_ctx,
struct dcesrv_context *dce_ctx,
struct dcesrv_endpoint *e,
- struct pf_listen_fd *listen_fds,
- int *listen_fds_size);
+ TALLOC_CTX *mem_ctx,
+ size_t *pnum_fds,
+ int **pfds);
NTSTATUS rpc_setup_embedded(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,