From: Christian Mauderer <christian.maude...@embedded-brains.de> This patch provides a poll() replacement based on the poll() used for civetweb on windows.
A similar patch based on the one on http://forums.bannister.org/ubbthreads.php?ubb=showflat&topic=7600&gonew=1 had been integrated into the RTEMS version of mongoose in commit b5d2d4a61ce91765e9cac1b02271a8f4b049c558. --- cpukit/mghttpd/civetweb.c | 93 +++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/cpukit/mghttpd/civetweb.c b/cpukit/mghttpd/civetweb.c index 32cee56..5c5cd72 100644 --- a/cpukit/mghttpd/civetweb.c +++ b/cpukit/mghttpd/civetweb.c @@ -376,17 +376,6 @@ typedef struct DIR { struct dirent result; } DIR; -#if defined(_WIN32) && !defined(POLLIN) -#ifndef HAVE_POLL -struct pollfd { - SOCKET fd; - short events; - short revents; -}; -#define POLLIN (0x0300) -#endif -#endif - /* Mark required libraries */ #if defined(_MSC_VER) #pragma comment(lib, "Ws2_32.lib") @@ -397,7 +386,9 @@ struct pollfd { #include <sys/wait.h> #include <sys/socket.h> +#ifdef HAVE_POLL #include <sys/poll.h> +#endif #include <netinet/in.h> #include <arpa/inet.h> #include <sys/time.h> @@ -467,6 +458,15 @@ typedef int SOCKET; #endif /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ block */ +#ifndef HAVE_POLL +struct pollfd { + SOCKET fd; + short events; + short revents; +}; +#define POLLIN (0x0300) +#endif + /* va_copy should always be a macro, C99 and C++11 - DTL */ #ifndef va_copy #define va_copy(x, y) ((x) = (y)) @@ -3096,42 +3096,6 @@ readdir(DIR *dir) } -#ifndef HAVE_POLL -static int -poll(struct pollfd *pfd, unsigned int n, int milliseconds) -{ - struct timeval tv; - fd_set set; - unsigned int i; - int result; - SOCKET maxfd = 0; - - memset(&tv, 0, sizeof(tv)); - tv.tv_sec = milliseconds / 1000; - tv.tv_usec = (milliseconds % 1000) * 1000; - FD_ZERO(&set); - - for (i = 0; i < n; i++) { - FD_SET((SOCKET)pfd[i].fd, &set); - pfd[i].revents = 0; - - if (pfd[i].fd > maxfd) { - maxfd = pfd[i].fd; - } - } - - if ((result = select((int)maxfd + 1, &set, NULL, NULL, &tv)) > 0) { - for (i = 0; i < n; i++) { - if (FD_ISSET(pfd[i].fd, &set)) { - pfd[i].revents = POLLIN; - } - } - } - - return result; -} -#endif /* HAVE_POLL */ - #if defined(__MINGW32__) /* Enable unused function warning again */ #pragma GCC diagnostic pop @@ -3637,6 +3601,41 @@ set_non_blocking_mode(SOCKET sock) #endif /* _WIN32 */ /* End of initial operating system specific define block. */ +#ifndef HAVE_POLL +static int +poll(struct pollfd *pfd, unsigned int n, int milliseconds) +{ + struct timeval tv; + fd_set set; + unsigned int i; + int result; + SOCKET maxfd = 0; + + memset(&tv, 0, sizeof(tv)); + tv.tv_sec = milliseconds / 1000; + tv.tv_usec = (milliseconds % 1000) * 1000; + FD_ZERO(&set); + + for (i = 0; i < n; i++) { + FD_SET((SOCKET)pfd[i].fd, &set); + pfd[i].revents = 0; + + if (pfd[i].fd > maxfd) { + maxfd = pfd[i].fd; + } + } + + if ((result = select((int)maxfd + 1, &set, NULL, NULL, &tv)) > 0) { + for (i = 0; i < n; i++) { + if (FD_ISSET(pfd[i].fd, &set)) { + pfd[i].revents = POLLIN; + } + } + } + + return result; +} +#endif /* HAVE_POLL */ /* Get a random number (independent of C rand function) */ static uint64_t -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel