GNU libmicrohttpd  0.9.72
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 EFAULT
561 # define MHD_SCKT_EFAUL_ EFAULT
562 # else /* ! EFAULT */
563 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
564 # endif /* ! EFAULT */
565 # ifdef ENOSYS
566 # define MHD_SCKT_ENOSYS_ ENOSYS
567 # else /* ! ENOSYS */
568 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
569 # endif /* ! ENOSYS */
570 # ifdef ENOTSUP
571 # define MHD_SCKT_ENOTSUP_ ENOTSUP
572 # else /* ! ENOTSUP */
573 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
574 # endif /* ! ENOTSUP */
575 # ifdef EOPNOTSUPP
576 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
577 # else /* ! EOPNOTSUPP */
578 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
579 # endif /* ! EOPNOTSUPP */
580 # ifdef EACCES
581 # define MHD_SCKT_EACCESS_ EACCES
582 # else /* ! EACCES */
583 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
584 # endif /* ! EACCES */
585 # ifdef ENETDOWN
586 # define MHD_SCKT_ENETDOWN_ ENETDOWN
587 # else /* ! ENETDOWN */
588 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
589 # endif /* ! ENETDOWN */
590 #elif defined(MHD_WINSOCK_SOCKETS)
591 # define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
592 # define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
593 # define MHD_SCKT_EINTR_ WSAEINTR
594 # define MHD_SCKT_ECONNRESET_ WSAECONNRESET
595 # define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
596 # define MHD_SCKT_ENOTCONN_ WSAENOTCONN
597 # define MHD_SCKT_EMFILE_ WSAEMFILE
598 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
599 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
600 # define MHD_SCKT_ENOBUFS_ WSAENOBUFS
601 # define MHD_SCKT_EBADF_ WSAEBADF
602 # define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
603 # define MHD_SCKT_EINVAL_ WSAEINVAL
604 # define MHD_SCKT_EFAUL_ WSAEFAULT
605 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
606 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
607 # define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
608 # define MHD_SCKT_EACCESS_ WSAEACCES
609 # define MHD_SCKT_ENETDOWN_ WSAENETDOWN
610 #endif
611 
616 #if defined(MHD_POSIX_SOCKETS)
617 # define MHD_socket_get_error_() (errno)
618 #elif defined(MHD_WINSOCK_SOCKETS)
619 # define MHD_socket_get_error_() WSAGetLastError ()
620 #endif
621 
622 #ifdef MHD_WINSOCK_SOCKETS
623 /* POSIX-W32 sockets compatibility functions */
624 
630 const char*MHD_W32_strerror_winsock_ (int err);
631 
632 #endif /* MHD_WINSOCK_SOCKETS */
633 
634 /* MHD_socket_last_strerr_ is description string of specified socket error code */
635 #if defined(MHD_POSIX_SOCKETS)
636 # define MHD_socket_strerr_(err) strerror ((err))
637 #elif defined(MHD_WINSOCK_SOCKETS)
638 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err))
639 #endif
640 
641 /* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
642  * description string of last socket error (W32) */
643 #define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
644 
648 #if defined(MHD_POSIX_SOCKETS)
649 # define MHD_socket_fset_error_(err) (errno = (err))
650 #elif defined(MHD_WINSOCK_SOCKETS)
651 # define MHD_socket_fset_error_(err) (WSASetLastError ((err)))
652 #endif
653 
662 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
663  (MHD_socket_fset_error_ ((err)), ! 0) : \
664  0)
665 
671 #if defined(MHD_POSIX_SOCKETS)
672 # if defined(ENOSYS)
673 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
674  (errno = ENOSYS) : (errno = (err)) )
675 # elif defined(EOPNOTSUPP)
676 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
677  (errno = EOPNOTSUPP) : (errno = \
678  (err)) )
679 # elif defined (EFAULT)
680 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
681  (errno = EFAULT) : (errno = (err)) )
682 # elif defined (EINVAL)
683 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
684  (errno = EINVAL) : (errno = (err)) )
685 # else /* !EOPNOTSUPP && !EFAULT && !EINVAL */
686 # warning \
687  No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
688 # define MHD_socket_set_error_(err) (errno = (err))
689 # endif /* !EOPNOTSUPP && !EFAULT && !EINVAL*/
690 #elif defined(MHD_WINSOCK_SOCKETS)
691 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
692  (WSASetLastError ((WSAEOPNOTSUPP))) : \
693  (WSASetLastError ((err))) )
694 #endif
695 
705 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \
706  ((code) == (err)) )
707 
717 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), \
718  (code))
719 
720 /* Specific error code checks */
721 
728 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
729 
736 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
737 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
738 #else /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
739 # define MHD_SCKT_ERR_IS_EAGAIN_(err) (MHD_SCKT_ERR_IS_ ((err), \
740  MHD_SCKT_EAGAIN_) || \
741  MHD_SCKT_ERR_IS_ ((err), \
742  MHD_SCKT_EWOULDBLOCK_) )
743 #endif /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
744 
750 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) (MHD_SCKT_ERR_IS_ ((err), \
751  MHD_SCKT_EMFILE_) \
752  || \
753  MHD_SCKT_ERR_IS_ ((err), \
754  MHD_SCKT_ENFILE_) \
755  || \
756  MHD_SCKT_ERR_IS_ ((err), \
757  MHD_SCKT_ENOMEM_) \
758  || \
759  MHD_SCKT_ERR_IS_ ((err), \
760  MHD_SCKT_ENOBUFS_) )
761 
768 #if defined(MHD_POSIX_SOCKETS)
769 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
770  MHD_SCKT_ECONNABORTED_)
771 #elif defined(MHD_WINSOCK_SOCKETS)
772 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
773  MHD_SCKT_ECONNRESET_)
774 #endif
775 
782 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) (MHD_SCKT_ERR_IS_ ((err), \
783  MHD_SCKT_ECONNRESET_) \
784  || \
785  MHD_SCKT_ERR_IS_ ((err), \
786  MHD_SCKT_ECONNABORTED_))
787 
788 /* Specific error code set */
789 
794 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
795 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
796  MHD_SCKT_ENOMEM_)
797 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
798 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
799  MHD_SCKT_ENOBUFS_)
800 #else
801 # warning \
802  No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
803 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
804  MHD_SCKT_ENOMEM_)
805 #endif
806 
807 /* Socket functions */
808 
809 #if defined(AF_LOCAL)
810 # define MHD_SCKT_LOCAL AF_LOCAL
811 #elif defined(AF_UNIX)
812 # define MHD_SCKT_LOCAL AF_UNIX
813 #endif /* AF_UNIX */
814 
815 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
816 # define MHD_socket_pair_(fdarr) (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, \
817  (fdarr)))
818 # if defined(HAVE_SOCK_NONBLOCK)
819 # define MHD_socket_pair_nblk_(fdarr) (! socketpair (MHD_SCKT_LOCAL, \
820  SOCK_STREAM \
821  | SOCK_NONBLOCK, 0, \
822  (fdarr)))
823 # endif /* HAVE_SOCK_NONBLOCK*/
824 #elif defined(MHD_WINSOCK_SOCKETS)
832 int MHD_W32_socket_pair_ (SOCKET sockets_pair[2], int non_blk);
833 
834 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0)
835 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1)
836 #endif
837 
848 int
850  fd_set *set,
851  MHD_socket *max_fd,
852  unsigned int fd_setsize);
853 
854 
861 int
863 
864 
874 int
876  bool on);
877 
885 int
887 
888 
908 int
910  bool on);
911 
912 
919 int
921 
922 
923 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
924 static const int _MHD_socket_int_one = 1;
931 #define MHD_socket_nosignal_(sock) \
932  (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \
933  sizeof(_MHD_socket_int_one)))
934 #endif /* SOL_SOCKET && SO_NOSIGPIPE */
935 
936 
937 #if defined(MHD_WINSOCK_SOCKETS) || defined(MHD_socket_nosignal_) || \
938  defined(MSG_NOSIGNAL)
945 #define HAVE_SEND_SIGPIPE_SUPPRESS 1
946 #endif /* MHD_WINSOCK_SOCKETS || MHD_socket_nosignal_ || MSG_NOSIGNAL */
947 
948 
957 
958 
959 #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_cork_(MHD_socket sock, bool on)
Definition: mhd_sockets.c:500
int MHD_socket_buffering_reset_(MHD_socket sock)
Definition: mhd_sockets.c:552
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:196
int fd
Definition: microhttpd.h:3195