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