diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-08-23 20:12:50 +0000 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-08-23 20:12:50 +0000 |
commit | 50bbf74d4e1a12f5272a732feb26912db2cff63d (patch) | |
tree | 59f069464128d7df255799d2db82cd9e9765a5d4 | |
parent | 2b2b1655a6abf33c76f1320940f06d2aac91b41d (diff) |
Moved sockets abstraction to specialized mhd_socket.h/.c files
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | src/include/mhd_options.h | 9 | ||||
-rw-r--r-- | src/include/microhttpd.h | 21 | ||||
-rw-r--r-- | src/include/platform.h | 70 | ||||
-rw-r--r-- | src/include/platform_interface.h | 80 | ||||
-rw-r--r-- | src/include/w32functions.h | 138 | ||||
-rw-r--r-- | src/microhttpd/Makefile.am | 1 | ||||
-rw-r--r-- | src/microhttpd/connection.c | 6 | ||||
-rw-r--r-- | src/microhttpd/daemon.c | 36 | ||||
-rw-r--r-- | src/microhttpd/internal.h | 8 | ||||
-rw-r--r-- | src/microhttpd/mhd_sockets.c | 545 | ||||
-rw-r--r-- | src/microhttpd/mhd_sockets.h | 406 | ||||
-rw-r--r-- | src/microhttpd/sysfdsetsize.c | 2 | ||||
-rw-r--r-- | src/microhttpd/test_shutdown_select.c | 2 | ||||
-rw-r--r-- | src/platform/w32functions.c | 516 | ||||
-rw-r--r-- | src/testcurl/https/test_https_time_out.c | 1 | ||||
-rw-r--r-- | src/testcurl/https/test_tls_extensions.c | 2 | ||||
-rw-r--r-- | src/testcurl/test_get.c | 1 | ||||
-rw-r--r-- | src/testcurl/test_get_sendfile.c | 3 | ||||
-rw-r--r-- | src/testcurl/test_options.c | 1 | ||||
-rw-r--r-- | src/testcurl/test_quiesce.c | 1 | ||||
-rw-r--r-- | w32/common/libmicrohttpd-files.vcxproj | 2 | ||||
-rw-r--r-- | w32/common/libmicrohttpd-filters.vcxproj | 6 |
23 files changed, 1010 insertions, 852 deletions
diff --git a/configure.ac b/configure.ac index f99da256..1ef58edb 100644 --- a/configure.ac +++ b/configure.ac @@ -545,7 +545,10 @@ fi AC_CHECK_HEADERS([fcntl.h math.h errno.h limits.h stdio.h locale.h sys/stat.h sys/types.h],,AC_MSG_ERROR([Compiling libmicrohttpd requires standard UNIX headers files])) # Check for optional headers -AC_CHECK_HEADERS([sys/types.h sys/time.h sys/msg.h netdb.h netinet/in.h netinet/tcp.h time.h sys/socket.h sys/mman.h arpa/inet.h sys/select.h search.h endian.h machine/endian.h sys/endian.h sys/param.h sys/machine.h sys/byteorder.h machine/param.h sys/isa_defs.h inttypes.h stddef.h]) +AC_CHECK_HEADERS([sys/types.h sys/time.h sys/msg.h netdb.h netinet/in.h netinet/tcp.h time.h sys/socket.h sys/mman.h arpa/inet.h sys/select.h search.h \ + endian.h machine/endian.h sys/endian.h sys/param.h sys/machine.h sys/byteorder.h machine/param.h sys/isa_defs.h \ + inttypes.h stddef.h \ + sockLib.h inetLib.h net/if.h]) AM_CONDITIONAL([HAVE_TSEARCH], [test "x$ac_cv_header_search_h" = "xyes"]) AC_CHECK_MEMBER([struct sockaddr_in.sin_len], diff --git a/src/include/mhd_options.h b/src/include/mhd_options.h index 2e798ebf..5965001e 100644 --- a/src/include/mhd_options.h +++ b/src/include/mhd_options.h @@ -48,16 +48,11 @@ headers. */ #ifdef FD_SETSIZE /* FD_SETSIZE defined in command line or in MHD_config.h */ -/* Use function to retrieve system default FD_SETSIZE value. */ -#define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value() #elif defined(_WIN32) && !defined(__CYGWIN__) /* Platform with WinSock and without overridden FD_SETSIZE */ #define FD_SETSIZE 2048 /* Override default small value */ -/* Use function to retrieve system default FD_SETSIZE value. */ -#define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value() #else /* !FD_SETSIZE && !WinSock*/ /* System default value of FD_SETSIZE is used */ -#define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE #define _MHD_FD_SETSIZE_IS_DEFAULT 1 #endif /* !FD_SETSIZE && !WinSock*/ @@ -83,6 +78,10 @@ #endif /* !WIN32_LEAN_AND_MEAN */ #endif /* _WIN32 */ +#if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS) +#define RESTRICT __restrict__ +#endif /* __VXWORKS__ || __vxworks || OS_VXWORKS */ + #if LINUX+0 && (defined(HAVE_SENDFILE64) || defined(HAVE_LSEEK64)) && ! defined(_LARGEFILE64_SOURCE) /* On Linux, special macro is required to enable definitions of some xxx64 functions */ #define _LARGEFILE64_SOURCE 1 diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h index d5e08d82..17828202 100644 --- a/src/include/microhttpd.h +++ b/src/include/microhttpd.h @@ -60,14 +60,6 @@ * thread-safe (with the exception of #MHD_set_connection_value, * which must only be used in a particular context). * - * NEW: Before including "microhttpd.h" you should add the necessary - * includes to define the `uint64_t`, `size_t`, `fd_set`, `socklen_t` - * and `struct sockaddr` data types (which headers are needed may - * depend on your platform; for possible suggestions consult - * "platform.h" in the MHD distribution). If you have done so, you - * should also have a line with "#define MHD_PLATFORM_H" which will - * prevent this header from trying (and, depending on your platform, - * failing) to include the right headers. * * @defgroup event event-loop control * MHD API to start and stop the HTTP server and manage the event loop. @@ -100,11 +92,14 @@ extern "C" hence works on any platform, we use "standard" includes here to build out-of-the-box for beginning users on common systems. - Once you have a proper build system and go for more exotic - platforms, you should define MHD_PLATFORM_H in some header that - you always include *before* "microhttpd.h". Then the following - "standard" includes won't be used (which might be a good - idea, especially on platforms where they do not exist). */ + If generic headers don't work on your platform, include headers + which define 'va_list', 'size_t', 'ssize_t', 'intptr_t', + 'uint16_t', 'uint32_t', 'uint64_t', 'off_t', 'struct sockaddr', + 'socklen_t', 'fd_set' and "#define MHD_PLATFORM_H" before + including "microhttpd.h". Then the following "standard" + includes won't be used (which might be a good idea, especially + on platforms where they do not exist). + */ #ifndef MHD_PLATFORM_H #include <stdarg.h> #include <stdint.h> diff --git a/src/include/platform.h b/src/include/platform.h index 5ec2c16f..e9c2fa12 100644 --- a/src/include/platform.h +++ b/src/include/platform.h @@ -55,13 +55,17 @@ are available) */ -#ifdef OS_VXWORKS -#include <sockLib.h> -#include <netinet/in.h> +#if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS) #include <stdarg.h> #include <sys/mman.h> -#define RESTRICT __restrict__ -#endif +#ifdef HAVE_SOCKLIB_H +#include <sockLib.h> +#endif /* HAVE_SOCKLIB_H */ +#ifdef HAVE_INETLIB_H +#include <inetLib.h> +#endif /* HAVE_INETLIB_H */ +#endif /* __VXWORKS__ */ + #if HAVE_MEMORY_H #include <memory.h> #endif @@ -84,21 +88,20 @@ #if HAVE_SYS_MMAN_H #include <sys/mman.h> #endif -#if HAVE_NETDB_H -#include <netdb.h> -#endif -#if HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif #if HAVE_TIME_H #include <time.h> #endif #if HAVE_SYS_SOCKET_H #include <sys/socket.h> #endif -#if HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif +#if defined(_WIN32) && !defined(__CYGWIN__) +#ifndef WIN32_LEAN_AND_MEAN +/* Do not include unneeded parts of W32 headers. */ +#define WIN32_LEAN_AND_MEAN 1 +#endif /* !WIN32_LEAN_AND_MEAN */ +#include <winsock2.h> +#include <ws2tcpip.h> +#endif /* _WIN32 && !__CYGWIN__ */ #if defined(__CYGWIN__) && !defined(_SYS_TYPES_FD_SET) /* Do not define __USE_W32_SOCKETS under Cygwin! */ @@ -106,58 +109,23 @@ #endif #if defined(_WIN32) && !defined(__CYGWIN__) -#include <ws2tcpip.h> #define sleep(seconds) ((SleepEx((seconds)*1000, 1)==0)?0:(seconds)) #define usleep(useconds) ((SleepEx((useconds)/1000, 1)==0)?0:-1) #endif -#if !defined(SHUT_WR) && defined(SD_SEND) -#define SHUT_WR SD_SEND -#endif -#if !defined(SHUT_RD) && defined(SD_RECEIVE) -#define SHUT_RD SD_RECEIVE -#endif -#if !defined(SHUT_RDWR) && defined(SD_BOTH) -#define SHUT_RDWR SD_BOTH -#endif - #if defined(_MSC_FULL_VER) && !defined (_SSIZE_T_DEFINED) #define _SSIZE_T_DEFINED typedef intptr_t ssize_t; #endif /* !_SSIZE_T_DEFINED */ -#ifndef MHD_SOCKET_DEFINED -/** - * MHD_socket is type for socket FDs - */ -#if !defined(_WIN32) || defined(__CYGWIN__) -#define MHD_POSIX_SOCKETS 1 -typedef int MHD_socket; -#define MHD_INVALID_SOCKET (-1) -#else /* defined(_WIN32) && !defined(__CYGWIN__) */ -#define MHD_WINSOCK_SOCKETS 1 -#include <winsock2.h> -typedef SOCKET MHD_socket; -#define MHD_INVALID_SOCKET (INVALID_SOCKET) -#endif /* defined(_WIN32) && !defined(__CYGWIN__) */ -#define MHD_SOCKET_DEFINED 1 -#endif /* MHD_SOCKET_DEFINED */ - -/** - * _MHD_SOCKOPT_BOOL_TYPE is type for bool parameters for setsockopt()/getsockopt() - */ -#ifdef MHD_POSIX_SOCKETS -typedef int _MHD_SOCKOPT_BOOL_TYPE; -#else /* MHD_WINSOCK_SOCKETS */ -typedef BOOL _MHD_SOCKOPT_BOOL_TYPE; -#endif /* MHD_WINSOCK_SOCKETS */ - #ifndef _WIN32 typedef time_t _MHD_TIMEVAL_TV_SEC_TYPE; #else /* _WIN32 */ typedef long _MHD_TIMEVAL_TV_SEC_TYPE; #endif /* _WIN32 */ +/* TODO: remove include when pipes implementation is moved to other file */ +#include "../microhttpd/mhd_sockets.h" /* Force don't use pipes on W32 */ #if defined(_WIN32) && !defined(MHD_DONT_USE_PIPES) #define MHD_DONT_USE_PIPES 1 diff --git a/src/include/platform_interface.h b/src/include/platform_interface.h index c2aee64b..fa84bcd5 100644 --- a/src/include/platform_interface.h +++ b/src/include/platform_interface.h @@ -27,6 +27,7 @@ #define MHD_PLATFORM_INTERFACE_H #include "platform.h" +#include "../microhttpd/mhd_sockets.h" #if defined(_WIN32) && !defined(__CYGWIN__) #include "w32functions.h" #endif @@ -46,85 +47,6 @@ #endif /* ! _WIN32*/ #endif /* ! HAVE_SNPRINTF */ - -/** - * _MHD_socket_funcs_size is type used to specify size for send and recv - * functions - */ -#if !defined(MHD_WINSOCK_SOCKETS) -typedef size_t _MHD_socket_funcs_size; -#else -typedef int _MHD_socket_funcs_size; -#endif - -/** - * MHD_socket_close_(fd) close any FDs (non-W32) / close only socket - * FDs (W32). Note that on HP-UNIX, this function may leak the FD if - * errno is set to EINTR. Do not use HP-UNIX. - * - * @param fd descriptor to close - * @return 0 on success (error codes like EINTR and EIO are counted as success, - * only EBADF counts as an error!) - */ -#if !defined(MHD_WINSOCK_SOCKETS) -#define MHD_socket_close_(fd) (((0 != close(fd)) && (EBADF == errno)) ? -1 : 0) -#else -#define MHD_socket_close_(fd) closesocket((fd)) -#endif - -/** - * MHD_socket_errno_ is errno of last function (non-W32) / errno of - * last socket function (W32) - */ -#if !defined(MHD_WINSOCK_SOCKETS) -#define MHD_socket_errno_ errno -#else -#define MHD_socket_errno_ MHD_W32_errno_from_winsock_() -#endif - -/* MHD_socket_last_strerr_ is description string of last errno (non-W32) / - * description string of last socket error (W32) */ -#if !defined(MHD_WINSOCK_SOCKETS) -#define MHD_socket_last_strerr_() strerror(errno) -#else -#define MHD_socket_last_strerr_() MHD_W32_strerror_last_winsock_() -#endif - -/* MHD_strerror_ is strerror (both non-W32/W32) */ -#if !defined(MHD_WINSOCK_SOCKETS) -#define MHD_strerror_(errnum) strerror((errnum)) -#else -#define MHD_strerror_(errnum) MHD_W32_strerror_((errnum)) -#endif - -/* MHD_set_socket_errno_ set errno to errnum (non-W32) / set socket last error to errnum (W32) */ -#if !defined(MHD_WINSOCK_SOCKETS) -#define MHD_set_socket_errno_(errnum) errno=(errnum) -#else -#define MHD_set_socket_errno_(errnum) MHD_W32_set_last_winsock_error_((errnum)) -#endif - -/* MHD_SYS_select_ is wrapper macro for system select() function */ -#if !defined(MHD_WINSOCK_SOCKETS) -#define MHD_SYS_select_(n,r,w,e,t) select((n),(r),(w),(e),(t)) -#else -#define MHD_SYS_select_(n,r,w,e,t) \ - ( (!(r) || ((fd_set*)(r))->fd_count == 0) && \ - (!(w) || ((fd_set*)(w))->fd_count == 0) && \ - (!(e) || ((fd_set*)(e))->fd_count == 0) ) ? \ - ( (t) ? (Sleep((t)->tv_sec * 1000 + (t)->tv_usec / 1000), 0) : 0 ) : \ - (select((int)0,(r),(w),(e),(t))) -#endif - -#if defined(HAVE_POLL) -/* MHD_sys_poll_ is wrapper macro for system poll() function */ -#if !defined(MHD_WINSOCK_SOCKETS) -#define MHD_sys_poll_ poll -#else /* MHD_WINSOCK_SOCKETS */ -#define MHD_sys_poll_ WSAPoll -#endif /* MHD_WINSOCK_SOCKETS */ -#endif /* HAVE_POLL */ - /* MHD_pipe_ create pipe (!MHD_DONT_USE_PIPES) / * create two connected sockets (MHD_DONT_USE_PIPES) */ #ifndef MHD_DONT_USE_PIPES diff --git a/src/include/w32functions.h b/src/include/w32functions.h index 508778c9..f8445f30 100644 --- a/src/include/w32functions.h +++ b/src/include/w32functions.h @@ -39,144 +39,6 @@ extern "C" { #endif -#define MHDW32ERRBASE 3300 - -#ifndef EWOULDBLOCK -#define EWOULDBLOCK (MHDW32ERRBASE+1) -#endif -#ifndef EINPROGRESS -#define EINPROGRESS (MHDW32ERRBASE+2) -#endif -#ifndef EALREADY -#define EALREADY (MHDW32ERRBASE+3) -#endif -#ifndef ENOTSOCK -#define ENOTSOCK (MHDW32ERRBASE+4) -#endif -#ifndef EDESTADDRREQ -#define EDESTADDRREQ (MHDW32ERRBASE+5) -#endif -#ifndef EMSGSIZE -#define EMSGSIZE (MHDW32ERRBASE+6) -#endif -#ifndef EPROTOTYPE -#define EPROTOTYPE (MHDW32ERRBASE+7) -#endif -#ifndef ENOPROTOOPT -#define ENOPROTOOPT (MHDW32ERRBASE+8) -#endif -#ifndef EPROTONOSUPPORT -#define EPROTONOSUPPORT (MHDW32ERRBASE+9) -#endif -#ifndef EOPNOTSUPP -#define EOPNOTSUPP (MHDW32ERRBASE+10) -#endif -#ifndef EAFNOSUPPORT -#define EAFNOSUPPORT (MHDW32ERRBASE+11) -#endif -#ifndef EADDRINUSE -#define EADDRINUSE (MHDW32ERRBASE+12) -#endif -#ifndef EADDRNOTAVAIL -#define EADDRNOTAVAIL (MHDW32ERRBASE+13) -#endif -#ifndef ENETDOWN -#define ENETDOWN (MHDW32ERRBASE+14) -#endif -#ifndef ENETUNREACH -#define ENETUNREACH (MHDW32ERRBASE+15) -#endif -#ifndef ENETRESET -#define ENETRESET (MHDW32ERRBASE+16) -#endif -#ifndef ECONNABORTED -#define ECONNABORTED (MHDW32ERRBASE+17) -#endif -#ifndef ECONNRESET -#define ECONNRESET (MHDW32ERRBASE+18) -#endif -#ifndef ENOBUFS -#define ENOBUFS (MHDW32ERRBASE+19) -#endif -#ifndef EISCONN -#define EISCONN (MHDW32ERRBASE+20) -#endif -#ifndef ENOTCONN -#define ENOTCONN (MHDW32ERRBASE+21) -#endif -#ifndef ETOOMANYREFS -#define ETOOMANYREFS (MHDW32ERRBASE+22) -#endif -#ifndef ECONNREFUSED -#define ECONNREFUSED (MHDW32ERRBASE+23) -#endif -#ifndef ELOOP -#define ELOOP (MHDW32ERRBASE+24) -#endif -#ifndef EHOSTDOWN -#define EHOSTDOWN (MHDW32ERRBASE+25) -#endif -#ifndef EHOSTUNREACH -#define EHOSTUNREACH (MHDW32ERRBASE+26) -#endif -#ifndef EPROCLIM -#define EPROCLIM (MHDW32ERRBASE+27) -#endif -#ifndef EUSERS -#define EUSERS (MHDW32ERRBASE+28) -#endif -#ifndef EDQUOT -#define EDQUOT (MHDW32ERRBASE+29) -#endif -#ifndef ESTALE -#define ESTALE (MHDW32ERRBASE+30) -#endif -#ifndef EREMOTE -#define EREMOTE (MHDW32ERRBASE+31) -#endif -#ifndef ESOCKTNOSUPPORT -#define ESOCKTNOSUPPORT (MHDW32ERRBASE+32) -#endif -#ifndef EPFNOSUPPORT -#define EPFNOSUPPORT (MHDW32ERRBASE+33) -#endif -#ifndef ESHUTDOWN -#define ESHUTDOWN (MHDW32ERRBASE+34) -#endif -#ifndef ENODATA -#define ENODATA (MHDW32ERRBASE+35) -#endif -#ifndef ETIMEDOUT -#define ETIMEDOUT (MHDW32ERRBASE+36) -#endif - -/** - * Return errno equivalent of last winsock error - * @return errno equivalent of last winsock error - */ -int MHD_W32_errno_from_winsock_(void); - -/** - * Return pointer to string description of errnum error - * Works fine with both standard errno errnums - * and errnums from MHD_W32_errno_from_winsock_ - * @param errnum the errno or value from MHD_W32_errno_from_winsock_() - * @return pointer to string description of error - */ -const char* MHD_W32_strerror_(int errnum); - -/** - * Return pointer to string description of last winsock error - * @return pointer to string description of last winsock error - */ -const char* MHD_W32_strerror_last_winsock_(void); - -/** - * Set last winsock error to equivalent of given errno value - * @param errnum the errno value to set - */ -void MHD_W32_set_last_winsock_error_(int errnum); - /** * Create pair of mutually connected TCP/IP sockets on loopback address * @param sockets_pair array to receive resulted sockets diff --git a/src/microhttpd/Makefile.am b/src/microhttpd/Makefile.am index 90324328..371829a5 100644 --- a/src/microhttpd/Makefile.am +++ b/src/microhttpd/Makefile.am @@ -69,6 +69,7 @@ libmicrohttpd_la_SOURCES = \ mhd_str.c mhd_str.h \ mhd_threads.c mhd_threads.h \ mhd_locks.h \ + mhd_sockets.c mhd_sockets.h \ response.c response.h libmicrohttpd_la_CPPFLAGS = \ $(AM_CPPFLAGS) $(MHD_LIB_CPPFLAGS) \ diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c index 6223b994..037a33ff 100644 --- a/src/microhttpd/connection.c +++ b/src/microhttpd/connection.c @@ -32,11 +32,7 @@ #include "mhd_mono_clock.h" #include "mhd_str.h" #include "mhd_locks.h" - -#if HAVE_NETINET_TCP_H -/* for TCP_CORK */ -#include <netinet/tcp.h> -#endif +#include "mhd_sockets.h" /** diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c index a2f7ec7f..3d0b5878 100644 --- a/src/microhttpd/daemon.c +++ b/src/microhttpd/daemon.c @@ -34,6 +34,7 @@ #include "autoinit_funcs.h" #include "mhd_mono_clock.h" #include "mhd_locks.h" +#include "mhd_sockets.h" #if HAVE_SEARCH_H #include <search.h> @@ -46,18 +47,10 @@ #include <gcrypt.h> #endif -#if defined(HAVE_POLL_H) && defined(HAVE_POLL) -#include <poll.h> -#endif - #ifdef LINUX #include <sys/sendfile.h> #endif -#ifndef _MHD_FD_SETSIZE_IS_DEFAULT -#include "sysfdsetsize.h" -#endif /* !_MHD_FD_SETSIZE_IS_DEFAULT */ - #ifdef _WIN32 #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 @@ -79,13 +72,6 @@ */ #define MHD_POOL_SIZE_DEFAULT (32 * 1024) -#ifdef TCP_FASTOPEN -/** - * Default TCP fastopen queue size. - */ -#define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10 -#endif - /** * Print extra messages with reasons for closing * sockets? (only adds non-error messages). @@ -104,26 +90,6 @@ #endif #endif -#ifdef SOCK_CLOEXEC -#define MAYBE_SOCK_CLOEXEC SOCK_CLOEXEC -#else /* ! SOCK_CLOEXEC */ -#define MAYBE_SOCK_CLOEXEC 0 -#endif /* ! SOCK_CLOEXEC */ - -#ifdef HAVE_SOCK_NONBLOCK -#define MAYBE_SOCK_NONBLOCK SOCK_NONBLOCK -#else /* ! HAVE_SOCK_NONBLOCK */ -#define MAYBE_SOCK_NONBLOCK 0 -#endif /* ! HAVE_SOCK_NONBLOCK */ - -#if HAVE_ACCEPT4+0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || defined(SOCK_CLOEXEC)) -#define USE_ACCEPT4 1 -#endif - -#if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC) -#define USE_EPOLL_CREATE1 1 -#endif /* HAVE_EPOLL_CREATE1 && EPOLL_CLOEXEC */ - /** * Default implementation of the panic function, diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h index 510d56a5..75aa1411 100644 --- a/src/microhttpd/internal.h +++ b/src/microhttpd/internal.h @@ -36,15 +36,9 @@ #include <gnutls/abstract.h> #endif #endif -#if EPOLL_SUPPORT -#include <sys/epoll.h> -#endif -#if HAVE_NETINET_TCP_H -/* for TCP_FASTOPEN */ -#include <netinet/tcp.h> -#endif #include "mhd_threads.h" #include "mhd_locks.h" +#include "mhd_sockets.h" /** diff --git a/src/microhttpd/mhd_sockets.c b/src/microhttpd/mhd_sockets.c new file mode 100644 index 00000000..4214108e --- /dev/null +++ b/src/microhttpd/mhd_sockets.c @@ -0,0 +1,545 @@ +/* + This file is part of libmicrohttpd + Copyright (C) 2014-2016 Karlson2k (Evgeny Grin) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +/** + * @file microhttpd/mhd_sockets.c + * @brief Implementation for sockets functions + * @author Karlson2k (Evgeny Grin) + */ + +#include "mhd_sockets.h" + +#ifdef MHD_WINSOCK_SOCKETS + +/** + * Return errno equivalent of last winsock error + * @return errno equivalent of last winsock error + */ +int MHD_W32_errno_from_winsock_(void) +{ + switch(WSAGetLastError()) + { + case 0: return 0; + case WSA_INVALID_HANDLE: return EBADF; + case WSA_NOT_ENOUGH_MEMORY: return ENOMEM; + case WSA_INVALID_PARAMETER: return EINVAL; + case WSAEINTR: return EINTR; + case WSAEWOULDBLOCK: return EWOULDBLOCK; + case WSAEINPROGRESS: return EINPROGRESS; + case WSAEALREADY: return EALREADY; + case WSAENOTSOCK: return ENOTSOCK; + case WSAEDESTADDRREQ: return EDESTADDRREQ; + case WSAEMSGSIZE: return EMSGSIZE; + case WSAEPROTOTYPE: return EPROTOTYPE; + case WSAENOPROTOOPT: return ENOPROTOOPT; + case WSAEPROTONOSUPPORT: return EPROTONOSUPPORT; + case WSAESOCKTNOSUPPORT: return ESOCKTNOSUPPORT; + case WSAEOPNOTSUPP: return EOPNOTSUPP; + case WSAEPFNOSUPPORT: return EPFNOSUPPORT; + case WSAEAFNOSUPPORT: return EAFNOSUPPORT; + case WSAEADDRINUSE: return EADDRINUSE; + case WSAEADDRNOTAVAIL: return EADDRNOTAVAIL; + case WSAENETDOWN: return ENETDOWN; + case WSAENETUNREACH: return ENETUNREACH; + case WSAENETRESET: return ENETRESET; + case WSAECONNABORTED: return ECONNABORTED; + case WSAECONNRESET: return ECONNRESET; + case WSAENOBUFS: return ENOBUFS; + case WSAEISCONN: return EISCONN; + case WSAENOTCONN: return ENOTCONN; + case WSAESHUTDOWN: return ESHUTDOWN; + case WSAETOOMANYREFS: return ETOOMANYREFS; + case WSAETIMEDOUT: return ETIMEDOUT; + case WSAECONNREFUSED: return ECONNREFUSED; + case WSAELOOP: return ELOOP; + case WSAENAMETOOLONG: return ENAMETOOLONG; + case WSAEHOSTDOWN: return EHOSTDOWN; + case WSAEHOSTUNREACH: return EHOSTUNREACH; + case WSAENOTEMPTY: return ENOTEMPTY; + case WSAEPROCLIM: return EPROCLIM; + case WSAEUSERS: return EUSERS; + case WSAEDQUOT: return EDQUOT; + case WSAESTALE: return ESTALE; + case WSAEREMOTE: return EREMOTE; + case WSAEINVAL: return EINVAL; + case WSAEFAULT: return EFAULT; + case WSANO_DATA: return ENODATA; + /* Rough equivalents */ + case WSAEDISCON: return ECONNRESET; + case WSAEINVALIDPROCTABLE: return EFAULT; + case WSASYSNOTREADY: + case WSANOTINITIALISED: + case WSASYSCALLFAILURE: return ENOBUFS; + case WSAVERNOTSUPPORTED: return EOPNOTSUPP; + case WSAEREFUSED: return EIO; + } + return EINVAL; +} + +/** + * Return pointer to string description of errnum error + * Works fine with both standard errno errnums + * and errnums from MHD_W32_errno_from_winsock_ + * @param errnum the errno or value from MHD_W32_errno_from_winsock_() + * @return pointer to string description of error + */ +const char* MHD_W32_strerror_(int errnum) +{ + switch(errnum) + { + case 0: + return "No error"; + case EWOULDBLOCK: + return "Operation would block"; + case EINPROGRESS: + return "Connection already in progress"; + case EALREADY: + return "Socket already connected"; + case ENOTSOCK: + return "Socket operation on non-socket"; + case EDESTADDRREQ: + return "Destination address required"; + case EMSGSIZE: + return "Message too long"; + case EPROTOTYPE: + return "Protocol wrong type for socket"; + case ENOPROTOOPT: + return "Protocol not available"; + case EPROTONOSUPPORT: + return "Unknown protocol"; + case ESOCKTNOSUPPORT: + return "Socket type not supported"; + case EOPNOTSUPP: + return "Operation not supported on socket"; + case EPFNOSUPPORT: + return "Protocol family not supported"; + case EAFNOSUPPORT: + return "Address family not supported by protocol family"; + case EADDRINUSE: + return "Address already in use"; + case EADDRNOTAVAIL: + return "Cannot assign requested address"; + case ENETDOWN: + return "Network is down"; + case ENETUNREACH: + return "Network is unreachable"; + case ENETRESET: + return "Network dropped connection on reset"; + case ECONNABORTED: + return "Software caused connection abort"; + case ECONNRESET: + return "Connection reset by peer"; + case ENOBUFS: + return "No system resources available"; + case EISCONN: + return "Socket is already connected"; + case ENOTCONN: + return "Socket is not connected"; + case ESHUTDOWN: + return "Can't send after socket shutdown"; + case ETOOMANYREFS: + return "Too many references: cannot splice"; + case ETIMEDOUT: + return "Connection timed out"; + case ECONNREFUSED: + return "Connection refused"; + case ELOOP: + return "Cannot translate name"; + case EHOSTDOWN: + return "Host is down"; + case EHOSTUNREACH: + return "Host is unreachable"; + case EPROCLIM: + return "Too many processes"; + case EUSERS: + return "Too many users"; + case EDQUOT: + return "Disk quota exceeded"; + case ESTALE: + return "Stale file handle reference"; + case EREMOTE: + return "Resource is remote"; + case ENODATA: + return "No data available"; + } + return strerror(errnum); +} + +/** + * Return pointer to string description of last winsock error + * @return pointer to string description of last winsock error + */ +const char* MHD_W32_strerror_last_winsock_(void) +{ + switch (WSAGetLastError()) + { + case 0: + return "No error"; + case WSA_INVALID_HANDLE: + return "Specified event object handle is invalid"; + case WSA_NOT_ENOUGH_MEMORY: + return "Insufficient memory available"; + case WSA_INVALID_PARAMETER: + return "One or more parameters are invalid"; + case WSA_OPERATION_ABORTED: + return "Overlapped operation aborted"; + case WSA_IO_INCOMPLETE: + return "Overlapped I/O event object not in signaled state"; + case WSA_IO_PENDING: + return "Overlapped operations will complete later"; + case WSAEINTR: + return "Interrupted function call"; + case WSAEBADF: + return "File handle is not valid"; + case WSAEACCES: + return "Permission denied"; + case WSAEFAULT: + return "Bad address"; + case WSAEINVAL: + return "Invalid argument"; + case WSAEMFILE: + return "Too many open files"; + case WSAEWOULDBLOCK: + return "Resource temporarily unavailable"; + case WSAEINPROGRESS: + return "Operation now in progress"; + case WSAEALREADY: + return "Operation already in progress"; + case WSAENOTSOCK: + return "Socket operation on nonsocket"; + case WSAEDESTADDRREQ: + return "Destination address required"; + case WSAEMSGSIZE: + return "Message too long"; + case WSAEPROTOTYPE: + return "Protocol wrong type for socket"; + case WSAENOPROTOOPT: + return "Bad protocol option"; + case WSAEPROTONOSUPPORT: + return "Protocol not supported"; + case WSAESOCKTNOSUPPORT: + return "Socket type not supported"; + case WSAEOPNOTSUPP: + return "Operation not supported"; + case WSAEPFNOSUPPORT: + return "Protocol family not supported"; + case WSAEAFNOSUPPORT: + return "Address family not supported by protocol family"; + case WSAEADDRINUSE: + return "Address already in use"; + case WSAEADDRNOTAVAIL: + return "Cannot assign requested address"; + case WSAENETDOWN: + return "Network is down"; + case WSAENETUNREACH: + return "Network is unreachable"; + case WSAENETRESET: + return "Network dropped connection on reset"; + case WSAECONNABORTED: + return "Software caused connection abort"; + case WSAECONNRESET: + return "Connection reset by peer"; + case WSAENOBUFS: + return "No buffer space available"; + case WSAEISCONN: + return "Socket is already connected"; + case WSAENOTCONN: + return "Socket is not connected"; + case WSAESHUTDOWN: + return "Cannot send after socket shutdown"; + case WSAETOOMANYREFS: + return "Too many references"; + case WSAETIMEDOUT: + return "Connection timed out"; + case WSAECONNREFUSED: + return "Connection refused"; + case WSAELOOP: + return "Cannot translate name"; + case WSAENAMETOOLONG: + return "Name too long"; + case WSAEHOSTDOWN: + return "Host is down"; + case WSAEHOSTUNREACH: + return "No route to host"; + case WSAENOTEMPTY: + return "Directory not empty"; + case WSAEPROCLIM: + return "Too many processes"; + case WSAEUSERS: + return "User quota exceeded"; + case WSAEDQUOT: + return "Disk quota exceeded"; + case WSAESTALE: + return "Stale file handle reference"; + case WSAEREMOTE: + return "Item is remote"; + case WSASYSNOTREADY: + return "Network subsystem is unavailable"; + case WSAVERNOTSUPPORTED: + return "Winsock.dll version out of range"; + case WSANOTINITIALISED: + return "Successful WSAStartup not yet performed"; + case WSAEDISCON: + return "Graceful shutdown in progress"; + case WSAENOMORE: + return "No more results"; + case WSAECANCELLED: + return "Call has been canceled"; + case WSAEINVALIDPROCTABLE: + return "Procedure call table is invalid"; + case WSAEINVALIDPROVIDER: + return "Service provider is invalid"; + case WSAEPROVIDERFAILEDINIT: + return "Service provider failed to initialize"; + case WSASYSCALLFAILURE: + return "System call failure"; + case WSASERVICE_NOT_FOUND: + return "Service not found"; + case WSATYPE_NOT_FOUND: + return "Class type not found"; + case WSA_E_NO_MORE: + return "No more results"; + case WSA_E_CANCELLED: + return "Call was canceled"; + case WSAEREFUSED: + return "Database query was refused"; + case WSAHOST_NOT_FOUND: + return "Host not found"; + case WSATRY_AGAIN: + return "Nonauthoritative host not found"; + case WSANO_RECOVERY: + return "This is a nonrecoverable error"; + case WSANO_DATA: + return "Valid name, no data record of requested type"; + case WSA_QOS_RECEIVERS: + return "QoS receivers"; + case WSA_QOS_SENDERS: + return "QoS senders"; + case WSA_QOS_NO_SENDERS: + return "No QoS senders"; + case WSA_QOS_NO_RECEIVERS: + return "QoS no receivers"; + case WSA_QOS_REQUEST_CONFIRMED: + return "QoS request confirmed"; + case WSA_QOS_ADMISSION_FAILURE: + return "QoS admission error"; + case WSA_QOS_POLICY_FAILURE: + return "QoS policy failure"; + case WSA_QOS_BAD_STYLE: + return "QoS bad style"; + case WSA_QOS_BAD_OBJECT: + return "QoS bad object"; + case WSA_QOS_TRAFFIC_CTRL_ERROR: + return "QoS traffic control error"; + case WSA_QOS_GENERIC_ERROR: + return "QoS generic error"; + case WSA_QOS_ESERVICETYPE: + return "QoS service type error"; + case WSA_QOS_EFLOWSPEC: + return "QoS flowspec error"; + case WSA_QOS_EPROVSPECBUF: + return "Invalid QoS provider buffer"; + case WSA_QOS_EFILTERSTYLE: + return "Invalid QoS filter style"; + case WSA_QOS_EFILTERTYPE: + return "Invalid QoS filter type"; + case WSA_QOS_EFILTERCOUNT: + return "Incorrect QoS filter count"; + case WSA_QOS_EOBJLENGTH: + return "Invalid QoS object length"; + case WSA_QOS_EFLOWCOUNT: + return "Incorrect QoS flow count"; + case WSA_QOS_EUNKOWNPSOBJ: + return "Unrecognized QoS object"; + case WSA_QOS_EPOLICYOBJ: + return "Invalid QoS policy object"; + case WSA_QOS_EFLOWDESC: + return "Invalid QoS flow descriptor"; + case WSA_QOS_EPSFLOWSPEC: + return "Invalid QoS provider-specific flowspec"; + case WSA_QOS_EPSFILTERSPEC: + return "Invalid QoS provider-specific filterspec"; + case WSA_QOS_ESDMODEOBJ: + return "Invalid QoS shape discard mode object"; + case WSA_QOS_ESHAPERATEOBJ: + return "Invalid QoS shaping rate object"; + case WSA_QOS_RESERVED_PETYPE: + return "Reserved policy QoS element type"; + } + return "Unknown winsock error"; +} + +/** + * Set last winsock error to equivalent of given errno value + * @param errnum the errno value to set + */ +void MHD_W32_set_last_winsock_error_(int errnum) +{ + switch (errnum) + { + case 0: + WSASetLastError(0); + break; + case EBADF: + WSASetLastError(WSA_INVALID_HANDLE); + break; + case ENOMEM: + WSASetLastError(WSA_NOT_ENOUGH_MEMORY); + break; + case EINVAL: + WSASetLastError(WSA_INVALID_PARAMETER); + break; + case EINTR: + WSASetLastError(WSAEINTR); + break; + case EWOULDBLOCK: + WSASetLastError(WSAEWOULDBLOCK); + break; + case EINPROGRESS: + WSASetLastError(WSAEINPROGRESS); + break; + case EALREADY: + WSASetLastError(WSAEALREADY); + break; + case ENOTSOCK: + WSASetLastError(WSAENOTSOCK); + break; + case EDESTADDRREQ: + WSASetLastError(WSAEDESTADDRREQ); + break; + case EMSGSIZE: + WSASetLastError(WSAEMSGSIZE); + break; + case EPROTOTYPE: + WSASetLastError(WSAEPROTOTYPE); + break; + case ENOPROTOOPT: + WSASetLastError(WSAENOPROTOOPT); + break; + case EPROTONOSUPPORT: + WSASetLastError(WSAEPROTONOSUPPORT); + break; + case ESOCKTNOSUPPORT: + WSASetLastError(WSAESOCKTNOSUPPORT); + break; + case EOPNOTSUPP: + WSASetLastError(WSAEOPNOTSUPP); + break; + case EPFNOSUPPORT: + WSASetLastError(WSAEPFNOSUPPORT); + break; + case EAFNOSUPPORT: + WSASetLastError(WSAEAFNOSUPPORT); + break; + case EADDRINUSE: + WSASetLastError(WSAEADDRINUSE); + break; + case EADDRNOTAVAIL: + WSASetLastError(WSAEADDRNOTAVAIL); + break; + case ENETDOWN: + WSASetLastError(WSAENETDOWN); + break; + case ENETUNREACH: + WSASetLastError(WSAENETUNREACH); + break; + case ENETRESET: + WSASetLastError(WSAENETRESET); + break; + case ECONNABORTED: + WSASetLastError(WSAECONNABORTED); + break; + case ECONNRESET: + WSASetLastError(WSAECONNRESET); + break; + case ENOBUFS: + WSASetLastError(WSAENOBUFS); + break; + case EISCONN: + WSASetLastError(WSAEISCONN); + break; + case ENOTCONN: + WSASetLastError(WSAENOTCONN); + break; + case ESHUTDOWN: + WSASetLastError(WSAESHUTDOWN); + break; + case ETOOMANYREFS: + WSASetLastError(WSAETOOMANYREFS); + break; + case ETIMEDOUT: + WSASetLastError(WSAETIMEDOUT); + break; + case ECONNREFUSED: + WSASetLastError(WSAECONNREFUSED); + break; + case ELOOP: + WSASetLastError(WSAELOOP); + break; + case ENAMETOOLONG: + WSASetLastError(WSAENAMETOOLONG); + break; + case EHOSTDOWN: + WSASetLastError(WSAEHOSTDOWN); + break; + case EHOSTUNREACH: + WSASetLastError(WSAEHOSTUNREACH); + break; + case ENOTEMPTY: + WSASetLastError(WSAENOTEMPTY); + break; + case EPROCLIM: + WSASetLastError(WSAEPROCLIM); + break; + case EUSERS: + WSASetLastError(WSAEUSERS); + break; + case EDQUOT: + WSASetLastError(WSAEDQUOT); + break; + case ESTALE: + WSASetLastError(WSAESTALE); + break; + case EREMOTE: + WSASetLastError(WSAEREMOTE); + break; + case EFAULT: + WSASetLastError(WSAEFAULT); + break; + case ENODATA: + WSASetLastError(WSANO_DATA); + break; +#if EAGAIN != EWOULDBLOCK + case EAGAIN: + WSASetLastError(WSAEWOULDBLOCK); + break; +#endif + /* Rough equivalent */ + case EIO: + WSASetLastError(WSAEREFUSED); + break; + + default: /* Unmapped errors */ + WSASetLastError(WSAENOBUFS); + break; + } +} + +#endif /* MHD_WINSOCK_SOCKETS */ diff --git a/src/microhttpd/mhd_sockets.h b/src/microhttpd/mhd_sockets.h new file mode 100644 index 00000000..3a3e4b85 --- /dev/null +++ b/src/microhttpd/mhd_sockets.h @@ -0,0 +1,406 @@ +/* + This file is part of libmicrohttpd + Copyright (C) 2014-2016 Karlson2k (Evgeny Grin) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +/** + * @file microhttpd/mhd_sockets.c + * @brief Header for platform-independent sockets abstraction + * @author Karlson2k (Evgeny Grin) + * + * Provides basic abstraction for sockets. + * Any functions can be implemented as macro on some platforms + * unless explicitly marked otherwise. + * Any function argument can be skipped in macro, so avoid + * variable modification in function parameters. + */ + +#ifndef MHD_SOCKETS_H +#define MHD_SOCKETS_H 1 +#include "mhd_options.h" + +#include <errno.h> + +#if !defined(MHD_POSIX_SOCKETS) && !defined(MHD_WINSOCK_SOCKETS) +# if !defined(_WIN32) || defined(__CYGWIN__) +# define MHD_POSIX_SOCKETS 1 +# else /* defined(_WIN32) && !defined(__CYGWIN__) */ +# define MHD_WINSOCK_SOCKETS 1 +# endif /* defined(_WIN32) && !defined(__CYGWIN__) */ +#endif /* !MHD_POSIX_SOCKETS && !MHD_WINSOCK_SOCKETS */ + +/* + * MHD require headers that define socket type, socket basic functions + * (socket(), accept(), listen(), bind(), send(), recv(), select()), socket + * parameters like SOCK_CLOEXEC, SOCK_NONBLOCK, additional socket functions + * (poll(), epoll(), accept4()), struct timeval and other types, required + * for socket function. + */ +#if defined(MHD_POSIX_SOCKETS) +# if HAVE_SYS_SOCKET_H +# include <sys/socket.h> +# endif +# if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS) +# ifdef HAVE_SOCKLIB_H +# include <sockLib.h> +# endif /* HAVE_SOCKLIB_H */ +# ifdef HAVE_INETLIB_H +# include <inetLib.h> +# endif /* HAVE_INETLIB_H */ +# include <strings.h> /* required for FD_SET (bzero() function) */ +# endif /* __VXWORKS__ || __vxworks || OS_VXWORKS */ +# ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +# endif /* HAVE_NETINET_IN_H */ +# if HAVE_ARPA_INET_H +# include <arpa/inet.h> +# endif +# ifdef HAVE_NET_IF_H +# include <net/if.h> +# endif +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# endif +# if HAVE_TIME_H +# include <time.h> +# endif +# if HAVE_NETDB_H +# include <netdb.h> +# endif +# if HAVE_SYS_SELECT_H +# include <sys/select.h> +# endif +# if EPOLL_SUPPORT +# include <sys/epoll.h> +# endif +# if HAVE_NETINET_TCP_H + /* for TCP_FASTOPEN and TCP_CORK */ +# include <netinet/tcp.h> +# endif +# ifdef HAVE_STRING_H +# include <string.h> /* for strerror() */ +# endif +# if defined(HAVE_SYS_TYPES_H) +# include <sys/types.h> /* required on old platforms */ +# endif /* (!HAVE_SYS_SOCKET_H || !HAVE_SYS_SOCKET_H) && HAVE_SYS_TYPES_H */ +#elif defined(MHD_WINSOCK_SOCKETS) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif /* !WIN32_LEAN_AND_MEAN */ +# include <winsock2.h> +# include <ws2tcpip.h> +#endif /* MHD_WINSOCK_SOCKETS */ + +#if defined(HAVE_POLL_H) && defined(HAVE_POLL) +# include <poll.h> +#endif + +#ifdef _MHD_FD_SETSIZE_IS_DEFAULT +# define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE +#else /* ! _MHD_FD_SETSIZE_IS_DEFAULT */ +# include "sysfdsetsize.h" +# define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value() +#endif /* ! _MHD_FD_SETSIZE_IS_DEFAULT */ + +#ifndef MHD_SOCKET_DEFINED +/** + * MHD_socket is type for socket FDs + */ +# if defined(MHD_POSIX_SOCKETS) + typedef int MHD_socket; +# define MHD_INVALID_SOCKET (-1) +# elif defined(MHD_WINSOCK_SOCKETS) + typedef SOCKET MHD_socket; +# define MHD_INVALID_SOCKET (INVALID_SOCKET) +# endif /* MHD_WINSOCK_SOCKETS */ + +# define MHD_SOCKET_DEFINED 1 +#endif /* ! MHD_SOCKET_DEFINED */ + +#ifdef SOCK_CLOEXEC +# define MAYBE_SOCK_CLOEXEC SOCK_CLOEXEC +#else /* ! SOCK_CLOEXEC */ +# define MAYBE_SOCK_CLOEXEC 0 +#endif /* ! SOCK_CLOEXEC */ + +#ifdef HAVE_SOCK_NONBLOCK +# define MAYBE_SOCK_NONBLOCK SOCK_NONBLOCK +#else /* ! HAVE_SOCK_NONBLOCK */ +# define MAYBE_SOCK_NONBLOCK 0 +#endif /* ! HAVE_SOCK_NONBLOCK */ + +#if !defined(SHUT_WR) && defined(SD_SEND) +# define SHUT_WR SD_SEND +#endif +#if !defined(SHUT_RD) && defined(SD_RECEIVE) +# define SHUT_RD SD_RECEIVE +#endif +#if !defined(SHUT_RDWR) && defined(SD_BOTH) +# define SHUT_RDWR SD_BOTH +#endif + +#if HAVE_ACCEPT4+0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || defined(SOCK_CLOEXEC)) +# define USE_ACCEPT4 1 +#endif + +#if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC) +# define USE_EPOLL_CREATE1 1 +#endif /* HAVE_EPOLL_CREATE1 && EPOLL_CLOEXEC */ + +#ifdef TCP_FASTOPEN +/** + * Default TCP fastopen queue size. + */ +#define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10 +#endif + + +/** + * _MHD_SOCKOPT_BOOL_TYPE is type for bool parameters for setsockopt()/getsockopt() + */ +#ifdef MHD_POSIX_SOCKETS + typedef int _MHD_SOCKOPT_BOOL_TYPE; +#else /* MHD_WINSOCK_SOCKETS */ + typedef BOOL _MHD_SOCKOPT_BOOL_TYPE; +#endif /* MHD_WINSOCK_SOCKETS */ + +/** + * _MHD_socket_funcs_size is type used to specify size for send and recv + * functions + */ +#if !defined(MHD_WINSOCK_SOCKETS) + typedef size_t _MHD_socket_funcs_size; +#else + typedef int _MHD_socket_funcs_size; +#endif + +/** + * MHD_socket_close_(fd) close any FDs (non-W32) / close only socket + * FDs (W32). Note that on HP-UNIX, this function may leak the FD if + * errno is set to EINTR. Do not use HP-UNIX. + * + * @param fd descriptor to close + * @return 0 on success (error codes like EINTR and EIO are counted as success, + * only EBADF counts as an error!) + */ +#if !defined(MHD_WINSOCK_SOCKETS) +# define MHD_socket_close_(fd) (((0 != close(fd)) && (EBADF == errno)) ? -1 : 0) +#else +# define MHD_socket_close_(fd) closesocket((fd)) +#endif + +/** + * MHD_socket_errno_ is errno of last function (non-W32) / errno of + * last socket function (W32) + */ +#if !defined(MHD_WINSOCK_SOCKETS) +# define MHD_socket_errno_ errno +#else +# define MHD_socket_errno_ MHD_W32_errno_from_winsock_() +#endif + + /* MHD_socket_last_strerr_ is description string of last errno (non-W32) / + * description string of last socket error (W32) */ +#if !defined(MHD_WINSOCK_SOCKETS) +# define MHD_socket_last_strerr_() strerror(errno) +#else +# define MHD_socket_last_strerr_() MHD_W32_strerror_last_winsock_() +#endif + + /* MHD_strerror_ is strerror (both non-W32/W32) */ +#if !defined(MHD_WINSOCK_SOCKETS) +# define MHD_strerror_(errnum) strerror((errnum)) +#else +# define MHD_strerror_(errnum) MHD_W32_strerror_((errnum)) +#endif + + /* MHD_set_socket_errno_ set errno to errnum (non-W32) / set socket last error to errnum (W32) */ +#if !defined(MHD_WINSOCK_SOCKETS) +# define MHD_set_socket_errno_(errnum) errno=(errnum) +#else +# define MHD_set_socket_errno_(errnum) MHD_W32_set_last_winsock_error_((errnum)) +#endif + + /* MHD_SYS_select_ is wrapper macro for system select() function */ +#if !defined(MHD_WINSOCK_SOCKETS) +# define MHD_SYS_select_(n,r,w,e,t) select((n),(r),(w),(e),(t)) +#else +# define MHD_SYS_select_(n,r,w,e,t) \ +( (!(r) || ((fd_set*)(r))->fd_count == 0) && \ + (!(w) || ((fd_set*)(w))->fd_count == 0) && \ + (!(e) || ((fd_set*)(e))->fd_count == 0) ) ? \ +( (t) ? (Sleep((t)->tv_sec * 1000 + (t)->tv_usec / 1000), 0) : 0 ) : \ + (select((int)0,(r),(w),(e),(t))) +#endif + +#if defined(HAVE_POLL) +/* MHD_sys_poll_ is wrapper macro for system poll() function */ +# if !defined(MHD_WINSOCK_SOCKETS) +# define MHD_sys_poll_ poll +# else /* MHD_WINSOCK_SOCKETS */ +# define MHD_sys_poll_ WSAPoll +# endif /* MHD_WINSOCK_SOCKETS */ +#endif /* HAVE_POLL */ + + +#ifdef MHD_WINSOCK_SOCKETS + +/* POSIX-W32 compatibility functions and macros */ + +# define MHDW32ERRBASE 3300 + +# ifndef EWOULDBLOCK +# define EWOULDBLOCK (MHDW32ERRBASE+1) +# endif +# ifndef EINPROGRESS +# define EINPROGRESS (MHDW32ERRBASE+2) +# endif +# ifndef EALREADY +# define EALREADY (MHDW32ERRBASE+3) +# endif +# ifndef ENOTSOCK +# define ENOTSOCK (MHDW32ERRBASE+4) +# endif +# ifndef EDESTADDRREQ +# define EDESTADDRREQ (MHDW32ERRBASE+5) +# endif +# ifndef EMSGSIZE +# define EMSGSIZE (MHDW32ERRBASE+6) +# endif +# ifndef EPROTOTYPE +# define EPROTOTYPE (MHDW32ERRBASE+7) +# endif +# ifndef ENOPROTOOPT +# define ENOPROTOOPT (MHDW32ERRBASE+8) +# endif +# ifndef EPROTONOSUPPORT +# define EPROTONOSUPPORT (MHDW32ERRBASE+9) +# endif +# ifndef EOPNOTSUPP +# define EOPNOTSUPP (MHDW32ERRBASE+10) +# endif +# ifndef EAFNOSUPPORT +# define EAFNOSUPPORT (MHDW32ERRBASE+11) +# endif +# ifndef EADDRINUSE +# define EADDRINUSE (MHDW32ERRBASE+12) +# endif +# ifndef EADDRNOTAVAIL +# define EADDRNOTAVAIL (MHDW32ERRBASE+13) +# endif +# ifndef ENETDOWN +# define ENETDOWN (MHDW32ERRBASE+14) +# endif +# ifndef ENETUNREACH +# define ENETUNREACH (MHDW32ERRBASE+15) +# endif +# ifndef ENETRESET +# define ENETRESET (MHDW32ERRBASE+16) +# endif +# ifndef ECONNABORTED +# define ECONNABORTED (MHDW32ERRBASE+17) +# endif +# ifndef ECONNRESET +# define ECONNRESET (MHDW32ERRBASE+18) +# endif +# ifndef ENOBUFS +# define ENOBUFS (MHDW32ERRBASE+19) +# endif +# ifndef EISCONN +# define EISCONN (MHDW32ERRBASE+20) +# endif +# ifndef ENOTCONN +# define ENOTCONN (MHDW32ERRBASE+21) +# endif +# ifndef ETOOMANYREFS +# define ETOOMANYREFS (MHDW32ERRBASE+22) +# endif +# ifndef ECONNREFUSED +# define ECONNREFUSED (MHDW32ERRBASE+23) +# endif +# ifndef ELOOP +# define ELOOP (MHDW32ERRBASE+24) +# endif +# ifndef EHOSTDOWN +# define EHOSTDOWN (MHDW32ERRBASE+25) +# endif +# ifndef EHOSTUNREACH +# define EHOSTUNREACH (MHDW32ERRBASE+26) +# endif +# ifndef EPROCLIM +# define EPROCLIM (MHDW32ERRBASE+27) +# endif +# ifndef EUSERS +# define EUSERS (MHDW32ERRBASE+28) +# endif +# ifndef EDQUOT +# define EDQUOT (MHDW32ERRBASE+29) +# endif +# ifndef ESTALE +# define ESTALE (MHDW32ERRBASE+30) +# endif +# ifndef EREMOTE +# define EREMOTE (MHDW32ERRBASE+31) +# endif +# ifndef ESOCKTNOSUPPORT +# define ESOCKTNOSUPPORT (MHDW32ERRBASE+32) +# endif +# ifndef EPFNOSUPPORT +# define EPFNOSUPPORT (MHDW32ERRBASE+33) +# endif +# ifndef ESHUTDOWN +# define ESHUTDOWN (MHDW32ERRBASE+34) +# endif +# ifndef ENODATA +# define ENODATA (MHDW32ERRBASE+35) +# endif +# ifndef ETIMEDOUT +# define ETIMEDOUT (MHDW32ERRBASE+36) +# endif + +/** + * Return errno equivalent of last winsock error + * @return errno equivalent of last winsock error + */ + int MHD_W32_errno_from_winsock_(void); + +/** + * Return pointer to string description of errnum error + * Works fine with both standard errno errnums + * and errnums from MHD_W32_errno_from_winsock_ + * @param errnum the errno or value from MHD_W32_errno_from_winsock_() + * @return pointer to string description of error + */ + const char* MHD_W32_strerror_(int errnum); + +/** + * Return pointer to string description of last winsock error + * @return pointer to string description of last winsock error + */ + const char* MHD_W32_strerror_last_winsock_(void); + +/** + * Set last winsock error to equivalent of given errno value + * @param errnum the errno value to set + */ + void MHD_W32_set_last_winsock_error_(int errnum); + + +#endif /* MHD_WINSOCK_SOCKETS */ + +#endif /* ! MHD_SOCKETS_H */ diff --git a/src/microhttpd/sysfdsetsize.c b/src/microhttpd/sysfdsetsize.c index d5604088..fe7fba75 100644 --- a/src/microhttpd/sysfdsetsize.c +++ b/src/microhttpd/sysfdsetsize.c @@ -34,7 +34,7 @@ #endif /* FD_SETSIZE */ #include <stdlib.h> -#ifdef OS_VXWORKS +#if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS) #include <sockLib.h> #endif /* OS_VXWORKS */ #if HAVE_SYS_SELECT_H diff --git a/src/microhttpd/test_shutdown_select.c b/src/microhttpd/test_shutdown_select.c index e3aaa20f..a40ac9cc 100644 --- a/src/microhttpd/test_shutdown_select.c +++ b/src/microhttpd/test_shutdown_select.c @@ -30,8 +30,8 @@ */ #include "MHD_config.h" -#include "platform_interface.h" #include "platform.h" +#include "mhd_sockets.h" #include <stdlib.h> #include <stdio.h> diff --git a/src/platform/w32functions.c b/src/platform/w32functions.c index 4b1e2c1c..20d8e344 100644 --- a/src/platform/w32functions.c +++ b/src/platform/w32functions.c @@ -31,521 +31,7 @@ #include <time.h> #include <stdio.h> #include <stdarg.h> - - -/** - * Return errno equivalent of last winsock error - * @return errno equivalent of last winsock error - */ -int MHD_W32_errno_from_winsock_(void) -{ - switch(WSAGetLastError()) - { - case 0: return 0; - case WSA_INVALID_HANDLE: return EBADF; - case WSA_NOT_ENOUGH_MEMORY: return ENOMEM; - case WSA_INVALID_PARAMETER: return EINVAL; - case WSAEINTR: return EINTR; - case WSAEWOULDBLOCK: return EWOULDBLOCK; - case WSAEINPROGRESS: return EINPROGRESS; - case WSAEALREADY: return EALREADY; - case WSAENOTSOCK: return ENOTSOCK; - case WSAEDESTADDRREQ: return EDESTADDRREQ; - case WSAEMSGSIZE: return EMSGSIZE; - case WSAEPROTOTYPE: return EPROTOTYPE; - case WSAENOPROTOOPT: return ENOPROTOOPT; - case WSAEPROTONOSUPPORT: return EPROTONOSUPPORT; - case WSAESOCKTNOSUPPORT: return ESOCKTNOSUPPORT; - case WSAEOPNOTSUPP: return EOPNOTSUPP; - case WSAEPFNOSUPPORT: return EPFNOSUPPORT; - case WSAEAFNOSUPPORT: return EAFNOSUPPORT; - case WSAEADDRINUSE: return EADDRINUSE; - case WSAEADDRNOTAVAIL: return EADDRNOTAVAIL; - case WSAENETDOWN: return ENETDOWN; - case WSAENETUNREACH: return ENETUNREACH; - case WSAENETRESET: return ENETRESET; - case WSAECONNABORTED: return ECONNABORTED; - case WSAECONNRESET: return ECONNRESET; - case WSAENOBUFS: return ENOBUFS; - case WSAEISCONN: return EISCONN; - case WSAENOTCONN: return ENOTCONN; - case WSAESHUTDOWN: return ESHUTDOWN; - case WSAETOOMANYREFS: return ETOOMANYREFS; - case WSAETIMEDOUT: return ETIMEDOUT; - case WSAECONNREFUSED: return ECONNREFUSED; - case WSAELOOP: return ELOOP; - case WSAENAMETOOLONG: return ENAMETOOLONG; - case WSAEHOSTDOWN: return EHOSTDOWN; - case WSAEHOSTUNREACH: return EHOSTUNREACH; - case WSAENOTEMPTY: return ENOTEMPTY; - case WSAEPROCLIM: return EPROCLIM; - case WSAEUSERS: return EUSERS; - case WSAEDQUOT: return EDQUOT; - case WSAESTALE: return ESTALE; - case WSAEREMOTE: return EREMOTE; - case WSAEINVAL: return EINVAL; - case WSAEFAULT: return EFAULT; - case WSANO_DATA: return ENODATA; - /* Rough equivalents */ - case WSAEDISCON: return ECONNRESET; - case WSAEINVALIDPROCTABLE: return EFAULT; - case WSASYSNOTREADY: - case WSANOTINITIALISED: - case WSASYSCALLFAILURE: return ENOBUFS; - case WSAVERNOTSUPPORTED: return EOPNOTSUPP; - case WSAEREFUSED: return EIO; - } - return EINVAL; -} - -/** - * Return pointer to string description of errnum error - * Works fine with both standard errno errnums - * and errnums from MHD_W32_errno_from_winsock_ - * @param errnum the errno or value from MHD_W32_errno_from_winsock_() - * @return pointer to string description of error - */ -const char* MHD_W32_strerror_(int errnum) -{ - switch(errnum) - { - case 0: - return "No error"; - case EWOULDBLOCK: - return "Operation would block"; - case EINPROGRESS: - return "Connection already in progress"; - case EALREADY: - return "Socket already connected"; - case ENOTSOCK: - return "Socket operation on non-socket"; - case EDESTADDRREQ: - return "Destination address required"; - case EMSGSIZE: - return "Message too long"; - case EPROTOTYPE: - return "Protocol wrong type for socket"; - case ENOPROTOOPT: - return "Protocol not available"; - case EPROTONOSUPPORT: - return "Unknown protocol"; - case ESOCKTNOSUPPORT: - return "Socket type not supported"; - case EOPNOTSUPP: - return "Operation not supported on socket"; - case EPFNOSUPPORT: - return "Protocol family not supported"; - case EAFNOSUPPORT: - return "Address family not supported by protocol family"; - case EADDRINUSE: - return "Address already in use"; - case EADDRNOTAVAIL: - return "Cannot assign requested address"; - case ENETDOWN: - return "Network is down"; - case ENETUNREACH: - return "Network is unreachable"; - case ENETRESET: - return "Network dropped connection on reset"; - case ECONNABORTED: - return "Software caused connection abort"; - case ECONNRESET: - return "Connection reset by peer"; - case ENOBUFS: - return "No system resources available"; - case EISCONN: - return "Socket is already connected"; - case ENOTCONN: - return "Socket is not connected"; - case ESHUTDOWN: - return "Can't send after socket shutdown"; - case ETOOMANYREFS: - return "Too many references: cannot splice"; - case ETIMEDOUT: - return "Connection timed out"; - case ECONNREFUSED: - return "Connection refused"; - case ELOOP: - return "Cannot translate name"; - case EHOSTDOWN: - return "Host is down"; - case EHOSTUNREACH: - return "Host is unreachable"; - case EPROCLIM: - return "Too many processes"; - case EUSERS: - return "Too many users"; - case EDQUOT: - return "Disk quota exceeded"; - case ESTALE: - return "Stale file handle reference"; - case EREMOTE: - return "Resource is remote"; - case ENODATA: - return "No data available"; - } - return strerror(errnum); -} - -/** - * Return pointer to string description of last winsock error - * @return pointer to string description of last winsock error - */ -const char* MHD_W32_strerror_last_winsock_(void) -{ - switch (WSAGetLastError()) - { - case 0: - return "No error"; - case WSA_INVALID_HANDLE: - return "Specified event object handle is invalid"; - case WSA_NOT_ENOUGH_MEMORY: - return "Insufficient memory available"; - case WSA_INVALID_PARAMETER: - return "One or more parameters are invalid"; - case WSA_OPERATION_ABORTED: - return "Overlapped operation aborted"; - case WSA_IO_INCOMPLETE: - return "Overlapped I/O event object not in signaled state"; - case WSA_IO_PENDING: - return "Overlapped operations will complete later"; - case WSAEINTR: - return "Interrupted function call"; - case WSAEBADF: - return "File handle is not valid"; - case WSAEACCES: - return "Permission denied"; - case WSAEFAULT: - return "Bad address"; - case WSAEINVAL: - return "Invalid argument"; - case WSAEMFILE: - return "Too many open files"; - case WSAEWOULDBLOCK: - return "Resource temporarily unavailable"; - case WSAEINPROGRESS: - return "Operation now in progress"; - case WSAEALREADY: - return "Operation already in progress"; - case WSAENOTSOCK: - return "Socket operation on nonsocket"; - case WSAEDESTADDRREQ: - return "Destination address required"; - case WSAEMSGSIZE: - return "Message too long"; - case WSAEPROTOTYPE: - return "Protocol wrong type for socket"; - case WSAENOPROTOOPT: - return "Bad protocol option"; - case WSAEPROTONOSUPPORT: - return "Protocol not supported"; - case WSAESOCKTNOSUPPORT: - return "Socket type not supported"; - case WSAEOPNOTSUPP: - return "Operation not supported"; - case WSAEPFNOSUPPORT: - return "Protocol family not supported"; - case WSAEAFNOSUPPORT: - return "Address family not supported by protocol family"; - case WSAEADDRINUSE: - return "Address already in use"; - case WSAEADDRNOTAVAIL: - return "Cannot assign requested address"; - case WSAENETDOWN: - return "Network is down"; - case WSAENETUNREACH: - return "Network is unreachable"; - case WSAENETRESET: - return "Network dropped connection on reset"; - case WSAECONNABORTED: - return "Software caused connection abort"; - case WSAECONNRESET: - return "Connection reset by peer"; - case WSAENOBUFS: - return "No buffer space available"; - case WSAEISCONN: - return "Socket is already connected"; - case WSAENOTCONN: - return "Socket is not connected"; - case WSAESHUTDOWN: - return "Cannot send after socket shutdown"; - case WSAETOOMANYREFS: - return "Too many references"; - case WSAETIMEDOUT: - return "Connection timed out"; - case WSAECONNREFUSED: - return "Connection refused"; - case WSAELOOP: - return "Cannot translate name"; - case WSAENAMETOOLONG: - return "Name too long"; - case WSAEHOSTDOWN: - return "Host is down"; - case WSAEHOSTUNREACH: - return "No route to host"; - case WSAENOTEMPTY: - return "Directory not empty"; - case WSAEPROCLIM: - return "Too many processes"; - case WSAEUSERS: - return "User quota exceeded"; - case WSAEDQUOT: - return "Disk quota exceeded"; - case WSAESTALE: - return "Stale file handle reference"; - case WSAEREMOTE: - return "Item is remote"; - case WSASYSNOTREADY: - return "Network subsystem is unavailable"; - case WSAVERNOTSUPPORTED: - return "Winsock.dll version out of range"; - case WSANOTINITIALISED: - return "Successful WSAStartup not yet performed"; - case WSAEDISCON: - return "Graceful shutdown in progress"; - case WSAENOMORE: - return "No more results"; - case WSAECANCELLED: - return "Call has been canceled"; - case WSAEINVALIDPROCTABLE: - return "Procedure call table is invalid"; - case WSAEINVALIDPROVIDER: - return "Service provider is invalid"; - case WSAEPROVIDERFAILEDINIT: - return "Service provider failed to initialize"; - case WSASYSCALLFAILURE: - return "System call failure"; - case WSASERVICE_NOT_FOUND: - return "Service not found"; - case WSATYPE_NOT_FOUND: - return "Class type not found"; - case WSA_E_NO_MORE: - return "No more results"; - case WSA_E_CANCELLED: - return "Call was canceled"; - case WSAEREFUSED: - return "Database query was refused"; - case WSAHOST_NOT_FOUND: - return "Host not found"; - case WSATRY_AGAIN: - return "Nonauthoritative host not found"; - case WSANO_RECOVERY: - return "This is a nonrecoverable error"; - case WSANO_DATA: - return "Valid name, no data record of requested type"; - case WSA_QOS_RECEIVERS: - return "QoS receivers"; - case WSA_QOS_SENDERS: - return "QoS senders"; - case WSA_QOS_NO_SENDERS: - return "No QoS senders"; - case WSA_QOS_NO_RECEIVERS: - return "QoS no receivers"; - case WSA_QOS_REQUEST_CONFIRMED: - return "QoS request confirmed"; - case WSA_QOS_ADMISSION_FAILURE: - return "QoS admission error"; - case WSA_QOS_POLICY_FAILURE: - return "QoS policy failure"; - case WSA_QOS_BAD_STYLE: - return "QoS bad style"; - case WSA_QOS_BAD_OBJECT: - return "QoS bad object"; - case WSA_QOS_TRAFFIC_CTRL_ERROR: - return "QoS traffic control error"; - case WSA_QOS_GENERIC_ERROR: - return "QoS generic error"; - case WSA_QOS_ESERVICETYPE: - return "QoS service type error"; - case WSA_QOS_EFLOWSPEC: - return "QoS flowspec error"; - case WSA_QOS_EPROVSPECBUF: - return "Invalid QoS provider buffer"; - case WSA_QOS_EFILTERSTYLE: - return "Invalid QoS filter style"; - case WSA_QOS_EFILTERTYPE: - return "Invalid QoS filter type"; - case WSA_QOS_EFILTERCOUNT: - return "Incorrect QoS filter count"; - case WSA_QOS_EOBJLENGTH: - return "Invalid QoS object length"; - case WSA_QOS_EFLOWCOUNT: - return "Incorrect QoS flow count"; - case WSA_QOS_EUNKOWNPSOBJ: - return "Unrecognized QoS object"; - case WSA_QOS_EPOLICYOBJ: - return "Invalid QoS policy object"; - case WSA_QOS_EFLOWDESC: - return "Invalid QoS flow descriptor"; - case WSA_QOS_EPSFLOWSPEC: - return "Invalid QoS provider-specific flowspec"; - case WSA_QOS_EPSFILTERSPEC: - return "Invalid QoS provider-specific filterspec"; - case WSA_QOS_ESDMODEOBJ: - return "Invalid QoS shape discard mode object"; - case WSA_QOS_ESHAPERATEOBJ: - return "Invalid QoS shaping rate object"; - case WSA_QOS_RESERVED_PETYPE: - return "Reserved policy QoS element type"; - } - return "Unknown winsock error"; -} - -/** - * Set last winsock error to equivalent of given errno value - * @param errnum the errno value to set - */ -void MHD_W32_set_last_winsock_error_(int errnum) -{ - switch (errnum) - { - case 0: - WSASetLastError(0); - break; - case EBADF: - WSASetLastError(WSA_INVALID_HANDLE); - break; - case ENOMEM: - WSASetLastError(WSA_NOT_ENOUGH_MEMORY); - break; - case EINVAL: - WSASetLastError(WSA_INVALID_PARAMETER); - break; - case EINTR: - WSASetLastError(WSAEINTR); - break; - case EWOULDBLOCK: - WSASetLastError(WSAEWOULDBLOCK); - break; - case EINPROGRESS: - WSASetLastError(WSAEINPROGRESS); - break; - case EALREADY: - WSASetLastError(WSAEALREADY); - break; - case ENOTSOCK: - WSASetLastError(WSAENOTSOCK); - break; - case EDESTADDRREQ: - WSASetLastError(WSAEDESTADDRREQ); - break; - case EMSGSIZE: - WSASetLastError(WSAEMSGSIZE); - break; - case EPROTOTYPE: - WSASetLastError(WSAEPROTOTYPE); - break; - case ENOPROTOOPT: - WSASetLastError(WSAENOPROTOOPT); - break; - case EPROTONOSUPPORT: - WSASetLastError(WSAEPROTONOSUPPORT); - break; - case ESOCKTNOSUPPORT: - WSASetLastError(WSAESOCKTNOSUPPORT); - break; - case EOPNOTSUPP: - WSASetLastError(WSAEOPNOTSUPP); - break; - case EPFNOSUPPORT: - WSASetLastError(WSAEPFNOSUPPORT); - break; - case EAFNOSUPPORT: - WSASetLastError(WSAEAFNOSUPPORT); - break; - case EADDRINUSE: - WSASetLastError(WSAEADDRINUSE); - break; - case EADDRNOTAVAIL: - WSASetLastError(WSAEADDRNOTAVAIL); - break; - case ENETDOWN: - WSASetLastError(WSAENETDOWN); - break; - case ENETUNREACH: - WSASetLastError(WSAENETUNREACH); - break; - case ENETRESET: - WSASetLastError(WSAENETRESET); - break; - case ECONNABORTED: - WSASetLastError(WSAECONNABORTED); - break; - case ECONNRESET: - WSASetLastError(WSAECONNRESET); - break; - case ENOBUFS: - WSASetLastError(WSAENOBUFS); - break; - case EISCONN: - WSASetLastError(WSAEISCONN); - break; - case ENOTCONN: - WSASetLastError(WSAENOTCONN); - break; - case ESHUTDOWN: - WSASetLastError(WSAESHUTDOWN); - break; - case ETOOMANYREFS: - WSASetLastError(WSAETOOMANYREFS); - break; - case ETIMEDOUT: - WSASetLastError(WSAETIMEDOUT); - break; - case ECONNREFUSED: - WSASetLastError(WSAECONNREFUSED); - break; - case ELOOP: - WSASetLastError(WSAELOOP); - break; - case ENAMETOOLONG: - WSASetLastError(WSAENAMETOOLONG); - break; - case EHOSTDOWN: - WSASetLastError(WSAEHOSTDOWN); - break; - case EHOSTUNREACH: - WSASetLastError(WSAEHOSTUNREACH); - break; - case ENOTEMPTY: - WSASetLastError(WSAENOTEMPTY); - break; - case EPROCLIM: - WSASetLastError(WSAEPROCLIM); - break; - case EUSERS: - WSASetLastError(WSAEUSERS); - break; - case EDQUOT: - WSASetLastError(WSAEDQUOT); - break; - case ESTALE: - WSASetLastError(WSAESTALE); - break; - case EREMOTE: - WSASetLastError(WSAEREMOTE); - break; - case EFAULT: - WSASetLastError(WSAEFAULT); - break; - case ENODATA: - WSASetLastError(WSANO_DATA); - break; -#if EAGAIN != EWOULDBLOCK - case EAGAIN: - WSASetLastError(WSAEWOULDBLOCK); - break; -#endif - /* Rough equivalent */ - case EIO: - WSASetLastError(WSAEREFUSED); - break; - - default: /* Unmapped errors */ - WSASetLastError(WSAENOBUFS); - break; - } -} +#include "../microhttpd/mhd_sockets.h" /** * Create pair of mutually connected TCP/IP sockets on loopback address diff --git a/src/testcurl/https/test_https_time_out.c b/src/testcurl/https/test_https_time_out.c index 128c140f..914100eb 100644 --- a/src/testcurl/https/test_https_time_out.c +++ b/src/testcurl/https/test_https_time_out.c @@ -30,6 +30,7 @@ #include "internal.h" #include "tls_test_common.h" #include <gcrypt.h> +#include "mhd_sockets.h" /* only macros used */ #ifdef _WIN32 #ifndef WIN32_LEAN_AND_MEAN diff --git a/src/testcurl/https/test_tls_extensions.c b/src/testcurl/https/test_tls_extensions.c index b13d8aeb..cc87c2b2 100644 --- a/src/testcurl/https/test_tls_extensions.c +++ b/src/testcurl/https/test_tls_extensions.c @@ -28,6 +28,8 @@ #include "platform.h" #include "microhttpd.h" #include "tls_test_common.h" +#include "mhd_sockets.h" /* only macros used */ + #define MAX_EXT_DATA_LENGTH 256 extern const char srv_key_pem[]; diff --git a/src/testcurl/test_get.c b/src/testcurl/test_get.c index 0b8c577b..b9d12816 100644 --- a/src/testcurl/test_get.c +++ b/src/testcurl/test_get.c @@ -33,6 +33,7 @@ #include <stdlib.h> #include <string.h> #include <time.h> +#include "mhd_sockets.h" /* only macros used */ #ifdef _WIN32 #ifndef WIN32_LEAN_AND_MEAN diff --git a/src/testcurl/test_get_sendfile.c b/src/testcurl/test_get_sendfile.c index 8db2c3aa..19e327fd 100644 --- a/src/testcurl/test_get_sendfile.c +++ b/src/testcurl/test_get_sendfile.c @@ -33,6 +33,7 @@ #include <time.h> #include <sys/types.h> #include <fcntl.h> +#include "mhd_sockets.h" #ifndef WINDOWS #include <sys/socket.h> @@ -101,7 +102,7 @@ ahc_echo (void *cls, { fprintf (stderr, "Failed to open `%s': %s\n", sourcefile, - MHD_strerror_ (errno)); + strerror (errno)); exit (1); } response = MHD_create_response_from_fd (strlen (TESTSTR), fd); diff --git a/src/testcurl/test_options.c b/src/testcurl/test_options.c index d229f9b4..bb52988e 100644 --- a/src/testcurl/test_options.c +++ b/src/testcurl/test_options.c @@ -26,6 +26,7 @@ #include "platform.h" #include "microhttpd.h" +#include "mhd_sockets.h" #define MHD_E_MEM "Error: memory error\n" #define MHD_E_SERVER_INIT "Error: failed to start server\n" diff --git a/src/testcurl/test_quiesce.c b/src/testcurl/test_quiesce.c index bf5e6d44..b0d99494 100644 --- a/src/testcurl/test_quiesce.c +++ b/src/testcurl/test_quiesce.c @@ -33,6 +33,7 @@ #include <time.h> #include <sys/types.h> #include <pthread.h> +#include "mhd_sockets.h" /* only macros used */ #ifndef WINDOWS #include <unistd.h> diff --git a/w32/common/libmicrohttpd-files.vcxproj b/w32/common/libmicrohttpd-files.vcxproj index 0fdfa2bd..64c497b6 100644 --- a/w32/common/libmicrohttpd-files.vcxproj +++ b/w32/common/libmicrohttpd-files.vcxproj @@ -17,6 +17,7 @@ <ClCompile Include="$(MhdSrc)microhttpd\sysfdsetsize.c" /> <ClCompile Include="$(MhdSrc)microhttpd\mhd_str.c" /> <ClCompile Include="$(MhdSrc)microhttpd\mhd_threads.c" /> + <ClCompile Include="$(MhdSrc)microhttpd\mhd_sockets.c" /> <ClCompile Include="$(MhdSrc)platform\w32functions.c" /> </ItemGroup> <ItemGroup> @@ -40,6 +41,7 @@ <ClInclude Include="$(MhdSrc)microhttpd\mhd_str.h" /> <ClInclude Include="$(MhdSrc)microhttpd\mhd_threads.h" /> <ClInclude Include="$(MhdSrc)microhttpd\mhd_locks.h" /> + <ClInclude Include="$(MhdSrc)microhttpd\mhd_sockets.h" /> <ClInclude Include="$(MhdW32Common)MHD_config.h" /> </ItemGroup> <ItemGroup> diff --git a/w32/common/libmicrohttpd-filters.vcxproj b/w32/common/libmicrohttpd-filters.vcxproj index 6bb3dca7..1ed587eb 100644 --- a/w32/common/libmicrohttpd-filters.vcxproj +++ b/w32/common/libmicrohttpd-filters.vcxproj @@ -139,6 +139,12 @@ <ClInclude Include="$(MhdSrc)microhttpd\mhd_locks.h"> <Filter>Source Files</Filter> </ClInclude> + <ClInclude Include="$(MhdSrc)microhttpd\mhd_sockets.h"> + <Filter>Source Files</Filter> + </ClInclude> + <ClCompile Include="$(MhdSrc)microhttpd\mhd_sockets.c"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ResourceCompile Include="$(MhdW32Common)microhttpd_dll_res_vc.rc"> |