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
38 extern "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 */
157 int 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 */
166 const 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 */
172 const 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 */
178 void 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 */
185 int 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 */
192 int MHD_W32_random_(void);
193
194 /* Emulate snprintf function on W32 */
195 int 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 */
W32_SetThreadName(const DWORD thread_id,const char * thread_name)199 static 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 */
207 void 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