1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/*
2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  This file is part of libmicrohttpd
3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  Copyright (C) 2014 Karlson2k (Evgeny Grin)
4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  This library is free software; you can redistribute it and/or
6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  modify it under the terms of the GNU Lesser General Public
7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  License as published by the Free Software Foundation; either
8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  version 2.1 of the License, or (at your option) any later version.
9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  This library is distributed in the hope that it will be useful,
11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  but WITHOUT ANY WARRANTY; without even the implied warranty of
12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  Lesser General Public License for more details.
14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  You should have received a copy of the GNU Lesser General Public
16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  License along with this library.
17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  If not, see <http://www.gnu.org/licenses/>.
18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat*/
19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @file platform/w32functions.h
22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief  internal functions for W32 systems
23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Karlson2k (Evgeny Grin)
24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "w32functions.h"
27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <errno.h>
28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <winsock2.h>
29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <string.h>
30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <stdint.h>
31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <time.h>
32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <stdio.h>
33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <stdarg.h>
34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Return errno equivalent of last winsock error
38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return errno equivalent of last winsock error
39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint MHD_W32_errno_from_winsock_(void)
41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  switch(WSAGetLastError())
43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  {
44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case 0:                      return 0;
45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_INVALID_HANDLE:     return EBADF;
46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_NOT_ENOUGH_MEMORY:  return ENOMEM;
47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_INVALID_PARAMETER:  return EINVAL;
48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINTR:               return EINTR;
49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEWOULDBLOCK:         return EWOULDBLOCK;
50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINPROGRESS:         return EINPROGRESS;
51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEALREADY:            return EALREADY;
52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOTSOCK:            return ENOTSOCK;
53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEDESTADDRREQ:        return EDESTADDRREQ;
54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEMSGSIZE:            return EMSGSIZE;
55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPROTOTYPE:          return EPROTOTYPE;
56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOPROTOOPT:         return ENOPROTOOPT;
57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPROTONOSUPPORT:     return EPROTONOSUPPORT;
58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAESOCKTNOSUPPORT:     return ESOCKTNOSUPPORT;
59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEOPNOTSUPP:          return EOPNOTSUPP;
60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPFNOSUPPORT:        return EPFNOSUPPORT;
61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEAFNOSUPPORT:        return EAFNOSUPPORT;
62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEADDRINUSE:          return EADDRINUSE;
63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEADDRNOTAVAIL:       return EADDRNOTAVAIL;
64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENETDOWN:            return ENETDOWN;
65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENETUNREACH:         return ENETUNREACH;
66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENETRESET:           return ENETRESET;
67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAECONNABORTED:        return ECONNABORTED;
68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAECONNRESET:          return ECONNRESET;
69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOBUFS:             return ENOBUFS;
70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEISCONN:             return EISCONN;
71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOTCONN:            return ENOTCONN;
72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAESHUTDOWN:           return ESHUTDOWN;
73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAETOOMANYREFS:        return ETOOMANYREFS;
74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAETIMEDOUT:           return ETIMEDOUT;
75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAECONNREFUSED:        return ECONNREFUSED;
76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAELOOP:               return ELOOP;
77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENAMETOOLONG:        return ENAMETOOLONG;
78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEHOSTDOWN:           return EHOSTDOWN;
79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEHOSTUNREACH:        return EHOSTUNREACH;
80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOTEMPTY:           return ENOTEMPTY;
81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPROCLIM:            return EPROCLIM;
82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEUSERS:              return EUSERS;
83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEDQUOT:              return EDQUOT;
84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAESTALE:              return ESTALE;
85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEREMOTE:             return EREMOTE;
86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINVAL:              return EINVAL;
87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEFAULT:              return EFAULT;
88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSANO_DATA:             return ENODATA;
89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  /* Rough equivalents */
90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEDISCON:             return ECONNRESET;
91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINVALIDPROCTABLE:   return EFAULT;
92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSASYSNOTREADY:
93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSANOTINITIALISED:
94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSASYSCALLFAILURE:      return ENOBUFS;
95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAVERNOTSUPPORTED:     return EOPNOTSUPP;
96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEREFUSED:            return EIO;
97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  }
98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return EINVAL;
99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Return pointer to string description of errnum error
103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Works fine with both standard errno errnums
104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * and errnums from MHD_W32_errno_from_winsock_
105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param errnum the errno or value from MHD_W32_errno_from_winsock_()
106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return pointer to string description of error
107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char* MHD_W32_strerror_(int errnum)
109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  switch(errnum)
111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  {
112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case 0:
113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No error";
114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EWOULDBLOCK:
115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Operation would block";
116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EINPROGRESS:
117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Connection already in progress";
118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EALREADY:
119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket already connected";
120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOTSOCK:
121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket operation on non-socket";
122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EDESTADDRREQ:
123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Destination address required";
124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EMSGSIZE:
125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Message too long";
126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPROTOTYPE:
127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Protocol wrong type for socket";
128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOPROTOOPT:
129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Protocol not available";
130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPROTONOSUPPORT:
131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Unknown protocol";
132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ESOCKTNOSUPPORT:
133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket type not supported";
134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EOPNOTSUPP:
135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Operation not supported on socket";
136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPFNOSUPPORT:
137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Protocol family not supported";
138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EAFNOSUPPORT:
139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Address family not supported by protocol family";
140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EADDRINUSE:
141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Address already in use";
142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EADDRNOTAVAIL:
143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Cannot assign requested address";
144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENETDOWN:
145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Network is down";
146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENETUNREACH:
147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Network is unreachable";
148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENETRESET:
149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Network dropped connection on reset";
150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ECONNABORTED:
151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Software caused connection abort";
152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ECONNRESET:
153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Connection reset by peer";
154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOBUFS:
155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No system resources available";
156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EISCONN:
157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket is already connected";
158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOTCONN:
159748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket is not connected";
160748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ESHUTDOWN:
161748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Can't send after socket shutdown";
162748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ETOOMANYREFS:
163748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Too many references: cannot splice";
164748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ETIMEDOUT:
165748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Connection timed out";
166748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ECONNREFUSED:
167748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Connection refused";
168748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ELOOP:
169748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Cannot translate name";
170748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EHOSTDOWN:
171748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Host is down";
172748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EHOSTUNREACH:
173748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Host is unreachable";
174748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPROCLIM:
175748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Too many processes";
176748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EUSERS:
177748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Too many users";
178748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EDQUOT:
179748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Disk quota exceeded";
180748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ESTALE:
181748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Stale file handle reference";
182748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EREMOTE:
183748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Resource is remote";
184748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENODATA:
185748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No data available";
186748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  }
187748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return strerror(errnum);
188748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
189748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
190748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
191748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Return pointer to string description of last winsock error
192748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return pointer to string description of last winsock error
193748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
194748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char* MHD_W32_strerror_last_winsock_(void)
195748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
196748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  switch (WSAGetLastError())
197748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
198748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case 0:
199748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No error";
200748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_INVALID_HANDLE:
201748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Specified event object handle is invalid";
202748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_NOT_ENOUGH_MEMORY:
203748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Insufficient memory available";
204748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_INVALID_PARAMETER:
205748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "One or more parameters are invalid";
206748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_OPERATION_ABORTED:
207748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Overlapped operation aborted";
208748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_IO_INCOMPLETE:
209748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Overlapped I/O event object not in signaled state";
210748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_IO_PENDING:
211748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Overlapped operations will complete later";
212748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINTR:
213748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Interrupted function call";
214748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEBADF:
215748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "File handle is not valid";
216748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEACCES:
217748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Permission denied";
218748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEFAULT:
219748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Bad address";
220748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINVAL:
221748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid argument";
222748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEMFILE:
223748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Too many open files";
224748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEWOULDBLOCK:
225748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Resource temporarily unavailable";
226748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINPROGRESS:
227748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Operation now in progress";
228748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEALREADY:
229748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Operation already in progress";
230748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOTSOCK:
231748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket operation on nonsocket";
232748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEDESTADDRREQ:
233748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Destination address required";
234748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEMSGSIZE:
235748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Message too long";
236748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPROTOTYPE:
237748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Protocol wrong type for socket";
238748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOPROTOOPT:
239748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Bad protocol option";
240748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPROTONOSUPPORT:
241748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Protocol not supported";
242748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAESOCKTNOSUPPORT:
243748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket type not supported";
244748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEOPNOTSUPP:
245748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Operation not supported";
246748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPFNOSUPPORT:
247748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Protocol family not supported";
248748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEAFNOSUPPORT:
249748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Address family not supported by protocol family";
250748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEADDRINUSE:
251748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Address already in use";
252748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEADDRNOTAVAIL:
253748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Cannot assign requested address";
254748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENETDOWN:
255748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Network is down";
256748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENETUNREACH:
257748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Network is unreachable";
258748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENETRESET:
259748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Network dropped connection on reset";
260748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAECONNABORTED:
261748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Software caused connection abort";
262748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAECONNRESET:
263748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Connection reset by peer";
264748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOBUFS:
265748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No buffer space available";
266748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEISCONN:
267748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket is already connected";
268748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOTCONN:
269748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Socket is not connected";
270748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAESHUTDOWN:
271748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Cannot send after socket shutdown";
272748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAETOOMANYREFS:
273748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Too many references";
274748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAETIMEDOUT:
275748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Connection timed out";
276748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAECONNREFUSED:
277748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Connection refused";
278748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAELOOP:
279748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Cannot translate name";
280748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENAMETOOLONG:
281748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Name too long";
282748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEHOSTDOWN:
283748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Host is down";
284748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEHOSTUNREACH:
285748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No route to host";
286748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOTEMPTY:
287748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Directory not empty";
288748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPROCLIM:
289748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Too many processes";
290748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEUSERS:
291748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "User quota exceeded";
292748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEDQUOT:
293748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Disk quota exceeded";
294748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAESTALE:
295748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Stale file handle reference";
296748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEREMOTE:
297748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Item is remote";
298748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSASYSNOTREADY:
299748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Network subsystem is unavailable";
300748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAVERNOTSUPPORTED:
301748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Winsock.dll version out of range";
302748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSANOTINITIALISED:
303748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Successful WSAStartup not yet performed";
304748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEDISCON:
305748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Graceful shutdown in progress";
306748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAENOMORE:
307748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No more results";
308748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAECANCELLED:
309748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Call has been canceled";
310748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINVALIDPROCTABLE:
311748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Procedure call table is invalid";
312748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEINVALIDPROVIDER:
313748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Service provider is invalid";
314748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEPROVIDERFAILEDINIT:
315748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Service provider failed to initialize";
316748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSASYSCALLFAILURE:
317748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "System call failure";
318748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSASERVICE_NOT_FOUND:
319748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Service not found";
320748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSATYPE_NOT_FOUND:
321748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Class type not found";
322748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_E_NO_MORE:
323748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No more results";
324748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_E_CANCELLED:
325748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Call was canceled";
326748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAEREFUSED:
327748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Database query was refused";
328748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSAHOST_NOT_FOUND:
329748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Host not found";
330748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSATRY_AGAIN:
331748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Nonauthoritative host not found";
332748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSANO_RECOVERY:
333748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "This is a nonrecoverable error";
334748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSANO_DATA:
335748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Valid name, no data record of requested type";
336748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_RECEIVERS:
337748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS receivers";
338748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_SENDERS:
339748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS senders";
340748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_NO_SENDERS:
341748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "No QoS senders";
342748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_NO_RECEIVERS:
343748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS no receivers";
344748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_REQUEST_CONFIRMED:
345748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS request confirmed";
346748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_ADMISSION_FAILURE:
347748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS admission error";
348748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_POLICY_FAILURE:
349748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS policy failure";
350748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_BAD_STYLE:
351748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS bad style";
352748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_BAD_OBJECT:
353748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS bad object";
354748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_TRAFFIC_CTRL_ERROR:
355748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS traffic control error";
356748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_GENERIC_ERROR:
357748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS generic error";
358748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_ESERVICETYPE:
359748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS service type error";
360748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EFLOWSPEC:
361748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "QoS flowspec error";
362748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EPROVSPECBUF:
363748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS provider buffer";
364748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EFILTERSTYLE:
365748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS filter style";
366748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EFILTERTYPE:
367748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS filter type";
368748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EFILTERCOUNT:
369748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Incorrect QoS filter count";
370748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EOBJLENGTH:
371748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS object length";
372748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EFLOWCOUNT:
373748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Incorrect QoS flow count";
374748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EUNKOWNPSOBJ:
375748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Unrecognized QoS object";
376748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EPOLICYOBJ:
377748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS policy object";
378748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EFLOWDESC:
379748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS flow descriptor";
380748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EPSFLOWSPEC:
381748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS provider-specific flowspec";
382748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_EPSFILTERSPEC:
383748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS provider-specific filterspec";
384748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_ESDMODEOBJ:
385748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS shape discard mode object";
386748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_ESHAPERATEOBJ:
387748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Invalid QoS shaping rate object";
388748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case WSA_QOS_RESERVED_PETYPE:
389748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return "Reserved policy QoS element type";
390748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
391748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return "Unknown winsock error";
392748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
393748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
394748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
395748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Set last winsock error to equivalent of given errno value
396748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param errnum the errno value to set
397748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
398748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid MHD_W32_set_last_winsock_error_(int errnum)
399748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
400748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  switch (errnum)
401748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
402748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case 0:
403748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(0);
404748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
405748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EBADF:
406748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSA_INVALID_HANDLE);
407748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
408748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOMEM:
409748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSA_NOT_ENOUGH_MEMORY);
410748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
411748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EINVAL:
412748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSA_INVALID_PARAMETER);
413748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
414748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EINTR:
415748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEINTR);
416748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
417748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EWOULDBLOCK:
418748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEWOULDBLOCK);
419748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
420748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EINPROGRESS:
421748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEINPROGRESS);
422748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
423748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EALREADY:
424748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEALREADY);
425748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
426748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOTSOCK:
427748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENOTSOCK);
428748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
429748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EDESTADDRREQ:
430748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEDESTADDRREQ);
431748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
432748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EMSGSIZE:
433748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEMSGSIZE);
434748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
435748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPROTOTYPE:
436748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEPROTOTYPE);
437748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
438748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOPROTOOPT:
439748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENOPROTOOPT);
440748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
441748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPROTONOSUPPORT:
442748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEPROTONOSUPPORT);
443748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
444748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ESOCKTNOSUPPORT:
445748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAESOCKTNOSUPPORT);
446748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
447748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EOPNOTSUPP:
448748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEOPNOTSUPP);
449748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
450748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPFNOSUPPORT:
451748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEPFNOSUPPORT);
452748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
453748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EAFNOSUPPORT:
454748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEAFNOSUPPORT);
455748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
456748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EADDRINUSE:
457748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEADDRINUSE);
458748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
459748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EADDRNOTAVAIL:
460748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEADDRNOTAVAIL);
461748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
462748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENETDOWN:
463748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENETDOWN);
464748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
465748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENETUNREACH:
466748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENETUNREACH);
467748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
468748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENETRESET:
469748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENETRESET);
470748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
471748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ECONNABORTED:
472748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAECONNABORTED);
473748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
474748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ECONNRESET:
475748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAECONNRESET);
476748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
477748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOBUFS:
478748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENOBUFS);
479748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
480748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EISCONN:
481748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEISCONN);
482748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
483748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOTCONN:
484748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENOTCONN);
485748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
486748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ESHUTDOWN:
487748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAESHUTDOWN);
488748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
489748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ETOOMANYREFS:
490748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAETOOMANYREFS);
491748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
492748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ETIMEDOUT:
493748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAETIMEDOUT);
494748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
495748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ECONNREFUSED:
496748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAECONNREFUSED);
497748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
498748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ELOOP:
499748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAELOOP);
500748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
501748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENAMETOOLONG:
502748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENAMETOOLONG);
503748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
504748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EHOSTDOWN:
505748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEHOSTDOWN);
506748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
507748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EHOSTUNREACH:
508748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEHOSTUNREACH);
509748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
510748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENOTEMPTY:
511748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENOTEMPTY);
512748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
513748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EPROCLIM:
514748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEPROCLIM);
515748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
516748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EUSERS:
517748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEUSERS);
518748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
519748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EDQUOT:
520748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEDQUOT);
521748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
522748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ESTALE:
523748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAESTALE);
524748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
525748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EREMOTE:
526748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEREMOTE);
527748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
528748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EFAULT:
529748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEFAULT);
530748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
531748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case ENODATA:
532748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSANO_DATA);
533748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
534748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#if EAGAIN != EWOULDBLOCK
535748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EAGAIN:
536748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEWOULDBLOCK);
537748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
538748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif
539748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  /* Rough equivalent */
540748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  case EIO:
541748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAEREFUSED);
542748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
543748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
544748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  default: /* Unmapped errors */
545748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    WSASetLastError(WSAENOBUFS);
546748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    break;
547748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
548748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
549748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
550748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
551748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Create pair of mutually connected TCP/IP sockets on loopback address
552748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param sockets_pair array to receive resulted sockets
553748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return zero on success, -1 otherwise
554748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
555748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2])
556748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
557748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int i;
558748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (!sockets_pair)
559748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
560748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      errno = EINVAL;
561748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return -1;
562748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
563748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
564748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define PAIRMAXTRYIES 800
565748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  for (i = 0; i < PAIRMAXTRYIES; i++)
566748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
567748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      struct sockaddr_in listen_addr;
568748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      SOCKET listen_s;
569748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      static const int c_addinlen = sizeof(struct sockaddr_in); /* help compiler to optimize */
570748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      int addr_len = c_addinlen;
571748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      int opt = 1;
572748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
573748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      listen_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
574748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (INVALID_SOCKET == listen_s)
575748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        break; /* can't create even single socket */
576748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
577748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      listen_addr.sin_family = AF_INET;
578748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      listen_addr.sin_port = htons(0);
579748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
580748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (0 == bind(listen_s, (struct sockaddr*) &listen_addr, c_addinlen)
581748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          && 0 == listen(listen_s, 1)
582748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          && 0 == getsockname(listen_s, (struct sockaddr*) &listen_addr,
583748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                  &addr_len))
584748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
585748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          SOCKET client_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
586748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          if (INVALID_SOCKET != client_s)
587748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            {
588748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              if (0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt)
589748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                  && (0 == connect(client_s, (struct sockaddr*) &listen_addr, c_addinlen)
590748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      || WSAGetLastError() == WSAEWOULDBLOCK))
591748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                {
592748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                  struct sockaddr_in accepted_from_addr;
593748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                  addr_len = c_addinlen;
594748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                  SOCKET server_s = accept(listen_s,
595748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      (struct sockaddr*) &accepted_from_addr, &addr_len);
596748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                  if (INVALID_SOCKET != server_s)
597748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                    {
598748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      struct sockaddr_in client_addr;
599748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      addr_len = c_addinlen;
600748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      opt = 0;
601748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      if (0 == getsockname(client_s, (struct sockaddr*) &client_addr, &addr_len)
602748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          && accepted_from_addr.sin_family == client_addr.sin_family
603748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          && accepted_from_addr.sin_port == client_addr.sin_port
604748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          && accepted_from_addr.sin_addr.s_addr == client_addr.sin_addr.s_addr
605748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          && 0 == ioctlsocket(client_s, FIONBIO, (u_long*) &opt)
606748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          && 0 == ioctlsocket(server_s, FIONBIO, (u_long*) &opt))
607748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        {
608748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          closesocket(listen_s);
609748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          sockets_pair[0] = client_s;
610748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          sockets_pair[1] = server_s;
611748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                          return 0;
612748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        }
613748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      closesocket(server_s);
614748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                    }
615748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                }
616748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              closesocket(client_s);
617748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            }
618748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
619748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      closesocket(listen_s);
620748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
621748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
622748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  sockets_pair[0] = INVALID_SOCKET;
623748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  sockets_pair[1] = INVALID_SOCKET;
624748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return -1;
625748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
626748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
627748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
628748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Static variable used by pseudo random number generator
629748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
630748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int32_t rnd_val = 0;
631748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
632748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Generate 31-bit pseudo random number.
633748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Function initialize itself at first call to current time.
634748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return 31-bit pseudo random number.
635748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
636748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint MHD_W32_random_(void)
637748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
638748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 == rnd_val)
639748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    rnd_val = (int32_t)time(NULL);
640748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  /* stolen from winsup\cygwin\random.cc */
641748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  rnd_val = (16807 * (rnd_val % 127773) - 2836 * (rnd_val / 127773))
642748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat               & 0x7fffffff;
643748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return (int)rnd_val;
644748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
645748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
646748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* Emulate snprintf function on W32 */
647748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint W32_snprintf(char *__restrict s, size_t n, const char *__restrict format, ...)
648748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
649748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int ret;
650748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  va_list args;
651748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 != n && NULL != s )
652748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  {
653748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    va_start(args, format);
654748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    ret = _vsnprintf(s, n, format, args);
655748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    va_end(args);
656748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    if (n == ret)
657748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      s[n - 1] = 0;
658748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    if (ret >= 0)
659748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return ret;
660748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  }
661748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  va_start(args, format);
662748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  ret = _vscprintf(format, args);
663748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  va_end(args);
664748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 <= ret && 0 != n && NULL == s)
665748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return -1;
666748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
667748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return ret;
668748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
669748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
670748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifdef _MSC_FULL_VER
671748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
672748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Set thread name
673748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param thread_id ID of thread, -1 for current thread
674748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param thread_name name to set
675748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
676748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid W32_SetThreadName(const DWORD thread_id, const char *thread_name)
677748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
678748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  static const DWORD VC_SETNAME_EXC = 0x406D1388;
679748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#pragma pack(push,8)
680748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct thread_info_struct
681748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  {
682748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    DWORD type;   // Must be 0x1000.
683748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    LPCSTR name;  // Pointer to name (in user address space).
684748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    DWORD ID;     // Thread ID (-1=caller thread).
685748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    DWORD flags;  // Reserved for future use, must be zero.
686748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  } thread_info;
687748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#pragma pack(pop)
688748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
689748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (NULL == thread_name)
690748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return;
691748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
692748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  thread_info.type  = 0x1000;
693748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  thread_info.name  = thread_name;
694748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  thread_info.ID    = thread_id;
695748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  thread_info.flags = 0;
696748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
697748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  __try
698748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  { /* This exception is intercepted by debugger */
699748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    RaiseException(VC_SETNAME_EXC, 0, sizeof(thread_info) / sizeof(ULONG_PTR), (ULONG_PTR*)&thread_info);
700748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  }
701748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  __except (EXCEPTION_EXECUTE_HANDLER)
702748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  {}
703748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
704748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif /* _MSC_FULL_VER */
705