From: Stefan Knoblich Date: Thu, 23 May 2013 00:07:55 +0000 (+0200) Subject: esl: Don't abort the esl_listen() loop(s) if accept() returns with errno == EINTR X-Git-Tag: v1.2.13~201 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4ed7cd977a3fbfa9c491a5797aba15f5422a597b;p=thirdparty%2Ffreeswitch.git esl: Don't abort the esl_listen() loop(s) if accept() returns with errno == EINTR ivrd doesn't use sigaction + SA_RESTART for SIGCHILD. An exiting child process will interrupt accept() in the parent to handle the signal, which makes accept() return -1 (errno = EINTR) after the sighandler function returns. Signed-off-by: Stefan Knoblich --- diff --git a/libs/esl/src/esl.c b/libs/esl/src/esl.c index a78aa58d9b..e8b2f0a1f7 100644 --- a/libs/esl/src/esl.c +++ b/libs/esl/src/esl.c @@ -696,7 +696,7 @@ ESL_DECLARE(esl_status_t) esl_listen(const char *host, esl_port_t port, esl_list clntLen = sizeof(echoClntAddr); - if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == ESL_SOCK_INVALID) { + if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == ESL_SOCK_INVALID && errno != EINTR) { status = ESL_FAIL; goto end; } @@ -754,7 +754,7 @@ ESL_DECLARE(esl_status_t) esl_listen_threaded(const char *host, esl_port_t port, clntLen = sizeof(echoClntAddr); - if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == ESL_SOCK_INVALID) { + if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == ESL_SOCK_INVALID && errno != EINTR) { status = ESL_FAIL; goto end; }