restore accept error as closure signal
authorAndy Green <andy.green@linaro.org>
Fri, 20 Jul 2012 04:58:38 +0000 (12:58 +0800)
committerAndy Green <andy.green@linaro.org>
Fri, 20 Jul 2012 04:58:38 +0000 (12:58 +0800)
Signed-off-by: Andy Green <andy.green@linaro.org>
config.h.in
configure
lib/client-handshake.c
lib/libwebsockets.c
test-server/test-client.c
test-server/test-server-extpoll.c
test-server/test-server.c

index e7dd31b..7e3bec1 100644 (file)
@@ -53,6 +53,9 @@
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
+/* Define to 1 if you have the <sys/prctl.h> header file. */
+#undef HAVE_SYS_PRCTL_H
+
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #undef HAVE_SYS_SOCKET_H
 
index eac5e1d..f6cdf0f 100755 (executable)
--- a/configure
+++ b/configure
@@ -12438,7 +12438,7 @@ fi
 
 
 # Checks for header files.
-for ac_header in zlib.h fcntl.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h
+for ac_header in zlib.h fcntl.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h sys/prctl.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
index d3d3daa..ceb5f76 100644 (file)
@@ -138,7 +138,8 @@ struct libwebsocket *__libwebsocket_client_connect_2(
        wsi->mode = LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE;
        pfd.fd = wsi->sock;
        pfd.revents = POLLIN;
-       libwebsocket_service_fd(context, &pfd);
+       if (libwebsocket_service_fd(context, &pfd) < 0)
+               goto oom4;
 
        return wsi;
 
index 7680817..03147e1 100644 (file)
@@ -1529,8 +1529,8 @@ libwebsocket_service_fd(struct libwebsocket_context *context,
                accept_fd  = accept(pollfd->fd, (struct sockaddr *)&cli_addr,
                                                                       &clilen);
                if (accept_fd < 0) {
-                       fprintf(stderr, "ERROR on accept");
-                       break;
+                       debug("ERROR on accept\n");
+                       return -1;
                }
 
                /* Disable Nagle */
@@ -1641,8 +1641,8 @@ libwebsocket_service_fd(struct libwebsocket_context *context,
                accept_fd  = accept(pollfd->fd, (struct sockaddr *)&cli_addr,
                                                                       &clilen);
                if (accept_fd < 0) {
-                       fprintf(stderr, "ERROR on accept");
-                       break;
+                       debug("ERROR on accept\n");
+                       return -1;
                }
 
                if (context->fds_count >= MAX_CLIENTS) {
@@ -2174,15 +2174,16 @@ libwebsocket_service(struct libwebsocket_context *context, int timeout_ms)
                /*
                fprintf(stderr, "Listen Socket dead\n");
                */
-               return 1;
+               return -1;
        }
 
        /* handle accept on listening socket? */
 
        for (n = 0; n < context->fds_count; n++)
                if (context->fds[n].revents)
-                       libwebsocket_service_fd(context, &context->fds[n]);
-
+                       if (libwebsocket_service_fd(context,
+                                                       &context->fds[n]) < 0)
+                               return -1;
        return 0;
 }
 
@@ -3030,7 +3031,7 @@ libwebsockets_fork_service_loop(struct libwebsocket_context *context)
 
        while (1) {
                if (libwebsocket_service(context, 1000))
-                       return -1;
+                       break;
 #ifndef HAVE_SYS_PRCTL_H
 /*
  * on systems without prctl() (i.e. anything but linux) we can notice that our
@@ -3044,7 +3045,7 @@ libwebsockets_fork_service_loop(struct libwebsocket_context *context)
     }
 
 
-       return 0;
+       return 1;
 }
 
 #endif
index 9d1d9ef..ffd6365 100644 (file)
@@ -287,6 +287,9 @@ int main(int argc, char **argv)
        while (n >= 0 && !was_closed) {
                n = libwebsocket_service(context, 1000);
 
+               if (n < 0)
+                       continue;
+
                if (wsi_mirror == NULL) {
 
                        /* create a client websocket using mirror protocol */
index 0b44d8a..8131412 100644 (file)
@@ -517,8 +517,9 @@ int main(int argc, char **argv)
                                        * match anything under libwebsockets
                                        * control
                                        */
-                                       libwebsocket_service_fd(context,
-                                                                  &pollfds[n]);
+                                       if (libwebsocket_service_fd(context,
+                                                                 &pollfds[n]))
+                                               goto done;
 
                /* do our broadcast periodically */
 
index dae0a8d..516deff 100644 (file)
@@ -463,7 +463,8 @@ int main(int argc, char **argv)
 
        fprintf(stderr, " Using no-fork service loop\n");
 
-       while (1) {
+       n = 0;
+       while (n >= 0) {
                struct timeval tv;
 
                gettimeofday(&tv, NULL);
@@ -495,10 +496,11 @@ int main(int argc, char **argv)
                 * "manually".
                 *
                 * If no socket is needing service, the call below returns
-                * immediately and quickly.
+                * immediately and quickly.  Negative return means we are
+                * in process of closing
                 */
 
-               libwebsocket_service(context, 50);
+               n = libwebsocket_service(context, 50);
        }
 
 #else