From 42ff8562165806e340a62a1704f779af1b727715 Mon Sep 17 00:00:00 2001 From: Sean Bright <sean.bright@gmail.com> Date: Tue, 11 Dec 2018 09:54:43 -0500 Subject: [PATCH] Use non-blocking socket() and pipe() wrappers Change-Id: I050ceffe5a133d5add2dab46687209813d58f597 --- main/tcptls.c | 3 +-- main/udptl.c | 3 +-- res/res_agi.c | 7 +------ res/res_rtp_asterisk.c | 17 +++++++---------- res/res_timing_pthread.c | 7 +------ 5 files changed, 11 insertions(+), 26 deletions(-) diff --git a/main/tcptls.c b/main/tcptls.c index 3ba52ff6a3..7930c5002b 100644 --- a/main/tcptls.c +++ b/main/tcptls.c @@ -746,7 +746,7 @@ void ast_tcptls_server_start(struct ast_tcptls_session_args *desc) return; } - desc->accept_fd = socket(ast_sockaddr_is_ipv6(&desc->local_address) ? + desc->accept_fd = ast_socket_nonblock(ast_sockaddr_is_ipv6(&desc->local_address) ? AF_INET6 : AF_INET, SOCK_STREAM, 0); if (desc->accept_fd < 0) { ast_log(LOG_ERROR, "Unable to allocate socket for %s: %s\n", desc->name, strerror(errno)); @@ -767,7 +767,6 @@ void ast_tcptls_server_start(struct ast_tcptls_session_args *desc) } systemd_socket_activation: - ast_fd_set_flags(desc->accept_fd, O_NONBLOCK); if (ast_pthread_create_background(&desc->master, NULL, desc->accept_fn, desc)) { ast_log(LOG_ERROR, "Unable to launch thread for %s on %s: %s\n", desc->name, diff --git a/main/udptl.c b/main/udptl.c index 7349d6aa4c..99a9c74149 100644 --- a/main/udptl.c +++ b/main/udptl.c @@ -1037,13 +1037,12 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct ast_sched_context *sched, s udptl->tx[i].buf_len = -1; } - if ((udptl->fd = socket(ast_sockaddr_is_ipv6(addr) ? + if ((udptl->fd = ast_socket_nonblock(ast_sockaddr_is_ipv6(addr) ? AF_INET6 : AF_INET, SOCK_DGRAM, 0)) < 0) { ast_free(udptl); ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno)); return NULL; } - ast_fd_set_flags(udptl->fd, O_NONBLOCK); #ifdef SO_NO_CHECK if (cfg->general->nochecksums) diff --git a/res/res_agi.c b/res/res_agi.c index e322d7ff61..0e2c76faff 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -2071,16 +2071,11 @@ static enum agi_result launch_netscript(char *agiurl, char *argv[], int *fds) ast_sockaddr_set_port(&addrs[i], AGI_PORT); } - if ((s = socket(addrs[i].ss.ss_family, SOCK_STREAM, IPPROTO_TCP)) < 0) { + if ((s = ast_socket_nonblock(addrs[i].ss.ss_family, SOCK_STREAM, IPPROTO_TCP)) < 0) { ast_log(LOG_WARNING, "Unable to create socket: %s\n", strerror(errno)); continue; } - if (ast_fd_set_flags(s, O_NONBLOCK)) { - close(s); - continue; - } - if (ast_connect(s, &addrs[i]) && errno == EINPROGRESS) { if (handle_connection(agiurl, addrs[i], s)) { diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index c2299bc9e4..605d69b462 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -3112,21 +3112,18 @@ static double stddev_compute(double stddev, double sample, double normdev, doubl static int create_new_socket(const char *type, int af) { - int sock = socket(af, SOCK_DGRAM, 0); + int sock = ast_socket_nonblock(af, SOCK_DGRAM, 0); if (sock < 0) { - if (!type) { - type = "RTP/RTCP"; - } ast_log(LOG_WARNING, "Unable to allocate %s socket: %s\n", type, strerror(errno)); - } else { - ast_fd_set_flags(sock, O_NONBLOCK); + return sock; + } + #ifdef SO_NO_CHECK - if (nochecksums) { - setsockopt(sock, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums)); - } -#endif + if (nochecksums) { + setsockopt(sock, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums)); } +#endif return sock; } diff --git a/res/res_timing_pthread.c b/res/res_timing_pthread.c index c101579810..3ca7e5c28e 100644 --- a/res/res_timing_pthread.c +++ b/res/res_timing_pthread.c @@ -114,7 +114,6 @@ static struct { static void *pthread_timer_open(void) { struct pthread_timer *timer; - int i; if (!(timer = ao2_alloc(sizeof(*timer), pthread_timer_destructor))) { errno = ENOMEM; @@ -124,15 +123,11 @@ static void *pthread_timer_open(void) timer->pipe[PIPE_READ] = timer->pipe[PIPE_WRITE] = -1; timer->state = TIMER_STATE_IDLE; - if (pipe(timer->pipe)) { + if (ast_pipe_nonblock(timer->pipe)) { ao2_ref(timer, -1); return NULL; } - for (i = 0; i < ARRAY_LEN(timer->pipe); ++i) { - ast_fd_set_flags(timer->pipe[i], O_NONBLOCK); - } - ao2_lock(pthread_timers); if (!ao2_container_count(pthread_timers)) { ast_mutex_lock(&timing_thread.lock); -- GitLab