1/*
2  This file is part of libmicrohttpd
3  Copyright (C) 2014 Karlson2k (Evgeny Grin)
4
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  Lesser General Public License for more details.
14
15  You should have received a copy of the GNU Lesser General Public
16  License along with this library.
17  If not, see <http://www.gnu.org/licenses/>.
18*/
19
20/**
21 * @file include/w32functions.h
22 * @brief  internal functions for W32 systems
23 * @author Karlson2k (Evgeny Grin)
24 */
25
26#ifndef MHD_W32FUNCTIONS_H
27#define MHD_W32FUNCTIONS_H
28#ifndef _WIN32
29#error w32functions.h is designed only for W32 systems
30#endif
31
32#include "platform.h"
33#include <errno.h>
34#include <winsock2.h>
35#include "platform_interface.h"
36
37#ifdef __cplusplus
38extern "C"
39{
40#endif
41
42#define MHDW32ERRBASE 3300
43
44#ifndef EWOULDBLOCK
45#define EWOULDBLOCK (MHDW32ERRBASE+1)
46#endif
47#ifndef EINPROGRESS
48#define EINPROGRESS (MHDW32ERRBASE+2)
49#endif
50#ifndef EALREADY
51#define EALREADY (MHDW32ERRBASE+3)
52#endif
53#ifndef ENOTSOCK
54#define ENOTSOCK (MHDW32ERRBASE+4)
55#endif
56#ifndef EDESTADDRREQ
57#define EDESTADDRREQ (MHDW32ERRBASE+5)
58#endif
59#ifndef EMSGSIZE
60#define EMSGSIZE (MHDW32ERRBASE+6)
61#endif
62#ifndef EPROTOTYPE
63#define EPROTOTYPE (MHDW32ERRBASE+7)
64#endif
65#ifndef ENOPROTOOPT
66#define ENOPROTOOPT (MHDW32ERRBASE+8)
67#endif
68#ifndef EPROTONOSUPPORT
69#define EPROTONOSUPPORT (MHDW32ERRBASE+9)
70#endif
71#ifndef EOPNOTSUPP
72#define EOPNOTSUPP (MHDW32ERRBASE+10)
73#endif
74#ifndef EAFNOSUPPORT
75#define EAFNOSUPPORT (MHDW32ERRBASE+11)
76#endif
77#ifndef EADDRINUSE
78#define EADDRINUSE (MHDW32ERRBASE+12)
79#endif
80#ifndef EADDRNOTAVAIL
81#define EADDRNOTAVAIL (MHDW32ERRBASE+13)
82#endif
83#ifndef ENETDOWN
84#define ENETDOWN (MHDW32ERRBASE+14)
85#endif
86#ifndef ENETUNREACH
87#define ENETUNREACH (MHDW32ERRBASE+15)
88#endif
89#ifndef ENETRESET
90#define ENETRESET (MHDW32ERRBASE+16)
91#endif
92#ifndef ECONNABORTED
93#define ECONNABORTED (MHDW32ERRBASE+17)
94#endif
95#ifndef ECONNRESET
96#define ECONNRESET (MHDW32ERRBASE+18)
97#endif
98#ifndef ENOBUFS
99#define ENOBUFS (MHDW32ERRBASE+19)
100#endif
101#ifndef EISCONN
102#define EISCONN (MHDW32ERRBASE+20)
103#endif
104#ifndef ENOTCONN
105#define ENOTCONN (MHDW32ERRBASE+21)
106#endif
107#ifndef ETOOMANYREFS
108#define ETOOMANYREFS (MHDW32ERRBASE+22)
109#endif
110#ifndef ECONNREFUSED
111#define ECONNREFUSED (MHDW32ERRBASE+23)
112#endif
113#ifndef ELOOP
114#define ELOOP (MHDW32ERRBASE+24)
115#endif
116#ifndef EHOSTDOWN
117#define EHOSTDOWN (MHDW32ERRBASE+25)
118#endif
119#ifndef EHOSTUNREACH
120#define EHOSTUNREACH (MHDW32ERRBASE+26)
121#endif
122#ifndef EPROCLIM
123#define EPROCLIM (MHDW32ERRBASE+27)
124#endif
125#ifndef EUSERS
126#define EUSERS (MHDW32ERRBASE+28)
127#endif
128#ifndef EDQUOT
129#define EDQUOT (MHDW32ERRBASE+29)
130#endif
131#ifndef ESTALE
132#define ESTALE (MHDW32ERRBASE+30)
133#endif
134#ifndef EREMOTE
135#define EREMOTE (MHDW32ERRBASE+31)
136#endif
137#ifndef ESOCKTNOSUPPORT
138#define ESOCKTNOSUPPORT (MHDW32ERRBASE+32)
139#endif
140#ifndef EPFNOSUPPORT
141#define EPFNOSUPPORT (MHDW32ERRBASE+33)
142#endif
143#ifndef ESHUTDOWN
144#define ESHUTDOWN (MHDW32ERRBASE+34)
145#endif
146#ifndef ENODATA
147#define ENODATA (MHDW32ERRBASE+35)
148#endif
149#ifndef ETIMEDOUT
150#define ETIMEDOUT (MHDW32ERRBASE+36)
151#endif
152
153/**
154 * Return errno equivalent of last winsock error
155 * @return errno equivalent of last winsock error
156 */
157int MHD_W32_errno_from_winsock_(void);
158
159/**
160 * Return pointer to string description of errnum error
161 * Works fine with both standard errno errnums
162 * and errnums from MHD_W32_errno_from_winsock_
163 * @param errnum the errno or value from MHD_W32_errno_from_winsock_()
164 * @return pointer to string description of error
165 */
166const char* MHD_W32_strerror_(int errnum);
167
168/**
169 * Return pointer to string description of last winsock error
170 * @return pointer to string description of last winsock error
171 */
172const char* MHD_W32_strerror_last_winsock_(void);
173
174/**
175 * Set last winsock error to equivalent of given errno value
176 * @param errnum the errno value to set
177 */
178void MHD_W32_set_last_winsock_error_(int errnum);
179
180/**
181 * Create pair of mutually connected TCP/IP sockets on loopback address
182 * @param sockets_pair array to receive resulted sockets
183 * @return zero on success, -1 otherwise
184 */
185int MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2]);
186
187/**
188 * Generate 31-bit pseudo random number.
189 * Function initialize itself at first call to current time.
190 * @return 31-bit pseudo random number.
191 */
192int MHD_W32_random_(void);
193
194/* Emulate snprintf function on W32 */
195int W32_snprintf(char *__restrict s, size_t n, const char *__restrict format, ...);
196
197#ifndef _MSC_FULL_VER
198/* Thread name available only for VC-compiler */
199static void W32_SetThreadName(const DWORD thread_id, const char *thread_name)
200{ }
201#else  /* _MSC_FULL_VER */
202/**
203 * Set thread name
204 * @param thread_id ID of thread, -1 for current thread
205 * @param thread_name name to set
206 */
207void W32_SetThreadName(const DWORD thread_id, const char *thread_name);
208#endif
209
210#ifdef __cplusplus
211}
212#endif
213#endif //MHD_W32FUNCTIONS_H
214