aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/mhd_sockets.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/mhd_sockets.c')
-rw-r--r--src/microhttpd/mhd_sockets.c545
1 files changed, 545 insertions, 0 deletions
diff --git a/src/microhttpd/mhd_sockets.c b/src/microhttpd/mhd_sockets.c
new file mode 100644
index 00000000..4214108e
--- /dev/null
+++ b/src/microhttpd/mhd_sockets.c
@@ -0,0 +1,545 @@
1/*
2 This file is part of libmicrohttpd
3 Copyright (C) 2014-2016 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; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
19*/
20
21/**
22 * @file microhttpd/mhd_sockets.c
23 * @brief Implementation for sockets functions
24 * @author Karlson2k (Evgeny Grin)
25 */
26
27#include "mhd_sockets.h"
28
29#ifdef MHD_WINSOCK_SOCKETS
30
31/**
32 * Return errno equivalent of last winsock error
33 * @return errno equivalent of last winsock error
34 */
35int MHD_W32_errno_from_winsock_(void)
36{
37 switch(WSAGetLastError())
38 {
39 case 0: return 0;
40 case WSA_INVALID_HANDLE: return EBADF;
41 case WSA_NOT_ENOUGH_MEMORY: return ENOMEM;
42 case WSA_INVALID_PARAMETER: return EINVAL;
43 case WSAEINTR: return EINTR;
44 case WSAEWOULDBLOCK: return EWOULDBLOCK;
45 case WSAEINPROGRESS: return EINPROGRESS;
46 case WSAEALREADY: return EALREADY;
47 case WSAENOTSOCK: return ENOTSOCK;
48 case WSAEDESTADDRREQ: return EDESTADDRREQ;
49 case WSAEMSGSIZE: return EMSGSIZE;
50 case WSAEPROTOTYPE: return EPROTOTYPE;
51 case WSAENOPROTOOPT: return ENOPROTOOPT;
52 case WSAEPROTONOSUPPORT: return EPROTONOSUPPORT;
53 case WSAESOCKTNOSUPPORT: return ESOCKTNOSUPPORT;
54 case WSAEOPNOTSUPP: return EOPNOTSUPP;
55 case WSAEPFNOSUPPORT: return EPFNOSUPPORT;
56 case WSAEAFNOSUPPORT: return EAFNOSUPPORT;
57 case WSAEADDRINUSE: return EADDRINUSE;
58 case WSAEADDRNOTAVAIL: return EADDRNOTAVAIL;
59 case WSAENETDOWN: return ENETDOWN;
60 case WSAENETUNREACH: return ENETUNREACH;
61 case WSAENETRESET: return ENETRESET;
62 case WSAECONNABORTED: return ECONNABORTED;
63 case WSAECONNRESET: return ECONNRESET;
64 case WSAENOBUFS: return ENOBUFS;
65 case WSAEISCONN: return EISCONN;
66 case WSAENOTCONN: return ENOTCONN;
67 case WSAESHUTDOWN: return ESHUTDOWN;
68 case WSAETOOMANYREFS: return ETOOMANYREFS;
69 case WSAETIMEDOUT: return ETIMEDOUT;
70 case WSAECONNREFUSED: return ECONNREFUSED;
71 case WSAELOOP: return ELOOP;
72 case WSAENAMETOOLONG: return ENAMETOOLONG;
73 case WSAEHOSTDOWN: return EHOSTDOWN;
74 case WSAEHOSTUNREACH: return EHOSTUNREACH;
75 case WSAENOTEMPTY: return ENOTEMPTY;
76 case WSAEPROCLIM: return EPROCLIM;
77 case WSAEUSERS: return EUSERS;
78 case WSAEDQUOT: return EDQUOT;
79 case WSAESTALE: return ESTALE;
80 case WSAEREMOTE: return EREMOTE;
81 case WSAEINVAL: return EINVAL;
82 case WSAEFAULT: return EFAULT;
83 case WSANO_DATA: return ENODATA;
84 /* Rough equivalents */
85 case WSAEDISCON: return ECONNRESET;
86 case WSAEINVALIDPROCTABLE: return EFAULT;
87 case WSASYSNOTREADY:
88 case WSANOTINITIALISED:
89 case WSASYSCALLFAILURE: return ENOBUFS;
90 case WSAVERNOTSUPPORTED: return EOPNOTSUPP;
91 case WSAEREFUSED: return EIO;
92 }
93 return EINVAL;
94}
95
96/**
97 * Return pointer to string description of errnum error
98 * Works fine with both standard errno errnums
99 * and errnums from MHD_W32_errno_from_winsock_
100 * @param errnum the errno or value from MHD_W32_errno_from_winsock_()
101 * @return pointer to string description of error
102 */
103const char* MHD_W32_strerror_(int errnum)
104{
105 switch(errnum)
106 {
107 case 0:
108 return "No error";
109 case EWOULDBLOCK:
110 return "Operation would block";
111 case EINPROGRESS:
112 return "Connection already in progress";
113 case EALREADY:
114 return "Socket already connected";
115 case ENOTSOCK:
116 return "Socket operation on non-socket";
117 case EDESTADDRREQ:
118 return "Destination address required";
119 case EMSGSIZE:
120 return "Message too long";
121 case EPROTOTYPE:
122 return "Protocol wrong type for socket";
123 case ENOPROTOOPT:
124 return "Protocol not available";
125 case EPROTONOSUPPORT:
126 return "Unknown protocol";
127 case ESOCKTNOSUPPORT:
128 return "Socket type not supported";
129 case EOPNOTSUPP:
130 return "Operation not supported on socket";
131 case EPFNOSUPPORT:
132 return "Protocol family not supported";
133 case EAFNOSUPPORT:
134 return "Address family not supported by protocol family";
135 case EADDRINUSE:
136 return "Address already in use";
137 case EADDRNOTAVAIL:
138 return "Cannot assign requested address";
139 case ENETDOWN:
140 return "Network is down";
141 case ENETUNREACH:
142 return "Network is unreachable";
143 case ENETRESET:
144 return "Network dropped connection on reset";
145 case ECONNABORTED:
146 return "Software caused connection abort";
147 case ECONNRESET:
148 return "Connection reset by peer";
149 case ENOBUFS:
150 return "No system resources available";
151 case EISCONN:
152 return "Socket is already connected";
153 case ENOTCONN:
154 return "Socket is not connected";
155 case ESHUTDOWN:
156 return "Can't send after socket shutdown";
157 case ETOOMANYREFS:
158 return "Too many references: cannot splice";
159 case ETIMEDOUT:
160 return "Connection timed out";
161 case ECONNREFUSED:
162 return "Connection refused";
163 case ELOOP:
164 return "Cannot translate name";
165 case EHOSTDOWN:
166 return "Host is down";
167 case EHOSTUNREACH:
168 return "Host is unreachable";
169 case EPROCLIM:
170 return "Too many processes";
171 case EUSERS:
172 return "Too many users";
173 case EDQUOT:
174 return "Disk quota exceeded";
175 case ESTALE:
176 return "Stale file handle reference";
177 case EREMOTE:
178 return "Resource is remote";
179 case ENODATA:
180 return "No data available";
181 }
182 return strerror(errnum);
183}
184
185/**
186 * Return pointer to string description of last winsock error
187 * @return pointer to string description of last winsock error
188 */
189const char* MHD_W32_strerror_last_winsock_(void)
190{
191 switch (WSAGetLastError())
192 {
193 case 0:
194 return "No error";
195 case WSA_INVALID_HANDLE:
196 return "Specified event object handle is invalid";
197 case WSA_NOT_ENOUGH_MEMORY:
198 return "Insufficient memory available";
199 case WSA_INVALID_PARAMETER:
200 return "One or more parameters are invalid";
201 case WSA_OPERATION_ABORTED:
202 return "Overlapped operation aborted";
203 case WSA_IO_INCOMPLETE:
204 return "Overlapped I/O event object not in signaled state";
205 case WSA_IO_PENDING:
206 return "Overlapped operations will complete later";
207 case WSAEINTR:
208 return "Interrupted function call";
209 case WSAEBADF:
210 return "File handle is not valid";
211 case WSAEACCES:
212 return "Permission denied";
213 case WSAEFAULT:
214 return "Bad address";
215 case WSAEINVAL:
216 return "Invalid argument";
217 case WSAEMFILE:
218 return "Too many open files";
219 case WSAEWOULDBLOCK:
220 return "Resource temporarily unavailable";
221 case WSAEINPROGRESS:
222 return "Operation now in progress";
223 case WSAEALREADY:
224 return "Operation already in progress";
225 case WSAENOTSOCK:
226 return "Socket operation on nonsocket";
227 case WSAEDESTADDRREQ:
228 return "Destination address required";
229 case WSAEMSGSIZE:
230 return "Message too long";
231 case WSAEPROTOTYPE:
232 return "Protocol wrong type for socket";
233 case WSAENOPROTOOPT:
234 return "Bad protocol option";
235 case WSAEPROTONOSUPPORT:
236 return "Protocol not supported";
237 case WSAESOCKTNOSUPPORT:
238 return "Socket type not supported";
239 case WSAEOPNOTSUPP:
240 return "Operation not supported";
241 case WSAEPFNOSUPPORT:
242 return "Protocol family not supported";
243 case WSAEAFNOSUPPORT:
244 return "Address family not supported by protocol family";
245 case WSAEADDRINUSE:
246 return "Address already in use";
247 case WSAEADDRNOTAVAIL:
248 return "Cannot assign requested address";
249 case WSAENETDOWN:
250 return "Network is down";
251 case WSAENETUNREACH:
252 return "Network is unreachable";
253 case WSAENETRESET:
254 return "Network dropped connection on reset";
255 case WSAECONNABORTED:
256 return "Software caused connection abort";
257 case WSAECONNRESET:
258 return "Connection reset by peer";
259 case WSAENOBUFS:
260 return "No buffer space available";
261 case WSAEISCONN:
262 return "Socket is already connected";
263 case WSAENOTCONN:
264 return "Socket is not connected";
265 case WSAESHUTDOWN:
266 return "Cannot send after socket shutdown";
267 case WSAETOOMANYREFS:
268 return "Too many references";
269 case WSAETIMEDOUT:
270 return "Connection timed out";
271 case WSAECONNREFUSED:
272 return "Connection refused";
273 case WSAELOOP:
274 return "Cannot translate name";
275 case WSAENAMETOOLONG:
276 return "Name too long";
277 case WSAEHOSTDOWN:
278 return "Host is down";
279 case WSAEHOSTUNREACH:
280 return "No route to host";
281 case WSAENOTEMPTY:
282 return "Directory not empty";
283 case WSAEPROCLIM:
284 return "Too many processes";
285 case WSAEUSERS:
286 return "User quota exceeded";
287 case WSAEDQUOT:
288 return "Disk quota exceeded";
289 case WSAESTALE:
290 return "Stale file handle reference";
291 case WSAEREMOTE:
292 return "Item is remote";
293 case WSASYSNOTREADY:
294 return "Network subsystem is unavailable";
295 case WSAVERNOTSUPPORTED:
296 return "Winsock.dll version out of range";
297 case WSANOTINITIALISED:
298 return "Successful WSAStartup not yet performed";
299 case WSAEDISCON:
300 return "Graceful shutdown in progress";
301 case WSAENOMORE:
302 return "No more results";
303 case WSAECANCELLED:
304 return "Call has been canceled";
305 case WSAEINVALIDPROCTABLE:
306 return "Procedure call table is invalid";
307 case WSAEINVALIDPROVIDER:
308 return "Service provider is invalid";
309 case WSAEPROVIDERFAILEDINIT:
310 return "Service provider failed to initialize";
311 case WSASYSCALLFAILURE:
312 return "System call failure";
313 case WSASERVICE_NOT_FOUND:
314 return "Service not found";
315 case WSATYPE_NOT_FOUND:
316 return "Class type not found";
317 case WSA_E_NO_MORE:
318 return "No more results";
319 case WSA_E_CANCELLED:
320 return "Call was canceled";
321 case WSAEREFUSED:
322 return "Database query was refused";
323 case WSAHOST_NOT_FOUND:
324 return "Host not found";
325 case WSATRY_AGAIN:
326 return "Nonauthoritative host not found";
327 case WSANO_RECOVERY:
328 return "This is a nonrecoverable error";
329 case WSANO_DATA:
330 return "Valid name, no data record of requested type";
331 case WSA_QOS_RECEIVERS:
332 return "QoS receivers";
333 case WSA_QOS_SENDERS:
334 return "QoS senders";
335 case WSA_QOS_NO_SENDERS:
336 return "No QoS senders";
337 case WSA_QOS_NO_RECEIVERS:
338 return "QoS no receivers";
339 case WSA_QOS_REQUEST_CONFIRMED:
340 return "QoS request confirmed";
341 case WSA_QOS_ADMISSION_FAILURE:
342 return "QoS admission error";
343 case WSA_QOS_POLICY_FAILURE:
344 return "QoS policy failure";
345 case WSA_QOS_BAD_STYLE:
346 return "QoS bad style";
347 case WSA_QOS_BAD_OBJECT:
348 return "QoS bad object";
349 case WSA_QOS_TRAFFIC_CTRL_ERROR:
350 return "QoS traffic control error";
351 case WSA_QOS_GENERIC_ERROR:
352 return "QoS generic error";
353 case WSA_QOS_ESERVICETYPE:
354 return "QoS service type error";
355 case WSA_QOS_EFLOWSPEC:
356 return "QoS flowspec error";
357 case WSA_QOS_EPROVSPECBUF:
358 return "Invalid QoS provider buffer";
359 case WSA_QOS_EFILTERSTYLE:
360 return "Invalid QoS filter style";
361 case WSA_QOS_EFILTERTYPE:
362 return "Invalid QoS filter type";
363 case WSA_QOS_EFILTERCOUNT:
364 return "Incorrect QoS filter count";
365 case WSA_QOS_EOBJLENGTH:
366 return "Invalid QoS object length";
367 case WSA_QOS_EFLOWCOUNT:
368 return "Incorrect QoS flow count";
369 case WSA_QOS_EUNKOWNPSOBJ:
370 return "Unrecognized QoS object";
371 case WSA_QOS_EPOLICYOBJ:
372 return "Invalid QoS policy object";
373 case WSA_QOS_EFLOWDESC:
374 return "Invalid QoS flow descriptor";
375 case WSA_QOS_EPSFLOWSPEC:
376 return "Invalid QoS provider-specific flowspec";
377 case WSA_QOS_EPSFILTERSPEC:
378 return "Invalid QoS provider-specific filterspec";
379 case WSA_QOS_ESDMODEOBJ:
380 return "Invalid QoS shape discard mode object";
381 case WSA_QOS_ESHAPERATEOBJ:
382 return "Invalid QoS shaping rate object";
383 case WSA_QOS_RESERVED_PETYPE:
384 return "Reserved policy QoS element type";
385 }
386 return "Unknown winsock error";
387}
388
389/**
390 * Set last winsock error to equivalent of given errno value
391 * @param errnum the errno value to set
392 */
393void MHD_W32_set_last_winsock_error_(int errnum)
394{
395 switch (errnum)
396 {
397 case 0:
398 WSASetLastError(0);
399 break;
400 case EBADF:
401 WSASetLastError(WSA_INVALID_HANDLE);
402 break;
403 case ENOMEM:
404 WSASetLastError(WSA_NOT_ENOUGH_MEMORY);
405 break;
406 case EINVAL:
407 WSASetLastError(WSA_INVALID_PARAMETER);
408 break;
409 case EINTR:
410 WSASetLastError(WSAEINTR);
411 break;
412 case EWOULDBLOCK:
413 WSASetLastError(WSAEWOULDBLOCK);
414 break;
415 case EINPROGRESS:
416 WSASetLastError(WSAEINPROGRESS);
417 break;
418 case EALREADY:
419 WSASetLastError(WSAEALREADY);
420 break;
421 case ENOTSOCK:
422 WSASetLastError(WSAENOTSOCK);
423 break;
424 case EDESTADDRREQ:
425 WSASetLastError(WSAEDESTADDRREQ);
426 break;
427 case EMSGSIZE:
428 WSASetLastError(WSAEMSGSIZE);
429 break;
430 case EPROTOTYPE:
431 WSASetLastError(WSAEPROTOTYPE);
432 break;
433 case ENOPROTOOPT:
434 WSASetLastError(WSAENOPROTOOPT);
435 break;
436 case EPROTONOSUPPORT:
437 WSASetLastError(WSAEPROTONOSUPPORT);
438 break;
439 case ESOCKTNOSUPPORT:
440 WSASetLastError(WSAESOCKTNOSUPPORT);
441 break;
442 case EOPNOTSUPP:
443 WSASetLastError(WSAEOPNOTSUPP);
444 break;
445 case EPFNOSUPPORT:
446 WSASetLastError(WSAEPFNOSUPPORT);
447 break;
448 case EAFNOSUPPORT:
449 WSASetLastError(WSAEAFNOSUPPORT);
450 break;
451 case EADDRINUSE:
452 WSASetLastError(WSAEADDRINUSE);
453 break;
454 case EADDRNOTAVAIL:
455 WSASetLastError(WSAEADDRNOTAVAIL);
456 break;
457 case ENETDOWN:
458 WSASetLastError(WSAENETDOWN);
459 break;
460 case ENETUNREACH:
461 WSASetLastError(WSAENETUNREACH);
462 break;
463 case ENETRESET:
464 WSASetLastError(WSAENETRESET);
465 break;
466 case ECONNABORTED:
467 WSASetLastError(WSAECONNABORTED);
468 break;
469 case ECONNRESET:
470 WSASetLastError(WSAECONNRESET);
471 break;
472 case ENOBUFS:
473 WSASetLastError(WSAENOBUFS);
474 break;
475 case EISCONN:
476 WSASetLastError(WSAEISCONN);
477 break;
478 case ENOTCONN:
479 WSASetLastError(WSAENOTCONN);
480 break;
481 case ESHUTDOWN:
482 WSASetLastError(WSAESHUTDOWN);
483 break;
484 case ETOOMANYREFS:
485 WSASetLastError(WSAETOOMANYREFS);
486 break;
487 case ETIMEDOUT:
488 WSASetLastError(WSAETIMEDOUT);
489 break;
490 case ECONNREFUSED:
491 WSASetLastError(WSAECONNREFUSED);
492 break;
493 case ELOOP:
494 WSASetLastError(WSAELOOP);
495 break;
496 case ENAMETOOLONG:
497 WSASetLastError(WSAENAMETOOLONG);
498 break;
499 case EHOSTDOWN:
500 WSASetLastError(WSAEHOSTDOWN);
501 break;
502 case EHOSTUNREACH:
503 WSASetLastError(WSAEHOSTUNREACH);
504 break;
505 case ENOTEMPTY:
506 WSASetLastError(WSAENOTEMPTY);
507 break;
508 case EPROCLIM:
509 WSASetLastError(WSAEPROCLIM);
510 break;
511 case EUSERS:
512 WSASetLastError(WSAEUSERS);
513 break;
514 case EDQUOT:
515 WSASetLastError(WSAEDQUOT);
516 break;
517 case ESTALE:
518 WSASetLastError(WSAESTALE);
519 break;
520 case EREMOTE:
521 WSASetLastError(WSAEREMOTE);
522 break;
523 case EFAULT:
524 WSASetLastError(WSAEFAULT);
525 break;
526 case ENODATA:
527 WSASetLastError(WSANO_DATA);
528 break;
529#if EAGAIN != EWOULDBLOCK
530 case EAGAIN:
531 WSASetLastError(WSAEWOULDBLOCK);
532 break;
533#endif
534 /* Rough equivalent */
535 case EIO:
536 WSASetLastError(WSAEREFUSED);
537 break;
538
539 default: /* Unmapped errors */
540 WSASetLastError(WSAENOBUFS);
541 break;
542 }
543}
544
545#endif /* MHD_WINSOCK_SOCKETS */