Moved sockets abstraction to specialized mhd_socket.h/.c files

This commit is contained in:
Evgeny Grin (Karlson2k)
2016-08-23 20:12:50 +00:00
parent 2b2b1655a6
commit 50bbf74d4e
23 changed files with 1010 additions and 852 deletions
+4 -1
View File
@@ -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],
+4 -5
View File
@@ -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
+8 -13
View File
@@ -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>
+19 -51
View File
@@ -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
+1 -79
View File
@@ -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
-138
View File
@@ -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
+1
View File
@@ -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) \
+1 -5
View File
@@ -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"
/**
+1 -35
View File
@@ -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,
+1 -7
View File
@@ -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"
/**
+545
View File
@@ -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 */
+406
View File
@@ -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 */
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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>
+1 -515
View File
@@ -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
+1
View File
@@ -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
+2
View File
@@ -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[];
+1
View File
@@ -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
+2 -1
View File
@@ -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);
+1
View File
@@ -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"
+1
View File
@@ -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>
+2
View File
@@ -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>
+6
View File
@@ -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">