From 9d6d2aeba7fd772de14dfe6f2ed4b0fc5a719fb3 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Fri, 11 Nov 2016 13:03:43 -0800 Subject: [PATCH] GUACAMOLE-118: Migrate to poll() instead of select() for file descriptor guac_socket implementation. --- src/libguac/socket-fd.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/libguac/socket-fd.c b/src/libguac/socket-fd.c index 8190b863..0ed57485 100644 --- a/src/libguac/socket-fd.c +++ b/src/libguac/socket-fd.c @@ -22,6 +22,7 @@ #include "error.h" #include "socket.h" +#include #include #include #include @@ -30,12 +31,6 @@ #include #include -#ifdef __MINGW32__ -#include -#else -#include -#endif - /** * Data associated with an open socket which writes to a file descriptor. */ @@ -337,24 +332,22 @@ static int guac_socket_fd_select_handler(guac_socket* socket, guac_socket_fd_data* data = (guac_socket_fd_data*) socket->data; - fd_set fds; - struct timeval timeout; int retval; - /* Initialize fd_set with single underlying file descriptor */ - FD_ZERO(&fds); - FD_SET(data->fd, &fds); + /* Initialize with single underlying file descriptor */ + struct pollfd fds[1] = {{ + .fd = data->fd, + .events = POLLIN, + .revents = 0, + }}; /* No timeout if usec_timeout is negative */ if (usec_timeout < 0) - retval = select(data->fd + 1, &fds, NULL, NULL, NULL); + retval = poll(fds, 1, -1); - /* Handle timeout if specified */ - else { - timeout.tv_sec = usec_timeout/1000000; - timeout.tv_usec = usec_timeout%1000000; - retval = select(data->fd + 1, &fds, NULL, NULL, &timeout); - } + /* Handle timeout if specified, rounding up to poll()'s granularity */ + else + retval = poll(fds, 1, (usec_timeout + 999) / 1000); /* Properly set guac_error */ if (retval < 0) {