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