gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r32393 - in libmicrohttpd/src: microhttpd platform testcurl


From: gnunet
Subject: [GNUnet-SVN] r32393 - in libmicrohttpd/src: microhttpd platform testcurl
Date: Tue, 18 Feb 2014 19:38:21 +0100

Author: Karlson2k
Date: 2014-02-18 19:38:21 +0100 (Tue, 18 Feb 2014)
New Revision: 32393

Added:
   libmicrohttpd/src/platform/w32functions.c
   libmicrohttpd/src/platform/w32functions.h
Modified:
   libmicrohttpd/src/microhttpd/Makefile.am
   libmicrohttpd/src/microhttpd/connection.c
   libmicrohttpd/src/microhttpd/daemon.c
   libmicrohttpd/src/microhttpd/internal.h
   libmicrohttpd/src/platform/platform_interface.h
   libmicrohttpd/src/testcurl/Makefile.am
   libmicrohttpd/src/testcurl/test_get_sendfile.c
Log:
add platform abstraction for errno and strerror, check EWOULDBLOCK additionally 
to EAGAIN

Modified: libmicrohttpd/src/microhttpd/Makefile.am
===================================================================
--- libmicrohttpd/src/microhttpd/Makefile.am    2014-02-18 18:38:04 UTC (rev 
32392)
+++ libmicrohttpd/src/microhttpd/Makefile.am    2014-02-18 18:38:21 UTC (rev 
32393)
@@ -2,6 +2,10 @@
  PLIBC_INCLUDE = -I$(top_srcdir)/src/include/plibc
 endif
 
+if HAVE_W32
+  W32FUNC_SRC = ../platform/w32functions.c ../platform/w32functions.h
+endif
+
 AM_CPPFLAGS = \
   $(PLIBC_INCLUDE) \
   -I$(top_srcdir)/src/include \
@@ -22,7 +26,7 @@
   internal.c internal.h \
   memorypool.c memorypool.h \
   response.c response.h \
-  ../platform/platform_interface.h
+  ../platform/platform_interface.h $(W32FUNC_SRC)
 libmicrohttpd_la_CPPFLAGS = \
   $(AM_CPPFLAGS) \
   -DBUILDING_MHD_LIB=1

Modified: libmicrohttpd/src/microhttpd/connection.c
===================================================================
--- libmicrohttpd/src/microhttpd/connection.c   2014-02-18 18:38:04 UTC (rev 
32392)
+++ libmicrohttpd/src/microhttpd/connection.c   2014-02-18 18:38:21 UTC (rev 
32393)
@@ -1583,7 +1583,9 @@
                                      connection->read_buffer_offset);
   if (bytes_read < 0)
     {
-      if ((EINTR == errno) || (EAGAIN == errno) || (ECONNRESET == errno))
+      const int err = MHD_socket_errno_;
+      if ((EINTR == err) || (EAGAIN == err) || (ECONNRESET == err)
+          || (EWOULDBLOCK == err))
          return MHD_NO;
 #if HAVE_MESSAGES
 #if HTTPS_SUPPORT
@@ -1595,7 +1597,7 @@
 #endif
        MHD_DLOG (connection->daemon,
                  "Failed to receive data: %s\n",
-                  STRERROR (errno));
+                  MHD_socket_last_strerr_ ());
 #endif
       CONNECTION_CLOSE_ERROR (connection, NULL);
       return MHD_YES;
@@ -1636,7 +1638,8 @@
 
   if (ret < 0)
     {
-      if ((EINTR == errno) || (EAGAIN == errno))
+      const int err = MHD_socket_errno_;
+      if ((EINTR == err) || (EAGAIN == err) || (EWOULDBLOCK == err))
         return MHD_NO;
 #if HAVE_MESSAGES
 #if HTTPS_SUPPORT
@@ -1647,7 +1650,7 @@
       else
 #endif
        MHD_DLOG (connection->daemon,
-                 "Failed to send data: %s\n", STRERROR (errno));
+                 "Failed to send data: %s\n", MHD_socket_last_strerr_ ());
 #endif
       CONNECTION_CLOSE_ERROR (connection, NULL);
       return MHD_YES;
@@ -2022,12 +2025,13 @@
                                       
connection->continue_message_write_offset);
           if (ret < 0)
             {
-              if ((errno == EINTR) || (errno == EAGAIN))
+              const int err = MHD_socket_errno_;
+              if ((err == EINTR) || (err == EAGAIN) || (EWOULDBLOCK == err))
                 break;
 #if HAVE_MESSAGES
               MHD_DLOG (connection->daemon,
                         "Failed to send data: %s\n",
-                        STRERROR (errno));
+                        MHD_socket_last_strerr_ ());
 #endif
              CONNECTION_CLOSE_ERROR (connection, NULL);
               return MHD_YES;
@@ -2068,6 +2072,7 @@
                                      response->data_size -
                                      (connection->response_write_position
                                       - response->data_start));
+         const int err = MHD_socket_errno_;
 #if DEBUG_SEND_DATA
           if (ret > 0)
             FPRINTF (stderr,
@@ -2080,12 +2085,12 @@
             pthread_mutex_unlock (&response->mutex);
           if (ret < 0)
             {
-              if ((errno == EINTR) || (errno == EAGAIN))
+              if ((err == EINTR) || (err == EAGAIN) || (EWOULDBLOCK == err))
                 return MHD_YES;
 #if HAVE_MESSAGES
               MHD_DLOG (connection->daemon,
                         "Failed to send data: %s\n",
-                        STRERROR (errno));
+                        MHD_socket_last_strerr_ ());
 #endif
              CONNECTION_CLOSE_ERROR (connection, NULL);
               return MHD_YES;
@@ -2658,7 +2663,7 @@
          if (0 != (daemon->options & MHD_USE_DEBUG))
            MHD_DLOG (daemon,
                      "Call to epoll_ctl failed: %s\n",
-                     STRERROR (errno));
+                     MHD_socket_last_strerr_ ());
 #endif
          connection->state = MHD_CONNECTION_CLOSED;
          cleanup_connection (connection);

Modified: libmicrohttpd/src/microhttpd/daemon.c
===================================================================
--- libmicrohttpd/src/microhttpd/daemon.c       2014-02-18 18:38:04 UTC (rev 
32392)
+++ libmicrohttpd/src/microhttpd/daemon.c       2014-02-18 18:38:21 UTC (rev 
32393)
@@ -25,7 +25,6 @@
  * @author Christian Grothoff
  */
 #include "platform.h"
-#include "platform_interface.h"
 #include "internal.h"
 #include "response.h"
 #include "connection.h"
@@ -409,7 +408,7 @@
   if ( (GNUTLS_E_AGAIN == res) ||
        (GNUTLS_E_INTERRUPTED == res) )
     {
-      errno = EINTR;
+      MHD_set_socket_errno_ (EINTR);
 #if EPOLL_SUPPORT
       connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY;
 #endif
@@ -420,7 +419,7 @@
       /* Likely 'GNUTLS_E_INVALID_SESSION' (client communication
         disrupted); set errno to something caller will interpret
         correctly as a hard error */
-      errno = EPIPE;
+      MHD_set_socket_errno_ (ECONNRESET);
       return res;
     }
   if (res == i)
@@ -450,7 +449,7 @@
   if ( (GNUTLS_E_AGAIN == res) ||
        (GNUTLS_E_INTERRUPTED == res) )
     {
-      errno = EINTR;
+      MHD_set_socket_errno_ (EINTR);
 #if EPOLL_SUPPORT
       connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
 #endif
@@ -732,13 +731,13 @@
          num_ready = SELECT (max + 1, &rs, &ws, NULL, tvp);
          if (num_ready < 0)
            {
-             if (EINTR == errno)
+             if (EINTR == MHD_socket_errno_)
                continue;
 #if HAVE_MESSAGES
              MHD_DLOG (con->daemon,
                        "Error during select (%d): `%s'\n",
                        max,
-                       STRERROR (errno));
+                       MHD_socket_last_strerr_ ());
 #endif
              break;
            }
@@ -784,11 +783,11 @@
          if (poll (p, 1,
                    (NULL == tvp) ? -1 : tv.tv_sec * 1000) < 0)
            {
-             if (EINTR == errno)
+             if (EINTR == MHD_socket_errno_)
                continue;
 #if HAVE_MESSAGES
              MHD_DLOG (con->daemon, "Error during poll: `%s'\n",
-                       STRERROR (errno));
+                       MHD_socket_last_strerr_ ());
 #endif
              break;
            }
@@ -848,7 +847,7 @@
   if ( (MHD_INVALID_SOCKET == connection->socket_fd) ||
        (MHD_CONNECTION_CLOSED == connection->state) )
     {
-      errno = ENOTCONN;
+      MHD_set_socket_errno_ (ENOTCONN);
       return -1;
     }
   ret = RECV (connection->socket_fd, other, i, MSG_NOSIGNAL);
@@ -886,7 +885,7 @@
   if ( (MHD_INVALID_SOCKET == connection->socket_fd) ||
        (MHD_CONNECTION_CLOSED == connection->state) )
     {
-      errno = ENOTCONN;
+      MHD_set_socket_errno_ (ENOTCONN);
       return -1;
     }
   if (0 != (connection->daemon->options & MHD_USE_SSL))
@@ -916,9 +915,10 @@
 #endif
          return ret;
        }
-      if ( (EINTR == errno) || (EAGAIN == errno) )
+      const int err = MHD_socket_errno_;
+      if ( (EINTR == err) || (EAGAIN == err) || (EWOULDBLOCK == err) )
        return 0;
-      if ( (EINVAL == errno) || (EBADF == errno) )
+      if ( (EINVAL == err) || (EBADF == err) )
        return -1;
       /* None of the 'usual' sendfile errors occurred, so we should try
         to fall back to 'SEND'; see also this thread for info on
@@ -1137,7 +1137,7 @@
 #if HAVE_MESSAGES
       MHD_DLOG (daemon,
                "Error allocating memory: %s\n",
-               STRERROR (errno));
+               MHD_strerror_ (errno));
 #endif
       if (0 != MHD_socket_close_ (client_socket))
        MHD_PANIC ("close failed\n");
@@ -1152,7 +1152,7 @@
 #if HAVE_MESSAGES
       MHD_DLOG (daemon,
                "Error allocating memory: %s\n",
-               STRERROR (errno));
+               MHD_strerror_ (errno));
 #endif
       if (0 != MHD_socket_close_ (client_socket))
        MHD_PANIC ("close failed\n");
@@ -1171,7 +1171,7 @@
 #if HAVE_MESSAGES
       MHD_DLOG (daemon,
                "Error allocating memory: %s\n",
-               STRERROR (errno));
+               MHD_strerror_ (errno));
 #endif
       if (0 != MHD_socket_close_ (client_socket))
        MHD_PANIC ("close failed\n");
@@ -1211,7 +1211,7 @@
 #if HAVE_MESSAGES
              MHD_DLOG (daemon,
                        "Failed to make socket non-blocking: %s\n",
-                       STRERROR (errno));
+                       MHD_socket_last_strerr_ ());
 #endif
            }
 #else
@@ -1221,7 +1221,7 @@
 #if HAVE_MESSAGES
              MHD_DLOG (daemon,
                        "Failed to make socket non-blocking: %s\n",
-                       STRERROR (errno));
+                       MHD_socket_last_strerr_ ());
 #endif
            }
 #endif
@@ -1299,7 +1299,7 @@
          eno = errno;
 #if HAVE_MESSAGES
           MHD_DLOG (daemon, "Failed to create a thread: %s\n",
-                    STRERROR (res_thread_create));
+                    MHD_strerror_ (res_thread_create));
 #endif
          goto cleanup;
         }
@@ -1332,7 +1332,7 @@
 #if HAVE_MESSAGES
               MHD_DLOG (daemon,
                         "Call to epoll_ctl failed: %s\n",
-                        STRERROR (errno));
+                        MHD_socket_last_strerr_ ());
 #endif
              goto cleanup;
            }
@@ -1584,7 +1584,7 @@
 #if HAVE_MESSAGES
       MHD_DLOG (daemon,
                "Failed to make socket non-blocking: %s\n",
-               STRERROR (errno));
+               MHD_socket_last_strerr_ ());
 #endif
     }
   if (!GetHandleInformation ((HANDLE) sock, &dwFlags) ||
@@ -1592,10 +1592,9 @@
        !SetHandleInformation ((HANDLE) sock, HANDLE_FLAG_INHERIT, 0)))
     {
 #if HAVE_MESSAGES
-      SetErrnoFromWinError (GetLastError ());
       MHD_DLOG (daemon,
-               "Failed to make socket non-inheritable: %s\n",
-               STRERROR (errno));
+               "Failed to make socket non-inheritable: %u\n",
+               (unsigned int) GetLastError ());
 #endif
     }
 #else
@@ -1615,7 +1614,7 @@
 #if HAVE_MESSAGES
       MHD_DLOG (daemon,
                "Failed to make socket non-inheritable: %s\n",
-               STRERROR (errno));
+               MHD_socket_last_strerr_ ());
 #endif
     }
 #endif
@@ -1713,11 +1712,12 @@
   if ((MHD_INVALID_SOCKET == s) || (addrlen <= 0))
     {
 #if HAVE_MESSAGES
+      const int err = MHD_socket_errno_;
       /* This could be a common occurance with multiple worker threads */
-      if ((EAGAIN != errno) && (EWOULDBLOCK != errno))
+      if ((EAGAIN != err) && (EWOULDBLOCK != err))
         MHD_DLOG (daemon,
                  "Error accepting connection: %s\n",
-                 STRERROR (errno));
+                 MHD_socket_last_strerr_ ());
 #endif
       if (MHD_INVALID_SOCKET != s)
         {
@@ -2094,10 +2094,10 @@
     return MHD_NO;
   if (num_ready < 0)
     {
-      if (EINTR == errno)
+      if (EINTR == MHD_socket_errno_)
         return MHD_YES;
 #if HAVE_MESSAGES
-      MHD_DLOG (daemon, "select failed: %s\n", STRERROR (errno));
+      MHD_DLOG (daemon, "select failed: %s\n", MHD_socket_last_strerr_ ());
 #endif
       return MHD_NO;
     }
@@ -2193,12 +2193,12 @@
       return MHD_YES;
     if (poll (p, poll_server + num_connections, timeout) < 0)
       {
-       if (EINTR == errno)
+       if (EINTR == MHD_socket_errno_)
          return MHD_YES;
 #if HAVE_MESSAGES
        MHD_DLOG (daemon,
                  "poll failed: %s\n",
-                 STRERROR (errno));
+                 MHD_socket_last_strerr_ ());
 #endif
        return MHD_NO;
       }
@@ -2299,10 +2299,10 @@
     return MHD_YES;
   if (poll (p, poll_count, timeout) < 0)
     {
-      if (EINTR == errno)
+      if (EINTR == MHD_socket_errno_)
        return MHD_YES;
 #if HAVE_MESSAGES
-      MHD_DLOG (daemon, "poll failed: %s\n", STRERROR (errno));
+      MHD_DLOG (daemon, "poll failed: %s\n", MHD_socket_last_strerr_ ());
 #endif
       return MHD_NO;
     }
@@ -2396,7 +2396,7 @@
          if (0 != (daemon->options & MHD_USE_DEBUG))
            MHD_DLOG (daemon,
                      "Call to epoll_ctl failed: %s\n",
-                     STRERROR (errno));
+                     MHD_socket_last_strerr_ ());
 #endif
          return MHD_NO;
        }
@@ -2442,13 +2442,13 @@
                               events, MAX_EVENTS, timeout_ms);
       if (-1 == num_events)
        {
-         if (EINTR == errno)
+         if (EINTR == MHD_socket_errno_)
            return MHD_YES;
 #if HAVE_MESSAGES
          if (0 != (daemon->options & MHD_USE_DEBUG))
            MHD_DLOG (daemon,
                      "Call to epoll_wait failed: %s\n",
-                     STRERROR (errno));
+                     MHD_socket_last_strerr_ ());
 #endif
          return MHD_NO;
        }
@@ -3083,7 +3083,7 @@
   /* use SOCK_STREAM rather than ai_socktype: some getaddrinfo
    * implementations do not set ai_socktype, e.g. RHL6.2. */
   fd = SOCKET (domain, ctype, protocol);
-  if ( (MHD_INVALID_SOCKET == fd) && (EINVAL == errno) && (0 != SOCK_CLOEXEC) )
+  if ( (MHD_INVALID_SOCKET == fd) && (EINVAL == MHD_socket_errno_) && (0 != 
SOCK_CLOEXEC) )
   {
     ctype = type;
     fd = SOCKET(domain, type, protocol);
@@ -3116,7 +3116,7 @@
       if (0 != (daemon->options & MHD_USE_DEBUG))
        MHD_DLOG (daemon,
                  "Call to epoll_create1 failed: %s\n",
-                 STRERROR (errno));
+                 MHD_socket_last_strerr_ ());
 #endif
       return MHD_NO;
     }
@@ -3136,7 +3136,7 @@
       if (0 != (daemon->options & MHD_USE_DEBUG))
        MHD_DLOG (daemon,
                  "Call to epoll_ctl failed: %s\n",
-                 STRERROR (errno));
+                 MHD_socket_last_strerr_ ());
 #endif
       return MHD_NO;
     }
@@ -3155,7 +3155,7 @@
           if (0 != (daemon->options & MHD_USE_DEBUG))
             MHD_DLOG (daemon,
                       "Call to epoll_ctl failed: %s\n",
-                      STRERROR (errno));
+                      MHD_socket_last_strerr_ ());
 #endif
           return MHD_NO;
         }
@@ -3274,7 +3274,7 @@
 #if HAVE_MESSAGES
       MHD_DLOG (daemon,
                "Failed to create control pipe: %s\n",
-               STRERROR (errno));
+               MHD_strerror_ (errno));
 #endif
       free (daemon);
       return NULL;
@@ -3342,7 +3342,7 @@
 #if HAVE_MESSAGES
          MHD_DLOG (daemon,
                    "Failed to allocate memory for nonce-nc map: %s\n",
-                   STRERROR (errno));
+                   MHD_strerror_ (errno));
 #endif
 #if HTTPS_SUPPORT
          if (0 != (flags & MHD_USE_SSL))
@@ -3442,7 +3442,7 @@
          if (0 != (flags & MHD_USE_DEBUG))
            MHD_DLOG (daemon,
                      "Call to socket failed: %s\n",
-                     STRERROR (errno));
+                     MHD_socket_last_strerr_ ());
 #endif
          goto free_and_fail;
        }
@@ -3455,7 +3455,7 @@
 #if HAVE_MESSAGES
          MHD_DLOG (daemon,
                    "setsockopt failed: %s\n",
-                   STRERROR (errno));
+                   MHD_socket_last_strerr_ ());
 #endif
        }
 
@@ -3515,7 +3515,7 @@
 #if HAVE_MESSAGES
              MHD_DLOG (daemon,
                        "setsockopt failed: %s\n",
-                       STRERROR (errno));
+                       MHD_socket_last_strerr_ ());
 #endif
            }
 #endif
@@ -3528,7 +3528,7 @@
            MHD_DLOG (daemon,
                      "Failed to bind to port %u: %s\n",
                      (unsigned int) port,
-                     STRERROR (errno));
+                     MHD_socket_last_strerr_ ());
 #endif
          if (0 != MHD_socket_close_ (socket_fd))
            MHD_PANIC ("close failed\n");
@@ -3543,7 +3543,7 @@
 #if HAVE_MESSAGES
              MHD_DLOG (daemon,
                        "Failed to make listen socket non-blocking: %s\n",
-                       STRERROR (errno));
+                       MHD_socket_last_strerr_ ());
 #endif
              if (0 != MHD_socket_close_ (socket_fd))
                MHD_PANIC ("close failed\n");
@@ -3557,7 +3557,7 @@
          if (0 != (flags & MHD_USE_DEBUG))
            MHD_DLOG (daemon,
                      "Failed to listen for connections: %s\n",
-                     STRERROR (errno));
+                     MHD_socket_last_strerr_ ());
 #endif
          if (0 != MHD_socket_close_ (socket_fd))
            MHD_PANIC ("close failed\n");
@@ -3635,7 +3635,7 @@
 #if HAVE_MESSAGES
       MHD_DLOG (daemon,
                 "Failed to create listen thread: %s\n",
-               STRERROR (res_thread_create));
+               MHD_strerror_ (res_thread_create));
 #endif
       pthread_mutex_destroy (&daemon->cleanup_connection_mutex);
       pthread_mutex_destroy (&daemon->per_ip_connection_mutex);
@@ -3715,7 +3715,7 @@
 #if HAVE_MESSAGES
               MHD_DLOG (daemon,
                         "Failed to create worker control pipe: %s\n",
-                        STRERROR (errno));
+                        MHD_strerror_ (errno));
 #endif
               goto thread_failed;
             }
@@ -3764,7 +3764,7 @@
 #if HAVE_MESSAGES
               MHD_DLOG (daemon,
                         "Failed to create pool thread: %s\n",
-                       STRERROR (res_thread_create));
+                       MHD_strerror_ (res_thread_create));
 #endif
               /* Free memory for this worker; cleanup below handles
                * all previously-created workers. */

Modified: libmicrohttpd/src/microhttpd/internal.h
===================================================================
--- libmicrohttpd/src/microhttpd/internal.h     2014-02-18 18:38:04 UTC (rev 
32392)
+++ libmicrohttpd/src/microhttpd/internal.h     2014-02-18 18:38:21 UTC (rev 
32393)
@@ -29,6 +29,7 @@
 
 #include "platform.h"
 #include "microhttpd.h"
+#include "platform_interface.h"
 #if HTTPS_SUPPORT
 #include <gnutls/gnutls.h>
 #if GNUTLS_VERSION_MAJOR >= 3

Modified: libmicrohttpd/src/platform/platform_interface.h
===================================================================
--- libmicrohttpd/src/platform/platform_interface.h     2014-02-18 18:38:04 UTC 
(rev 32392)
+++ libmicrohttpd/src/platform/platform_interface.h     2014-02-18 18:38:21 UTC 
(rev 32393)
@@ -26,6 +26,10 @@
 #ifndef MHD_PLATFORM_INTERFACE_H
 #define MHD_PLATFORM_INTERFACE_H
 
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include "w32functions.h"
+#endif
+
 /* MHD_socket_close_(fd) close any FDs (non-W32) / close only socket FDs (W32) 
*/
 #if !defined(_WIN32) || defined(__CYGWIN__)
 #define MHD_socket_close_(fd) close((fd))
@@ -33,4 +37,33 @@
 #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(_WIN32) || defined(__CYGWIN__)
+#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(_WIN32) || defined(__CYGWIN__)
+#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(_WIN32) || defined(__CYGWIN__)
+#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(_WIN32) || defined(__CYGWIN__)
+#define MHD_set_socket_errno_(errnum) errno=(errnum)
+#else
+#define MHD_set_socket_errno_(errnum) MHD_W32_set_last_winsock_error_((errnum))
+#endif
+
 #endif // MHD_PLATFORM_INTERFACE_H

Added: libmicrohttpd/src/platform/w32functions.c
===================================================================
--- libmicrohttpd/src/platform/w32functions.c                           (rev 0)
+++ libmicrohttpd/src/platform/w32functions.c   2014-02-18 18:38:21 UTC (rev 
32393)
@@ -0,0 +1,543 @@
+/*
+  This file is part of libmicrohttpd
+  (C) 2014 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, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file platform/w32functions.h
+ * @brief  internal functions for W32 systems
+ * @author Karlson2k (Evgeny Grin)
+ */
+
+#include "w32functions.h"
+#include <errno.h>
+#include <winsock2.h>
+#include <string.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;
+    }
+}

Added: libmicrohttpd/src/platform/w32functions.h
===================================================================
--- libmicrohttpd/src/platform/w32functions.h                           (rev 0)
+++ libmicrohttpd/src/platform/w32functions.h   2014-02-18 18:38:21 UTC (rev 
32393)
@@ -0,0 +1,176 @@
+/*
+  This file is part of libmicrohttpd
+  (C) 2014 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, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file platform/w32functions.h
+ * @brief  internal functions for W32 systems
+ * @author Karlson2k (Evgeny Grin)
+ */
+
+#ifndef MHD_W32FUNCTIONS_H
+#define MHD_W32FUNCTIONS_H
+#ifndef _WIN32
+#error w32functions.h is designed only for W32 systems
+#endif
+
+#include <errno.h>
+#include <winsock2.h>
+#include "platform.h"
+
+#ifdef __cplusplus
+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
+
+/**
+ * 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);
+
+#ifdef __cplusplus
+}
+#endif
+#endif //MHD_W32FUNCTIONS_H

Modified: libmicrohttpd/src/testcurl/Makefile.am
===================================================================
--- libmicrohttpd/src/testcurl/Makefile.am      2014-02-18 18:38:04 UTC (rev 
32392)
+++ libmicrohttpd/src/testcurl/Makefile.am      2014-02-18 18:38:21 UTC (rev 
32393)
@@ -137,7 +137,12 @@
   @LIBCURL@ @LIBGCRYPT_LIBS@
 
 test_get_sendfile_SOURCES = \
-  test_get_sendfile.c
+  test_get_sendfile.c \
+  ../platform/platform_interface.h
+if HAVE_W32
+test_get_sendfile_SOURCES += \
+  ../platform/w32functions.h ../platform/w32functions.c
+endif
 test_get_sendfile_LDADD = \
   $(top_builddir)/src/microhttpd/libmicrohttpd.la \
   @LIBCURL@ 
@@ -215,6 +220,10 @@
 
 test_get_sendfile11_SOURCES = \
   test_get_sendfile.c
+if HAVE_W32
+test_get_sendfile11_SOURCES += \
+  ../platform/w32functions.h ../platform/w32functions.c
+endif
 test_get_sendfile11_LDADD = \
   $(top_builddir)/src/microhttpd/libmicrohttpd.la \
   @LIBCURL@ 

Modified: libmicrohttpd/src/testcurl/test_get_sendfile.c
===================================================================
--- libmicrohttpd/src/testcurl/test_get_sendfile.c      2014-02-18 18:38:04 UTC 
(rev 32392)
+++ libmicrohttpd/src/testcurl/test_get_sendfile.c      2014-02-18 18:38:21 UTC 
(rev 32393)
@@ -26,6 +26,7 @@
 
 #include "MHD_config.h"
 #include "platform.h"
+#include "platform_interface.h"
 #include <curl/curl.h>
 #include <microhttpd.h>
 #include <stdlib.h>
@@ -93,7 +94,7 @@
     {
       fprintf (stderr, "Failed to open `%s': %s\n",
               sourcefile,
-              STRERROR (errno));
+              MHD_strerror_ (errno));
       exit (1);
     }
   response = MHD_create_response_from_fd (strlen (TESTSTR), fd);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]