]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
esl: Don't abort the esl_listen() loop(s) if accept() returns with errno == EINTR
authorStefan Knoblich <stkn@openisdn.net>
Thu, 23 May 2013 00:07:55 +0000 (02:07 +0200)
committerTravis Cross <tc@traviscross.com>
Fri, 7 Jun 2013 05:42:45 +0000 (05:42 +0000)
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 <stkn@openisdn.net>
libs/esl/src/esl.c

index a78aa58d9b9afefb9966f2ad36836e806982656d..e8b2f0a1f72a2c23a4d0cb4065199f682a7ae860 100644 (file)
@@ -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;
                }