GNU libmicrohttpd  0.9.73
mhd_sockets.h
Go to the documentation of this file.
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 
33 #ifndef MHD_SOCKETS_H
34 #define MHD_SOCKETS_H 1
35 #include "mhd_options.h"
36 
37 #include <errno.h>
38 #include <stdbool.h>
39 #ifdef HAVE_UNISTD_H
40 #include <unistd.h>
41 #endif /* HAVE_UNISTD_H */
42 #include <fcntl.h>
43 
44 #if ! defined(MHD_POSIX_SOCKETS) && ! defined(MHD_WINSOCK_SOCKETS)
45 # if ! defined(_WIN32) || defined(__CYGWIN__)
46 # define MHD_POSIX_SOCKETS 1
47 # else /* defined(_WIN32) && !defined(__CYGWIN__) */
48 # define MHD_WINSOCK_SOCKETS 1
49 # endif /* defined(_WIN32) && !defined(__CYGWIN__) */
50 #endif /* !MHD_POSIX_SOCKETS && !MHD_WINSOCK_SOCKETS */
51 
52 /*
53  * MHD require headers that define socket type, socket basic functions
54  * (socket(), accept(), listen(), bind(), send(), recv(), select()), socket
55  * parameters like SOCK_CLOEXEC, SOCK_NONBLOCK, additional socket functions
56  * (poll(), epoll(), accept4()), struct timeval and other types, required
57  * for socket function.
58  */
59 #if defined(MHD_POSIX_SOCKETS)
60 # ifdef HAVE_SYS_TYPES_H
61 # include <sys/types.h> /* required on old platforms */
62 # endif
63 # ifdef HAVE_SYS_SOCKET_H
64 # include <sys/socket.h>
65 # endif
66 # if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS)
67 # ifdef HAVE_SOCKLIB_H
68 # include <sockLib.h>
69 # endif /* HAVE_SOCKLIB_H */
70 # ifdef HAVE_INETLIB_H
71 # include <inetLib.h>
72 # endif /* HAVE_INETLIB_H */
73 # include <strings.h> /* required for FD_SET (bzero() function) */
74 # endif /* __VXWORKS__ || __vxworks || OS_VXWORKS */
75 # ifdef HAVE_NETINET_IN_H
76 # include <netinet/in.h>
77 # endif /* HAVE_NETINET_IN_H */
78 # ifdef HAVE_ARPA_INET_H
79 # include <arpa/inet.h>
80 # endif
81 # ifdef HAVE_NET_IF_H
82 # include <net/if.h>
83 # endif
84 # ifdef HAVE_SYS_TIME_H
85 # include <sys/time.h>
86 # endif
87 # ifdef HAVE_TIME_H
88 # include <time.h>
89 # endif
90 # ifdef HAVE_NETDB_H
91 # include <netdb.h>
92 # endif
93 # ifdef HAVE_SYS_SELECT_H
94 # include <sys/select.h>
95 # endif
96 # ifdef EPOLL_SUPPORT
97 # include <sys/epoll.h>
98 # endif
99 # ifdef HAVE_NETINET_TCP_H
100 /* for TCP_FASTOPEN and TCP_CORK */
101 # include <netinet/tcp.h>
102 # endif
103 # ifdef HAVE_STRING_H
104 # include <string.h> /* for strerror() */
105 # endif
106 #elif defined(MHD_WINSOCK_SOCKETS)
107 # ifndef WIN32_LEAN_AND_MEAN
108 # define WIN32_LEAN_AND_MEAN 1
109 # endif /* !WIN32_LEAN_AND_MEAN */
110 # include <winsock2.h>
111 # include <ws2tcpip.h>
112 #endif /* MHD_WINSOCK_SOCKETS */
113 
114 #if defined(HAVE_POLL_H) && defined(HAVE_POLL)
115 # include <poll.h>
116 #endif
117 
118 #include <stddef.h>
119 #if defined(_MSC_FULL_VER) && ! defined (_SSIZE_T_DEFINED)
120 # include <stdint.h>
121 # define _SSIZE_T_DEFINED
122 typedef intptr_t ssize_t;
123 #endif /* !_SSIZE_T_DEFINED */
124 
125 #ifdef __FreeBSD__
126 #include <sys/param.h> /* For __FreeBSD_version */
127 #endif /* __FreeBSD__ */
128 
129 #include "mhd_limits.h"
130 
131 #ifdef _MHD_FD_SETSIZE_IS_DEFAULT
132 # define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE
133 #else /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
134 # include "sysfdsetsize.h"
135 # define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value ()
136 #endif /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
137 
138 #ifndef MHD_PANIC
139 # include <stdio.h>
140 # include <stdlib.h>
141 /* Simple implementation of MHD_PANIC, to be used outside lib */
142 # define MHD_PANIC(msg) do { fprintf (stderr, \
143  "Abnormal termination at %d line in file %s: %s\n", \
144  (int) __LINE__, __FILE__, msg); abort (); \
145 } while (0)
146 #endif /* ! MHD_PANIC */
147 
148 #ifndef MHD_SOCKET_DEFINED
152 # if defined(MHD_POSIX_SOCKETS)
153 typedef int MHD_socket;
154 # define MHD_INVALID_SOCKET (-1)
155 # elif defined(MHD_WINSOCK_SOCKETS)
156 typedef SOCKET MHD_socket;
157 # define MHD_INVALID_SOCKET (INVALID_SOCKET)
158 # endif /* MHD_WINSOCK_SOCKETS */
159 
160 # define MHD_SOCKET_DEFINED 1
161 #endif /* ! MHD_SOCKET_DEFINED */
162 
163 #ifdef SOCK_CLOEXEC
164 # define SOCK_CLOEXEC_OR_ZERO SOCK_CLOEXEC
165 #else /* ! SOCK_CLOEXEC */
166 # define SOCK_CLOEXEC_OR_ZERO 0
167 #endif /* ! SOCK_CLOEXEC */
168 
169 #ifdef HAVE_SOCK_NONBLOCK
170 # define SOCK_NONBLOCK_OR_ZERO SOCK_NONBLOCK
171 #else /* ! HAVE_SOCK_NONBLOCK */
172 # define SOCK_NONBLOCK_OR_ZERO 0
173 #endif /* ! HAVE_SOCK_NONBLOCK */
174 
175 #ifdef SOCK_NOSIGPIPE
176 # define SOCK_NOSIGPIPE_OR_ZERO SOCK_NOSIGPIPE
177 #else /* ! HAVE_SOCK_NONBLOCK */
178 # define SOCK_NOSIGPIPE_OR_ZERO 0
179 #endif /* ! HAVE_SOCK_NONBLOCK */
180 
181 #ifdef MSG_NOSIGNAL
182 # define MSG_NOSIGNAL_OR_ZERO MSG_NOSIGNAL
183 #else /* ! MSG_NOSIGNAL */
184 # define MSG_NOSIGNAL_OR_ZERO 0
185 #endif /* ! MSG_NOSIGNAL */
186 
187 #if ! defined(SHUT_WR) && defined(SD_SEND)
188 # define SHUT_WR SD_SEND
189 #endif
190 #if ! defined(SHUT_RD) && defined(SD_RECEIVE)
191 # define SHUT_RD SD_RECEIVE
192 #endif
193 #if ! defined(SHUT_RDWR) && defined(SD_BOTH)
194 # define SHUT_RDWR SD_BOTH
195 #endif
196 
197 #if HAVE_ACCEPT4 + 0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || \
198  defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE))
199 # define USE_ACCEPT4 1
200 #endif
201 
202 #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
203 # define USE_EPOLL_CREATE1 1
204 #endif /* HAVE_EPOLL_CREATE1 && EPOLL_CLOEXEC */
205 
206 #ifdef TCP_FASTOPEN
210 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
211 #endif
212 
213 
214 #if defined(TCP_CORK)
218 #define MHD_TCP_CORK_NOPUSH TCP_CORK
219 #elif defined(TCP_NOPUSH)
223 #define MHD_TCP_CORK_NOPUSH TCP_NOPUSH
224 #endif /* TCP_NOPUSH */
225 
226 
227 #ifdef MHD_TCP_CORK_NOPUSH
228 #ifdef __linux__
232 #define _MHD_CORK_RESET_PUSH_DATA 1
237 #define _MHD_CORK_RESET_PUSH_DATA_ALWAYS 1
238 #endif /* __linux__ */
239 #if defined(__FreeBSD__) && \
240  ((__FreeBSD__ + 0) >= 5 || (__FreeBSD_version + 0) >= 450000)
241 /* FreeBSD pushes data to the network with reset of TCP_NOPUSH
242  * starting from version 4.5. */
246 #define _MHD_CORK_RESET_PUSH_DATA 1
247 #endif /* __FreeBSD_version >= 450000 */
248 #ifdef __OpenBSD__
249 /* OpenBSD took implementation from FreeBSD */
253 #define _MHD_CORK_RESET_PUSH_DATA 1
254 #endif /* __OpenBSD__ */
255 #endif /* MHD_TCP_CORK_NOPUSH */
256 
257 #ifdef __linux__
261 #define _MHD_NODELAY_SET_PUSH_DATA 1
266 #define _MHD_NODELAY_SET_PUSH_DATA_ALWAYS 1
267 #endif /* __linux__ */
268 
269 #ifdef MSG_MORE
270 #ifdef __linux__
271 /* MSG_MORE signal kernel to buffer outbond data and works like
272  * TCP_CORK per call without actually setting TCP_CORK value.
273  * It's known to work on Linux. Add more OSes if they are compatible. */
277 #define MHD_USE_MSG_MORE 1
278 #endif /* __linux__ */
279 #endif /* MSG_MORE */
280 
281 
285 #ifdef MHD_POSIX_SOCKETS
286 typedef int MHD_SCKT_OPT_BOOL_;
287 #else /* MHD_WINSOCK_SOCKETS */
288 typedef BOOL MHD_SCKT_OPT_BOOL_;
289 #endif /* MHD_WINSOCK_SOCKETS */
290 
295 #if ! defined(MHD_WINSOCK_SOCKETS)
296 typedef size_t MHD_SCKT_SEND_SIZE_;
297 #else
298 typedef int MHD_SCKT_SEND_SIZE_;
299 #endif
300 
304 #if ! defined(MHD_WINSOCK_SOCKETS)
305 # define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
306 #else
307 # define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
308 #endif
309 
320 #if ! defined(MHD_WINSOCK_SOCKETS)
321 # define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno))
322 #else
323 # define MHD_socket_close_(fd) (0 == closesocket ((fd)))
324 #endif
325 
331 #define MHD_socket_close_chk_(fd) do { \
332  if (! MHD_socket_close_ (fd)) \
333  MHD_PANIC (_ ("Close socket failed.\n")); \
334 } while (0)
335 
336 
345 #define MHD_send4_(s,b,l,f) \
346  ((ssize_t) send ((s),(const void*) (b),(MHD_SCKT_SEND_SIZE_) (l), \
347  ((MSG_NOSIGNAL_OR_ZERO) | (f))))
348 
349 
357 #define MHD_send_(s,b,l) MHD_send4_((s),(b),(l), 0)
358 
359 
367 #define MHD_recv_(s,b,l) \
368  ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0))
369 
370 
380 #if defined(MHD_POSIX_SOCKETS)
381 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ((fd) < \
382  ((MHD_socket) \
383  setsize))
384 #elif defined(MHD_WINSOCK_SOCKETS)
385 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ( ((void*) (pset)== \
386  (void*) 0) || \
387  (((fd_set*) (pset)) \
388  ->fd_count < \
389  ((unsigned) \
390  setsize)) || \
391  (FD_ISSET ((fd), \
392  (pset))) )
393 #endif
394 
403 #define MHD_SCKT_FD_FITS_FDSET_(fd,pset) MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), \
404  (pset), \
405  FD_SETSIZE)
406 
415 #if defined(MHD_POSIX_SOCKETS)
416 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) FD_SET ((fd), \
417  (pset))
418 #elif defined(MHD_WINSOCK_SOCKETS)
419 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
420  do { \
421  u_int _i_ = 0; \
422  fd_set*const _s_ = (fd_set*) (pset); \
423  while ((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array [_i_])) {++_i_;} \
424  if ((_i_ == _s_->fd_count)) {_s_->fd_array [_s_->fd_count ++] = (fd);} \
425  } while (0)
426 #endif
427 
428 /* MHD_SYS_select_ is wrapper macro for system select() function */
429 #if ! defined(MHD_WINSOCK_SOCKETS)
430 # define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t))
431 #else
432 # define MHD_SYS_select_(n,r,w,e,t) \
433  ( ( (((void*) (r) == (void*) 0) || ((fd_set*) (r))->fd_count == 0) && \
434  (((void*) (w) == (void*) 0) || ((fd_set*) (w))->fd_count == 0) && \
435  (((void*) (e) == (void*) 0) || ((fd_set*) (e))->fd_count == 0) ) ? \
436  ( ((void*) (t) == (void*) 0) ? 0 : \
437  (Sleep (((struct timeval*) (t))->tv_sec * 1000 \
438  + ((struct timeval*) (t))->tv_usec / 1000), 0) ) : \
439  (select ((int) 0,(r),(w),(e),(t))) )
440 #endif
441 
442 #if defined(HAVE_POLL)
443 /* MHD_sys_poll_ is wrapper macro for system poll() function */
444 # if ! defined(MHD_WINSOCK_SOCKETS)
445 # define MHD_sys_poll_ poll
446 # else /* MHD_WINSOCK_SOCKETS */
447 # define MHD_sys_poll_ WSAPoll
448 # endif /* MHD_WINSOCK_SOCKETS */
449 
450 # ifdef POLLPRI
451 # define MHD_POLLPRI_OR_ZERO POLLPRI
452 # else /* ! POLLPRI */
453 # define MHD_POLLPRI_OR_ZERO 0
454 # endif /* ! POLLPRI */
455 # ifdef POLLRDBAND
456 # define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
457 # else /* ! POLLRDBAND */
458 # define MHD_POLLRDBAND_OR_ZERO 0
459 # endif /* ! POLLRDBAND */
460 # ifdef POLLNVAL
461 # define MHD_POLLNVAL_OR_ZERO POLLNVAL
462 # else /* ! POLLNVAL */
463 # define MHD_POLLNVAL_OR_ZERO 0
464 # endif /* ! POLLNVAL */
465 
466 /* MHD_POLL_EVENTS_ERR_DISC is 'events' mask for errors and disconnect.
467  * Note: Out-of-band data is treated as error. */
468 # if defined(_WIN32) && ! defined(__CYGWIN__)
469 # define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND
470 # elif defined(__linux__)
471 # define MHD_POLL_EVENTS_ERR_DISC POLLPRI
472 # else /* ! __linux__ */
473 # define MHD_POLL_EVENTS_ERR_DISC (MHD_POLLPRI_OR_ZERO \
474  | MHD_POLLRDBAND_OR_ZERO)
475 # endif /* ! __linux__ */
476 /* MHD_POLL_REVENTS_ERR_DISC is 'revents' mask for errors and disconnect.
477  * Note: Out-of-band data is treated as error. */
478 # define MHD_POLL_REVENTS_ERR_DISC \
479  (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
480  | POLLERR | POLLHUP)
481 /* MHD_POLL_REVENTS_ERRROR is 'revents' mask for errors.
482  * Note: Out-of-band data is treated as error. */
483 # define MHD_POLL_REVENTS_ERRROR \
484  (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
485  | POLLERR)
486 #endif /* HAVE_POLL */
487 
488 #define MHD_SCKT_MISSING_ERR_CODE_ 31450
489 
490 #if defined(MHD_POSIX_SOCKETS)
491 # if defined(EAGAIN)
492 # define MHD_SCKT_EAGAIN_ EAGAIN
493 # elif defined(EWOULDBLOCK)
494 # define MHD_SCKT_EAGAIN_ EWOULDBLOCK
495 # else /* !EAGAIN && !EWOULDBLOCK */
496 # define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
497 # endif /* !EAGAIN && !EWOULDBLOCK */
498 # if defined(EWOULDBLOCK)
499 # define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
500 # elif defined(EAGAIN)
501 # define MHD_SCKT_EWOULDBLOCK_ EAGAIN
502 # else /* !EWOULDBLOCK && !EAGAIN */
503 # define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
504 # endif /* !EWOULDBLOCK && !EAGAIN */
505 # ifdef EINTR
506 # define MHD_SCKT_EINTR_ EINTR
507 # else /* ! EINTR */
508 # define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
509 # endif /* ! EINTR */
510 # ifdef ECONNRESET
511 # define MHD_SCKT_ECONNRESET_ ECONNRESET
512 # else /* ! ECONNRESET */
513 # define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
514 # endif /* ! ECONNRESET */
515 # ifdef ECONNABORTED
516 # define MHD_SCKT_ECONNABORTED_ ECONNABORTED
517 # else /* ! ECONNABORTED */
518 # define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
519 # endif /* ! ECONNABORTED */
520 # ifdef ENOTCONN
521 # define MHD_SCKT_ENOTCONN_ ENOTCONN
522 # else /* ! ENOTCONN */
523 # define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
524 # endif /* ! ENOTCONN */
525 # ifdef EMFILE
526 # define MHD_SCKT_EMFILE_ EMFILE
527 # else /* ! EMFILE */
528 # define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
529 # endif /* ! EMFILE */
530 # ifdef ENFILE
531 # define MHD_SCKT_ENFILE_ ENFILE
532 # else /* ! ENFILE */
533 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
534 # endif /* ! ENFILE */
535 # ifdef ENOMEM
536 # define MHD_SCKT_ENOMEM_ ENOMEM
537 # else /* ! ENOMEM */
538 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
539 # endif /* ! ENOMEM */
540 # ifdef ENOBUFS
541 # define MHD_SCKT_ENOBUFS_ ENOBUFS
542 # else /* ! ENOBUFS */
543 # define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
544 # endif /* ! ENOBUFS */
545 # ifdef EBADF
546 # define MHD_SCKT_EBADF_ EBADF
547 # else /* ! EBADF */
548 # define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
549 # endif /* ! EBADF */
550 # ifdef ENOTSOCK
551 # define MHD_SCKT_ENOTSOCK_ ENOTSOCK
552 # else /* ! ENOTSOCK */
553 # define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
554 # endif /* ! ENOTSOCK */
555 # ifdef EINVAL
556 # define MHD_SCKT_EINVAL_ EINVAL
557 # else /* ! EINVAL */
558 # define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
559 # endif /* ! EINVAL */
560 # ifdef EPIPE
561 # define MHD_SCKT_EPIPE_ EPIPE
562 # else /* ! EPIPE */
563 # define MHD_SCKT_EPIPE_ MHD_SCKT_MISSING_ERR_CODE_
564 # endif /* ! EPIPE */
565 # ifdef EFAULT
566 # define MHD_SCKT_EFAUL_ EFAULT
567 # else /* ! EFAULT */
568 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
569 # endif /* ! EFAULT */
570 # ifdef ENOSYS
571 # define MHD_SCKT_ENOSYS_ ENOSYS
572 # else /* ! ENOSYS */
573 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
574 # endif /* ! ENOSYS */
575 # ifdef ENOPROTOOPT
576 # define MHD_SCKT_ENOPROTOOPT_ ENOPROTOOPT
577 # else /* ! ENOPROTOOPT */
578 # define MHD_SCKT_ENOPROTOOPT_ MHD_SCKT_MISSING_ERR_CODE_
579 # endif /* ! ENOPROTOOPT */
580 # ifdef ENOTSUP
581 # define MHD_SCKT_ENOTSUP_ ENOTSUP
582 # else /* ! ENOTSUP */
583 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
584 # endif /* ! ENOTSUP */
585 # ifdef EOPNOTSUPP
586 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
587 # else /* ! EOPNOTSUPP */
588 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
589 # endif /* ! EOPNOTSUPP */
590 # ifdef EACCES
591 # define MHD_SCKT_EACCESS_ EACCES
592 # else /* ! EACCES */
593 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
594 # endif /* ! EACCES */
595 # ifdef ENETDOWN
596 # define MHD_SCKT_ENETDOWN_ ENETDOWN
597 # else /* ! ENETDOWN */
598 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
599 # endif /* ! ENETDOWN */
600 #elif defined(MHD_WINSOCK_SOCKETS)
601 # define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
602 # define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
603 # define MHD_SCKT_EINTR_ WSAEINTR
604 # define MHD_SCKT_ECONNRESET_ WSAECONNRESET
605 # define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
606 # define MHD_SCKT_ENOTCONN_ WSAENOTCONN
607 # define MHD_SCKT_EMFILE_ WSAEMFILE
608 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
609 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
610 # define MHD_SCKT_ENOBUFS_ WSAENOBUFS
611 # define MHD_SCKT_EBADF_ WSAEBADF
612 # define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
613 # define MHD_SCKT_EINVAL_ WSAEINVAL
614 # define MHD_SCKT_EPIPE_ WSAESHUTDOWN
615 # define MHD_SCKT_EFAUL_ WSAEFAULT
616 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
617 # define MHD_SCKT_ENOPROTOOPT_ WSAENOPROTOOPT
618 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
619 # define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
620 # define MHD_SCKT_EACCESS_ WSAEACCES
621 # define MHD_SCKT_ENETDOWN_ WSAENETDOWN
622 #endif
623 
628 #if defined(MHD_POSIX_SOCKETS)
629 # define MHD_socket_get_error_() (errno)
630 #elif defined(MHD_WINSOCK_SOCKETS)
631 # define MHD_socket_get_error_() WSAGetLastError ()
632 #endif
633 
634 #ifdef MHD_WINSOCK_SOCKETS
635 /* POSIX-W32 sockets compatibility functions */
636 
642 const char*MHD_W32_strerror_winsock_ (int err);
643 
644 #endif /* MHD_WINSOCK_SOCKETS */
645 
646 /* MHD_socket_last_strerr_ is description string of specified socket error code */
647 #if defined(MHD_POSIX_SOCKETS)
648 # define MHD_socket_strerr_(err) strerror ((err))
649 #elif defined(MHD_WINSOCK_SOCKETS)
650 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err))
651 #endif
652 
653 /* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
654  * description string of last socket error (W32) */
655 #define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
656 
660 #if defined(MHD_POSIX_SOCKETS)
661 # define MHD_socket_fset_error_(err) (errno = (err))
662 #elif defined(MHD_WINSOCK_SOCKETS)
663 # define MHD_socket_fset_error_(err) (WSASetLastError ((err)))
664 #endif
665 
674 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
675  (MHD_socket_fset_error_ ((err)), ! 0) : \
676  0)
677 
683 #if defined(MHD_POSIX_SOCKETS)
684 # if defined(ENOSYS)
685 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
686  (errno = ENOSYS) : (errno = (err)) )
687 # elif defined(EOPNOTSUPP)
688 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
689  (errno = EOPNOTSUPP) : (errno = \
690  (err)) )
691 # elif defined (EFAULT)
692 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
693  (errno = EFAULT) : (errno = (err)) )
694 # elif defined (EINVAL)
695 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
696  (errno = EINVAL) : (errno = (err)) )
697 # else /* !EOPNOTSUPP && !EFAULT && !EINVAL */
698 # warning \
699  No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
700 # define MHD_socket_set_error_(err) (errno = (err))
701 # endif /* !EOPNOTSUPP && !EFAULT && !EINVAL*/
702 #elif defined(MHD_WINSOCK_SOCKETS)
703 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
704  (WSASetLastError ((WSAEOPNOTSUPP))) : \
705  (WSASetLastError ((err))) )
706 #endif
707 
717 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \
718  ((code) == (err)) )
719 
729 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), \
730  (code))
731 
732 /* Specific error code checks */
733 
740 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
741 
748 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
749 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
750 #else /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
751 # define MHD_SCKT_ERR_IS_EAGAIN_(err) (MHD_SCKT_ERR_IS_ ((err), \
752  MHD_SCKT_EAGAIN_) || \
753  MHD_SCKT_ERR_IS_ ((err), \
754  MHD_SCKT_EWOULDBLOCK_) )
755 #endif /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
756 
762 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) (MHD_SCKT_ERR_IS_ ((err), \
763  MHD_SCKT_EMFILE_) \
764  || \
765  MHD_SCKT_ERR_IS_ ((err), \
766  MHD_SCKT_ENFILE_) \
767  || \
768  MHD_SCKT_ERR_IS_ ((err), \
769  MHD_SCKT_ENOMEM_) \
770  || \
771  MHD_SCKT_ERR_IS_ ((err), \
772  MHD_SCKT_ENOBUFS_) )
773 
780 #if defined(MHD_POSIX_SOCKETS)
781 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
782  MHD_SCKT_ECONNABORTED_)
783 #elif defined(MHD_WINSOCK_SOCKETS)
784 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
785  MHD_SCKT_ECONNRESET_)
786 #endif
787 
794 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) (MHD_SCKT_ERR_IS_ ((err), \
795  MHD_SCKT_ECONNRESET_) \
796  || \
797  MHD_SCKT_ERR_IS_ ((err), \
798  MHD_SCKT_ECONNABORTED_))
799 
800 /* Specific error code set */
801 
806 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
807 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
808  MHD_SCKT_ENOMEM_)
809 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
810 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
811  MHD_SCKT_ENOBUFS_)
812 #else
813 # warning \
814  No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
815 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
816  MHD_SCKT_ENOMEM_)
817 #endif
818 
819 /* Socket functions */
820 
821 #if defined(AF_LOCAL)
822 # define MHD_SCKT_LOCAL AF_LOCAL
823 #elif defined(AF_UNIX)
824 # define MHD_SCKT_LOCAL AF_UNIX
825 #endif /* AF_UNIX */
826 
827 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
828 # define MHD_socket_pair_(fdarr) (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, \
829  (fdarr)))
830 # if defined(HAVE_SOCK_NONBLOCK)
831 # define MHD_socket_pair_nblk_(fdarr) (! socketpair (MHD_SCKT_LOCAL, \
832  SOCK_STREAM \
833  | SOCK_NONBLOCK, 0, \
834  (fdarr)))
835 # endif /* HAVE_SOCK_NONBLOCK*/
836 #elif defined(MHD_WINSOCK_SOCKETS)
844 int MHD_W32_socket_pair_ (SOCKET sockets_pair[2], int non_blk);
845 
846 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0)
847 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1)
848 #endif
849 
860 int
862  fd_set *set,
863  MHD_socket *max_fd,
864  unsigned int fd_setsize);
865 
866 
873 int
875 
876 
886 int
888  bool on);
889 
897 int
899 
900 
901 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
902 static const int _MHD_socket_int_one = 1;
909 #define MHD_socket_nosignal_(sock) \
910  (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \
911  sizeof(_MHD_socket_int_one)))
912 #endif /* SOL_SOCKET && SO_NOSIGPIPE */
913 
914 
915 #if defined(MHD_socket_nosignal_) || defined(MSG_NOSIGNAL)
922 #define MHD_SEND_SPIPE_SUPPRESS_POSSIBLE 1
923 #endif /* MHD_WINSOCK_SOCKETS || MHD_socket_nosignal_ || MSG_NOSIGNAL */
924 
925 #if ! defined(MHD_WINSOCK_SOCKETS)
929 #define MHD_SEND_SPIPE_SUPPRESS_NEEDED 1
930 #endif
931 
940 
941 
942 #endif /* ! MHD_SOCKETS_H */
int MHD_socket
Definition: mhd_sockets.h:144
int MHD_SCKT_OPT_BOOL_
Definition: mhd_sockets.h:203
size_t MHD_SCKT_SEND_SIZE_
Definition: mhd_sockets.h:213
int MHD_add_to_fd_set_(MHD_socket fd, fd_set *set, MHD_socket *max_fd, unsigned int fd_setsize)
Definition: mhd_sockets.c:377
int MHD_socket_noninheritable_(MHD_socket sock)
Definition: mhd_sockets.c:442
int MHD_socket_nonblocking_(MHD_socket sock)
Definition: mhd_sockets.c:407
MHD_socket MHD_socket_create_listen_(int pf)
Definition: mhd_sockets.c:474
additional automatic macros for MHD_config.h
limits values definitions
int MHD_socket_set_nodelay_(MHD_socket sock, bool on)
Definition: mhd_sockets.c:471
Helper for obtaining FD_SETSIZE system default value.
int MHD_socket
Definition: microhttpd.h:193
int fd
Definition: microhttpd.h:3269