return NT_STATUS_OK;
}
-uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx,
+NTSTATUS dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
const struct sockaddr_storage *ifss,
- uint16_t port)
+ uint16_t *port)
{
struct dcerpc_ncacn_listen_state *state;
struct tevent_fd *fde;
state = talloc(ev_ctx, struct dcerpc_ncacn_listen_state);
if (state == NULL) {
DEBUG(0, ("setup_dcerpc_ncacn_tcpip_socket: Out of memory\n"));
- return 0;
+ return NT_STATUS_NO_MEMORY;
}
state->fd = -1;
- state->ep.port = port;
+ state->ep.port = *port;
state->disconnect_fn = NULL;
status = dcesrv_create_ncacn_ip_tcp_socket(ifss, &state->ep.port,
rc = listen(state->fd, SMBD_LISTEN_BACKLOG);
if (rc == -1) {
+ status = map_nt_error_from_unix_common(errno);
DEBUG(0,("setup_tcpip_socket: listen - %s\n", strerror(errno)));
goto out;
}
DEBUG(10, ("setup_tcpip_socket: opened socket fd %d for port %u\n",
state->fd, state->ep.port));
+ errno = 0;
fde = tevent_add_fd(state->ev_ctx,
state,
state->fd,
dcesrv_ncacn_ip_tcp_listener,
state);
if (fde == NULL) {
+ if (errno == 0) {
+ errno = ENOMEM;
+ }
+ status = map_nt_error_from_unix_common(errno);
DEBUG(0, ("setup_tcpip_socket: Failed to add event handler!\n"));
goto out;
}
tevent_fd_set_auto_close(fde);
- return state->ep.port;
+ *port = state->ep.port;
+
+ return NT_STATUS_OK;
+
out:
if (state->fd != -1) {
close(state->fd);
}
TALLOC_FREE(state);
- return 0;
+ return status;
}
static void dcesrv_ncacn_ip_tcp_listener(struct tevent_context *ev,
NTSTATUS dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss,
uint16_t *port,
int *out_fd);
-uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx,
+NTSTATUS dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
const struct sockaddr_storage *ifss,
- uint16_t port);
+ uint16_t *port);
NTSTATUS dcesrv_create_ncalrpc_socket(const char *name, int *out_fd);
bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx,
{
uint32_t num_ifs = iface_count();
uint32_t i;
- uint16_t p = 0;
+ uint16_t p = port;
TALLOC_CTX *tmp_ctx;
NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
int rc;
struct tsocket_address *bind_addr;
const char *addr;
- p = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx,
- msg_ctx,
- ifss,
- port);
- if (p == 0) {
- status = NT_STATUS_UNSUCCESSFUL;
+ status = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx,
+ msg_ctx,
+ ifss,
+ &p);
+ if (!NT_STATUS_IS_OK(status)) {
goto done;
}
continue;
}
- p = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx,
- msg_ctx,
- &ss,
- port);
- if (p == 0) {
- status = NT_STATUS_UNSUCCESSFUL;
+ status = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx,
+ msg_ctx,
+ &ss,
+ &p);
+ if (!NT_STATUS_IS_OK(status)) {
goto done;
}