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 include/w32functions.h 22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief internal functions for W32 systems 23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Karlson2k (Evgeny Grin) 24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef MHD_W32FUNCTIONS_H 27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define MHD_W32FUNCTIONS_H 28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef _WIN32 29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#error w32functions.h is designed only for W32 systems 30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform.h" 33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <errno.h> 34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <winsock2.h> 35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform_interface.h" 36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifdef __cplusplus 38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratextern "C" 39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ 40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define MHDW32ERRBASE 3300 43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EWOULDBLOCK 45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EWOULDBLOCK (MHDW32ERRBASE+1) 46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EINPROGRESS 48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EINPROGRESS (MHDW32ERRBASE+2) 49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EALREADY 51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EALREADY (MHDW32ERRBASE+3) 52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENOTSOCK 54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENOTSOCK (MHDW32ERRBASE+4) 55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EDESTADDRREQ 57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EDESTADDRREQ (MHDW32ERRBASE+5) 58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EMSGSIZE 60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EMSGSIZE (MHDW32ERRBASE+6) 61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EPROTOTYPE 63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EPROTOTYPE (MHDW32ERRBASE+7) 64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENOPROTOOPT 66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENOPROTOOPT (MHDW32ERRBASE+8) 67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EPROTONOSUPPORT 69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EPROTONOSUPPORT (MHDW32ERRBASE+9) 70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EOPNOTSUPP 72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EOPNOTSUPP (MHDW32ERRBASE+10) 73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EAFNOSUPPORT 75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EAFNOSUPPORT (MHDW32ERRBASE+11) 76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EADDRINUSE 78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EADDRINUSE (MHDW32ERRBASE+12) 79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EADDRNOTAVAIL 81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EADDRNOTAVAIL (MHDW32ERRBASE+13) 82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENETDOWN 84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENETDOWN (MHDW32ERRBASE+14) 85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENETUNREACH 87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENETUNREACH (MHDW32ERRBASE+15) 88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENETRESET 90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENETRESET (MHDW32ERRBASE+16) 91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ECONNABORTED 93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ECONNABORTED (MHDW32ERRBASE+17) 94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ECONNRESET 96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ECONNRESET (MHDW32ERRBASE+18) 97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENOBUFS 99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENOBUFS (MHDW32ERRBASE+19) 100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EISCONN 102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EISCONN (MHDW32ERRBASE+20) 103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENOTCONN 105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENOTCONN (MHDW32ERRBASE+21) 106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ETOOMANYREFS 108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ETOOMANYREFS (MHDW32ERRBASE+22) 109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ECONNREFUSED 111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ECONNREFUSED (MHDW32ERRBASE+23) 112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ELOOP 114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ELOOP (MHDW32ERRBASE+24) 115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EHOSTDOWN 117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EHOSTDOWN (MHDW32ERRBASE+25) 118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EHOSTUNREACH 120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EHOSTUNREACH (MHDW32ERRBASE+26) 121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EPROCLIM 123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EPROCLIM (MHDW32ERRBASE+27) 124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EUSERS 126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EUSERS (MHDW32ERRBASE+28) 127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EDQUOT 129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EDQUOT (MHDW32ERRBASE+29) 130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ESTALE 132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ESTALE (MHDW32ERRBASE+30) 133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EREMOTE 135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EREMOTE (MHDW32ERRBASE+31) 136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ESOCKTNOSUPPORT 138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ESOCKTNOSUPPORT (MHDW32ERRBASE+32) 139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef EPFNOSUPPORT 141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define EPFNOSUPPORT (MHDW32ERRBASE+33) 142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ESHUTDOWN 144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ESHUTDOWN (MHDW32ERRBASE+34) 145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ENODATA 147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ENODATA (MHDW32ERRBASE+35) 148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef ETIMEDOUT 150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define ETIMEDOUT (MHDW32ERRBASE+36) 151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Return errno equivalent of last winsock error 155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return errno equivalent of last winsock error 156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint MHD_W32_errno_from_winsock_(void); 158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 159748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 160748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Return pointer to string description of errnum error 161748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Works fine with both standard errno errnums 162748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * and errnums from MHD_W32_errno_from_winsock_ 163748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param errnum the errno or value from MHD_W32_errno_from_winsock_() 164748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return pointer to string description of error 165748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 166748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char* MHD_W32_strerror_(int errnum); 167748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 168748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 169748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Return pointer to string description of last winsock error 170748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return pointer to string description of last winsock error 171748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 172748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char* MHD_W32_strerror_last_winsock_(void); 173748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 174748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 175748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Set last winsock error to equivalent of given errno value 176748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param errnum the errno value to set 177748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 178748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid MHD_W32_set_last_winsock_error_(int errnum); 179748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 180748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 181748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Create pair of mutually connected TCP/IP sockets on loopback address 182748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param sockets_pair array to receive resulted sockets 183748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return zero on success, -1 otherwise 184748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 185748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2]); 186748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 187748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 188748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Generate 31-bit pseudo random number. 189748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Function initialize itself at first call to current time. 190748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @return 31-bit pseudo random number. 191748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 192748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint MHD_W32_random_(void); 193748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 194748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* Emulate snprintf function on W32 */ 195748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint W32_snprintf(char *__restrict s, size_t n, const char *__restrict format, ...); 196748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 197748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef _MSC_FULL_VER 198748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* Thread name available only for VC-compiler */ 199748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic void W32_SetThreadName(const DWORD thread_id, const char *thread_name) 200748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{ } 201748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#else /* _MSC_FULL_VER */ 202748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/** 203748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Set thread name 204748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param thread_id ID of thread, -1 for current thread 205748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @param thread_name name to set 206748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */ 207748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratvoid W32_SetThreadName(const DWORD thread_id, const char *thread_name); 208748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 209748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat 210748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifdef __cplusplus 211748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat} 212748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif 213748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif //MHD_W32FUNCTIONS_H 214