GNU libmicrohttpd  0.9.76
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 #ifdef HAVE_STDBOOL_H
39 #include <stdbool.h>
40 #endif /* HAVE_STDBOOL_H */
41 #ifdef HAVE_UNISTD_H
42 #include <unistd.h>
43 #endif /* HAVE_UNISTD_H */
44 #include <fcntl.h>
45 #ifdef HAVE_STDDEF_H
46 #include <stddef.h>
47 #endif /* HAVE_STDDEF_H */
48 #if defined(_MSC_FULL_VER) && ! defined (_SSIZE_T_DEFINED)
49 # include <stdint.h>
50 # define _SSIZE_T_DEFINED
51 typedef intptr_t ssize_t;
52 #endif /* !_SSIZE_T_DEFINED */
53 
54 #if ! defined(MHD_POSIX_SOCKETS) && ! defined(MHD_WINSOCK_SOCKETS)
55 # if ! defined(_WIN32) || defined(__CYGWIN__)
56 # define MHD_POSIX_SOCKETS 1
57 # else /* defined(_WIN32) && !defined(__CYGWIN__) */
58 # define MHD_WINSOCK_SOCKETS 1
59 # endif /* defined(_WIN32) && !defined(__CYGWIN__) */
60 #endif /* !MHD_POSIX_SOCKETS && !MHD_WINSOCK_SOCKETS */
61 
62 /*
63  * MHD require headers that define socket type, socket basic functions
64  * (socket(), accept(), listen(), bind(), send(), recv(), select()), socket
65  * parameters like SOCK_CLOEXEC, SOCK_NONBLOCK, additional socket functions
66  * (poll(), epoll(), accept4()), struct timeval and other types, required
67  * for socket function.
68  */
69 #if defined(MHD_POSIX_SOCKETS)
70 # ifdef HAVE_SYS_TYPES_H
71 # include <sys/types.h> /* required on old platforms */
72 # endif
73 # ifdef HAVE_SYS_TIME_H
74 # include <sys/time.h>
75 # endif
76 # ifdef HAVE_TIME_H
77 # include <time.h>
78 # endif
79 # ifdef HAVE_STRING_H
80 # include <string.h> /* for strerror() */
81 # endif
82 # ifdef HAVE_SYS_SOCKET_H
83 # include <sys/socket.h>
84 # endif
85 # if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS)
86 # include <strings.h> /* required for FD_SET (bzero() function) */
87 # ifdef HAVE_SOCKLIB_H
88 # include <sockLib.h>
89 # endif /* HAVE_SOCKLIB_H */
90 # ifdef HAVE_INETLIB_H
91 # include <inetLib.h>
92 # endif /* HAVE_INETLIB_H */
93 # endif /* __VXWORKS__ || __vxworks || OS_VXWORKS */
94 # ifdef HAVE_NETINET_IN_H
95 # include <netinet/in.h>
96 # endif /* HAVE_NETINET_IN_H */
97 # ifdef HAVE_ARPA_INET_H
98 # include <arpa/inet.h>
99 # endif
100 # ifdef HAVE_NET_IF_H
101 # include <net/if.h>
102 # endif
103 # ifdef HAVE_NETDB_H
104 # include <netdb.h>
105 # endif
106 # ifdef HAVE_SYS_SELECT_H
107 # include <sys/select.h>
108 # endif
109 # ifdef EPOLL_SUPPORT
110 # include <sys/epoll.h>
111 # endif
112 # ifdef HAVE_NETINET_TCP_H
113 /* for TCP_FASTOPEN and TCP_CORK */
114 # include <netinet/tcp.h>
115 # endif
116 #elif defined(MHD_WINSOCK_SOCKETS)
117 # ifndef WIN32_LEAN_AND_MEAN
118 # define WIN32_LEAN_AND_MEAN 1
119 # endif /* !WIN32_LEAN_AND_MEAN */
120 # include <winsock2.h>
121 # include <ws2tcpip.h>
122 #endif /* MHD_WINSOCK_SOCKETS */
123 
124 #if defined(HAVE_POLL_H) && defined(HAVE_POLL)
125 # include <poll.h>
126 #endif
127 
128 
129 #ifdef __FreeBSD__
130 #include <sys/param.h> /* For __FreeBSD_version */
131 #endif /* __FreeBSD__ */
132 
133 #include "mhd_limits.h"
134 
135 #ifdef _MHD_FD_SETSIZE_IS_DEFAULT
136 # define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE
137 #else /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
138 # include "sysfdsetsize.h"
139 # define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value ()
140 #endif /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
141 
142 #ifndef MHD_PANIC
143 # include <stdio.h>
144 # include <stdlib.h>
145 /* Simple implementation of MHD_PANIC, to be used outside lib */
146 # define MHD_PANIC(msg) \
147  do { fprintf (stderr, \
148  "Abnormal termination at %d line in file %s: %s\n", \
149  (int) __LINE__, __FILE__, msg); abort (); \
150 } while (0)
151 #endif /* ! MHD_PANIC */
152 
153 #ifndef MHD_SOCKET_DEFINED
157 # if defined(MHD_POSIX_SOCKETS)
158 typedef int MHD_socket;
159 # define MHD_INVALID_SOCKET (-1)
160 # elif defined(MHD_WINSOCK_SOCKETS)
161 typedef SOCKET MHD_socket;
162 # define MHD_INVALID_SOCKET (INVALID_SOCKET)
163 # endif /* MHD_WINSOCK_SOCKETS */
164 
165 # define MHD_SOCKET_DEFINED 1
166 #endif /* ! MHD_SOCKET_DEFINED */
167 
168 #ifdef SOCK_CLOEXEC
169 # define SOCK_CLOEXEC_OR_ZERO SOCK_CLOEXEC
170 #else /* ! SOCK_CLOEXEC */
171 # define SOCK_CLOEXEC_OR_ZERO 0
172 #endif /* ! SOCK_CLOEXEC */
173 
174 #ifdef HAVE_SOCK_NONBLOCK
175 # define SOCK_NONBLOCK_OR_ZERO SOCK_NONBLOCK
176 #else /* ! HAVE_SOCK_NONBLOCK */
177 # define SOCK_NONBLOCK_OR_ZERO 0
178 #endif /* ! HAVE_SOCK_NONBLOCK */
179 
180 #ifdef SOCK_NOSIGPIPE
181 # define SOCK_NOSIGPIPE_OR_ZERO SOCK_NOSIGPIPE
182 #else /* ! HAVE_SOCK_NONBLOCK */
183 # define SOCK_NOSIGPIPE_OR_ZERO 0
184 #endif /* ! HAVE_SOCK_NONBLOCK */
185 
186 #ifdef MSG_NOSIGNAL
187 # define MSG_NOSIGNAL_OR_ZERO MSG_NOSIGNAL
188 #else /* ! MSG_NOSIGNAL */
189 # define MSG_NOSIGNAL_OR_ZERO 0
190 #endif /* ! MSG_NOSIGNAL */
191 
192 #if ! defined(SHUT_WR) && defined(SD_SEND)
193 # define SHUT_WR SD_SEND
194 #endif
195 #if ! defined(SHUT_RD) && defined(SD_RECEIVE)
196 # define SHUT_RD SD_RECEIVE
197 #endif
198 #if ! defined(SHUT_RDWR) && defined(SD_BOTH)
199 # define SHUT_RDWR SD_BOTH
200 #endif
201 
202 #if HAVE_ACCEPT4 + 0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || \
203  defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE))
204 # define USE_ACCEPT4 1
205 #endif
206 
207 #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \
208  defined(MHD_WINSOCK_SOCKETS) || defined(__MACH__) || defined(__sun) || \
209  defined(SOMEBSD)
210 /* Most of OSes inherit nonblocking setting from the listen socket */
211 #define MHD_ACCEPT_INHERIT_NONBLOCK 1
212 #endif
213 
214 #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
215 # define USE_EPOLL_CREATE1 1
216 #endif /* HAVE_EPOLL_CREATE1 && EPOLL_CLOEXEC */
217 
218 #ifdef TCP_FASTOPEN
222 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
223 #endif
224 
225 
226 #if defined(TCP_CORK)
230 #define MHD_TCP_CORK_NOPUSH TCP_CORK
231 #elif defined(TCP_NOPUSH)
235 #define MHD_TCP_CORK_NOPUSH TCP_NOPUSH
236 #endif /* TCP_NOPUSH */
237 
238 
239 #ifdef MHD_TCP_CORK_NOPUSH
240 #ifdef __linux__
244 #define _MHD_CORK_RESET_PUSH_DATA 1
249 #define _MHD_CORK_RESET_PUSH_DATA_ALWAYS 1
250 #endif /* __linux__ */
251 #if defined(__FreeBSD__) && \
252  ((__FreeBSD__ + 0) >= 5 || (__FreeBSD_version + 0) >= 450000)
253 /* FreeBSD pushes data to the network with reset of TCP_NOPUSH
254  * starting from version 4.5. */
258 #define _MHD_CORK_RESET_PUSH_DATA 1
259 #endif /* __FreeBSD_version >= 450000 */
260 #ifdef __OpenBSD__
261 /* OpenBSD took implementation from FreeBSD */
265 #define _MHD_CORK_RESET_PUSH_DATA 1
266 #endif /* __OpenBSD__ */
267 #endif /* MHD_TCP_CORK_NOPUSH */
268 
269 #ifdef __linux__
273 #define _MHD_NODELAY_SET_PUSH_DATA 1
278 #define _MHD_NODELAY_SET_PUSH_DATA_ALWAYS 1
279 #endif /* __linux__ */
280 
281 #ifdef MSG_MORE
282 #ifdef __linux__
283 /* MSG_MORE signal kernel to buffer outbond data and works like
284  * TCP_CORK per call without actually setting TCP_CORK value.
285  * It's known to work on Linux. Add more OSes if they are compatible. */
289 #define MHD_USE_MSG_MORE 1
290 #endif /* __linux__ */
291 #endif /* MSG_MORE */
292 
293 
297 #ifdef MHD_POSIX_SOCKETS
298 typedef int MHD_SCKT_OPT_BOOL_;
299 #else /* MHD_WINSOCK_SOCKETS */
300 typedef BOOL MHD_SCKT_OPT_BOOL_;
301 #endif /* MHD_WINSOCK_SOCKETS */
302 
307 #if ! defined(MHD_WINSOCK_SOCKETS)
308 typedef size_t MHD_SCKT_SEND_SIZE_;
309 #else
310 typedef int MHD_SCKT_SEND_SIZE_;
311 #endif
312 
316 #if ! defined(MHD_WINSOCK_SOCKETS)
317 # define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
318 #else
319 # define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
320 #endif
321 
332 #if ! defined(MHD_WINSOCK_SOCKETS)
333 # define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno))
334 #else
335 # define MHD_socket_close_(fd) (0 == closesocket ((fd)))
336 #endif
337 
343 #define MHD_socket_close_chk_(fd) do { \
344  if (! MHD_socket_close_ (fd)) \
345  MHD_PANIC (_ ("Close socket failed.\n")); \
346 } while (0)
347 
348 
357 #define MHD_send4_(s,b,l,f) \
358  ((ssize_t) send ((s),(const void*) (b),(MHD_SCKT_SEND_SIZE_) (l), \
359  ((MSG_NOSIGNAL_OR_ZERO) | (f))))
360 
361 
369 #define MHD_send_(s,b,l) MHD_send4_((s),(b),(l), 0)
370 
371 
379 #define MHD_recv_(s,b,l) \
380  ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0))
381 
382 
392 #if defined(MHD_POSIX_SOCKETS)
393 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) \
394  ((fd) < ((MHD_socket) setsize))
395 #elif defined(MHD_WINSOCK_SOCKETS)
396 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) \
397  ( ((void*) (pset)== (void*) 0) || \
398  (((fd_set*) (pset))->fd_count < ((unsigned) setsize)) || \
399  (FD_ISSET ((fd), (pset))) )
400 #endif
401 
410 #define MHD_SCKT_FD_FITS_FDSET_(fd,pset) \
411  MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), (pset), FD_SETSIZE)
412 
421 #if defined(MHD_POSIX_SOCKETS)
422 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
423  FD_SET ((fd), (pset))
424 #elif defined(MHD_WINSOCK_SOCKETS)
425 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
426  do { \
427  u_int _i_ = 0; \
428  fd_set*const _s_ = (fd_set*) (pset); \
429  while ((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array [_i_])) {++_i_;} \
430  if ((_i_ == _s_->fd_count)) {_s_->fd_array [_s_->fd_count ++] = (fd);} \
431  } while (0)
432 #endif
433 
434 /* MHD_SYS_select_ is wrapper macro for system select() function */
435 #if ! defined(MHD_WINSOCK_SOCKETS)
436 # define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t))
437 #else
438 # define MHD_SYS_select_(n,r,w,e,t) \
439  ( ( (((void*) (r) == (void*) 0) || ((fd_set*) (r))->fd_count == 0) && \
440  (((void*) (w) == (void*) 0) || ((fd_set*) (w))->fd_count == 0) && \
441  (((void*) (e) == (void*) 0) || ((fd_set*) (e))->fd_count == 0) ) ? \
442  ( ((void*) (t) == (void*) 0) ? 0 : \
443  (Sleep (((struct timeval*) (t))->tv_sec * 1000 \
444  + ((struct timeval*) (t))->tv_usec / 1000), 0) ) : \
445  (select ((int) 0,(r),(w),(e),(t))) )
446 #endif
447 
448 #if defined(HAVE_POLL)
449 /* MHD_sys_poll_ is wrapper macro for system poll() function */
450 # if ! defined(MHD_WINSOCK_SOCKETS)
451 # define MHD_sys_poll_ poll
452 # else /* MHD_WINSOCK_SOCKETS */
453 # define MHD_sys_poll_ WSAPoll
454 # endif /* MHD_WINSOCK_SOCKETS */
455 
456 # ifdef POLLPRI
457 # define MHD_POLLPRI_OR_ZERO POLLPRI
458 # else /* ! POLLPRI */
459 # define MHD_POLLPRI_OR_ZERO 0
460 # endif /* ! POLLPRI */
461 # ifdef POLLRDBAND
462 # define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
463 # else /* ! POLLRDBAND */
464 # define MHD_POLLRDBAND_OR_ZERO 0
465 # endif /* ! POLLRDBAND */
466 # ifdef POLLNVAL
467 # define MHD_POLLNVAL_OR_ZERO POLLNVAL
468 # else /* ! POLLNVAL */
469 # define MHD_POLLNVAL_OR_ZERO 0
470 # endif /* ! POLLNVAL */
471 
472 /* MHD_POLL_EVENTS_ERR_DISC is 'events' mask for errors and disconnect.
473  * Note: Out-of-band data is treated as error. */
474 # if defined(_WIN32) && ! defined(__CYGWIN__)
475 # define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND
476 # elif defined(__linux__)
477 # define MHD_POLL_EVENTS_ERR_DISC POLLPRI
478 # else /* ! __linux__ */
479 # define MHD_POLL_EVENTS_ERR_DISC \
480  (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO)
481 # endif /* ! __linux__ */
482 /* MHD_POLL_REVENTS_ERR_DISC is 'revents' mask for errors and disconnect.
483  * Note: Out-of-band data is treated as error. */
484 # define MHD_POLL_REVENTS_ERR_DISC \
485  (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
486  | POLLERR | POLLHUP)
487 /* MHD_POLL_REVENTS_ERRROR is 'revents' mask for errors.
488  * Note: Out-of-band data is treated as error. */
489 # define MHD_POLL_REVENTS_ERRROR \
490  (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
491  | POLLERR)
492 #endif /* HAVE_POLL */
493 
494 #define MHD_SCKT_MISSING_ERR_CODE_ 31450
495 
496 #if defined(MHD_POSIX_SOCKETS)
497 # if defined(EAGAIN)
498 # define MHD_SCKT_EAGAIN_ EAGAIN
499 # elif defined(EWOULDBLOCK)
500 # define MHD_SCKT_EAGAIN_ EWOULDBLOCK
501 # else /* !EAGAIN && !EWOULDBLOCK */
502 # define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
503 # endif /* !EAGAIN && !EWOULDBLOCK */
504 # if defined(EWOULDBLOCK)
505 # define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
506 # elif defined(EAGAIN)
507 # define MHD_SCKT_EWOULDBLOCK_ EAGAIN
508 # else /* !EWOULDBLOCK && !EAGAIN */
509 # define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
510 # endif /* !EWOULDBLOCK && !EAGAIN */
511 # ifdef EINTR
512 # define MHD_SCKT_EINTR_ EINTR
513 # else /* ! EINTR */
514 # define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
515 # endif /* ! EINTR */
516 # ifdef ECONNRESET
517 # define MHD_SCKT_ECONNRESET_ ECONNRESET
518 # else /* ! ECONNRESET */
519 # define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
520 # endif /* ! ECONNRESET */
521 # ifdef ECONNABORTED
522 # define MHD_SCKT_ECONNABORTED_ ECONNABORTED
523 # else /* ! ECONNABORTED */
524 # define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
525 # endif /* ! ECONNABORTED */
526 # ifdef ENOTCONN
527 # define MHD_SCKT_ENOTCONN_ ENOTCONN
528 # else /* ! ENOTCONN */
529 # define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
530 # endif /* ! ENOTCONN */
531 # ifdef EMFILE
532 # define MHD_SCKT_EMFILE_ EMFILE
533 # else /* ! EMFILE */
534 # define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
535 # endif /* ! EMFILE */
536 # ifdef ENFILE
537 # define MHD_SCKT_ENFILE_ ENFILE
538 # else /* ! ENFILE */
539 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
540 # endif /* ! ENFILE */
541 # ifdef ENOMEM
542 # define MHD_SCKT_ENOMEM_ ENOMEM
543 # else /* ! ENOMEM */
544 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
545 # endif /* ! ENOMEM */
546 # ifdef ENOBUFS
547 # define MHD_SCKT_ENOBUFS_ ENOBUFS
548 # else /* ! ENOBUFS */
549 # define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
550 # endif /* ! ENOBUFS */
551 # ifdef EBADF
552 # define MHD_SCKT_EBADF_ EBADF
553 # else /* ! EBADF */
554 # define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
555 # endif /* ! EBADF */
556 # ifdef ENOTSOCK
557 # define MHD_SCKT_ENOTSOCK_ ENOTSOCK
558 # else /* ! ENOTSOCK */
559 # define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
560 # endif /* ! ENOTSOCK */
561 # ifdef EINVAL
562 # define MHD_SCKT_EINVAL_ EINVAL
563 # else /* ! EINVAL */
564 # define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
565 # endif /* ! EINVAL */
566 # ifdef EPIPE
567 # define MHD_SCKT_EPIPE_ EPIPE
568 # else /* ! EPIPE */
569 # define MHD_SCKT_EPIPE_ MHD_SCKT_MISSING_ERR_CODE_
570 # endif /* ! EPIPE */
571 # ifdef EFAULT
572 # define MHD_SCKT_EFAUL_ EFAULT
573 # else /* ! EFAULT */
574 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
575 # endif /* ! EFAULT */
576 # ifdef ENOSYS
577 # define MHD_SCKT_ENOSYS_ ENOSYS
578 # else /* ! ENOSYS */
579 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
580 # endif /* ! ENOSYS */
581 # ifdef ENOPROTOOPT
582 # define MHD_SCKT_ENOPROTOOPT_ ENOPROTOOPT
583 # else /* ! ENOPROTOOPT */
584 # define MHD_SCKT_ENOPROTOOPT_ MHD_SCKT_MISSING_ERR_CODE_
585 # endif /* ! ENOPROTOOPT */
586 # ifdef ENOTSUP
587 # define MHD_SCKT_ENOTSUP_ ENOTSUP
588 # else /* ! ENOTSUP */
589 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
590 # endif /* ! ENOTSUP */
591 # ifdef EOPNOTSUPP
592 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
593 # else /* ! EOPNOTSUPP */
594 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
595 # endif /* ! EOPNOTSUPP */
596 # ifdef EACCES
597 # define MHD_SCKT_EACCESS_ EACCES
598 # else /* ! EACCES */
599 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
600 # endif /* ! EACCES */
601 # ifdef ENETDOWN
602 # define MHD_SCKT_ENETDOWN_ ENETDOWN
603 # else /* ! ENETDOWN */
604 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
605 # endif /* ! ENETDOWN */
606 # ifdef EALREADY
607 # define MHD_SCKT_EALREADY_ EALREADY
608 # else /* ! EALREADY */
609 # define MHD_SCKT_EALREADY_ MHD_SCKT_MISSING_ERR_CODE_
610 # endif /* ! EALREADY */
611 # ifdef EINPROGRESS
612 # define MHD_SCKT_EINPROGRESS_ EINPROGRESS
613 # else /* ! EINPROGRESS */
614 # define MHD_SCKT_EINPROGRESS_ MHD_SCKT_MISSING_ERR_CODE_
615 # endif /* ! EINPROGRESS */
616 # ifdef EISCONN
617 # define MHD_SCKT_EISCONN_ EISCONN
618 # else /* ! EISCONN */
619 # define MHD_SCKT_EISCONN_ MHD_SCKT_MISSING_ERR_CODE_
620 # endif /* ! EISCONN */
621 #elif defined(MHD_WINSOCK_SOCKETS)
622 # define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
623 # define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
624 # define MHD_SCKT_EINTR_ WSAEINTR
625 # define MHD_SCKT_ECONNRESET_ WSAECONNRESET
626 # define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
627 # define MHD_SCKT_ENOTCONN_ WSAENOTCONN
628 # define MHD_SCKT_EMFILE_ WSAEMFILE
629 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
630 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
631 # define MHD_SCKT_ENOBUFS_ WSAENOBUFS
632 # define MHD_SCKT_EBADF_ WSAEBADF
633 # define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
634 # define MHD_SCKT_EINVAL_ WSAEINVAL
635 # define MHD_SCKT_EPIPE_ WSAESHUTDOWN
636 # define MHD_SCKT_EFAUL_ WSAEFAULT
637 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
638 # define MHD_SCKT_ENOPROTOOPT_ WSAENOPROTOOPT
639 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
640 # define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
641 # define MHD_SCKT_EACCESS_ WSAEACCES
642 # define MHD_SCKT_ENETDOWN_ WSAENETDOWN
643 # define MHD_SCKT_EALREADY_ WSAEALREADY
644 # define MHD_SCKT_EINPROGRESS_ WSAEACCES
645 # define MHD_SCKT_EISCONN_ WSAEISCONN
646 #endif
647 
652 #if defined(MHD_POSIX_SOCKETS)
653 # define MHD_socket_get_error_() (errno)
654 #elif defined(MHD_WINSOCK_SOCKETS)
655 # define MHD_socket_get_error_() WSAGetLastError ()
656 #endif
657 
658 #ifdef MHD_WINSOCK_SOCKETS
659 /* POSIX-W32 sockets compatibility functions */
660 
666 const char *MHD_W32_strerror_winsock_ (int err);
667 
668 #endif /* MHD_WINSOCK_SOCKETS */
669 
670 /* MHD_socket_last_strerr_ is description string of specified socket error code */
671 #if defined(MHD_POSIX_SOCKETS)
672 # define MHD_socket_strerr_(err) strerror ((err))
673 #elif defined(MHD_WINSOCK_SOCKETS)
674 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err))
675 #endif
676 
677 /* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
678  * description string of last socket error (W32) */
679 #define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
680 
684 #if defined(MHD_POSIX_SOCKETS)
685 # define MHD_socket_fset_error_(err) (errno = (err))
686 #elif defined(MHD_WINSOCK_SOCKETS)
687 # define MHD_socket_fset_error_(err) (WSASetLastError ((err)))
688 #endif
689 
698 #define MHD_socket_try_set_error_(err) \
699  ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
700  (MHD_socket_fset_error_ ((err)), ! 0) : 0)
701 
707 #if defined(MHD_POSIX_SOCKETS)
708 # if defined(ENOSYS)
709 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
710  (errno = ENOSYS) : (errno = (err)) )
711 # elif defined(EOPNOTSUPP)
712 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
713  (errno = EOPNOTSUPP) : (errno = \
714  (err)) )
715 # elif defined (EFAULT)
716 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
717  (errno = EFAULT) : (errno = (err)) )
718 # elif defined (EINVAL)
719 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
720  (errno = EINVAL) : (errno = (err)) )
721 # else /* !EOPNOTSUPP && !EFAULT && !EINVAL */
722 # warning \
723  No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
724 # define MHD_socket_set_error_(err) (errno = (err))
725 # endif /* !EOPNOTSUPP && !EFAULT && !EINVAL*/
726 #elif defined(MHD_WINSOCK_SOCKETS)
727 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
728  (WSASetLastError ((WSAEOPNOTSUPP))) : \
729  (WSASetLastError ((err))) )
730 #endif
731 
741 #define MHD_SCKT_ERR_IS_(err,code) \
742  ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && ((code) == (err)) )
743 
753 #define MHD_SCKT_LAST_ERR_IS_(code) \
754  MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), (code))
755 
756 /* Specific error code checks */
757 
764 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
765 
772 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
773 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
774 #else /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
775 # define MHD_SCKT_ERR_IS_EAGAIN_(err) \
776  ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EAGAIN_) || \
777  MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EWOULDBLOCK_) )
778 #endif /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
779 
785 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) \
786  ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EMFILE_) || \
787  MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENFILE_) || \
788  MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENOMEM_) || \
789  MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENOBUFS_) )
790 
797 #if defined(MHD_POSIX_SOCKETS)
798 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) \
799  MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNABORTED_)
800 #elif defined(MHD_WINSOCK_SOCKETS)
801 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) \
802  MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNRESET_)
803 #endif
804 
811 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) \
812  ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNRESET_) || \
813  MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNABORTED_) )
814 
815 /* Specific error code set */
816 
821 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
822 # define MHD_socket_set_error_to_ENOMEM() \
823  MHD_socket_set_error_ (MHD_SCKT_ENOMEM_)
824 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
825 # define MHD_socket_set_error_to_ENOMEM() \
826  MHD_socket_set_error_ (MHD_SCKT_ENOBUFS_)
827 #else
828 # warning \
829  No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
830 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
831  MHD_SCKT_ENOMEM_)
832 #endif
833 
834 /* Socket functions */
835 
836 #if defined(AF_LOCAL)
837 # define MHD_SCKT_LOCAL AF_LOCAL
838 #elif defined(AF_UNIX)
839 # define MHD_SCKT_LOCAL AF_UNIX
840 #endif /* AF_UNIX */
841 
842 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
843 # define MHD_socket_pair_(fdarr) \
844  (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, (fdarr)))
845 # if defined(HAVE_SOCK_NONBLOCK)
846 # define MHD_socket_pair_nblk_(fdarr) \
847  (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, (fdarr)))
848 # endif /* HAVE_SOCK_NONBLOCK*/
849 #elif defined(MHD_WINSOCK_SOCKETS)
857 int MHD_W32_socket_pair_ (SOCKET sockets_pair[2], int non_blk);
858 
859 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0)
860 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1)
861 #endif
862 
873 int
875  fd_set *set,
876  MHD_socket *max_fd,
877  unsigned int fd_setsize);
878 
879 
886 int
888 
889 
899 int
901  bool on);
902 
910 int
912 
913 
914 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
915 static const int _MHD_socket_int_one = 1;
922 #define MHD_socket_nosignal_(sock) \
923  (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \
924  sizeof(_MHD_socket_int_one)))
925 #endif /* SOL_SOCKET && SO_NOSIGPIPE */
926 
927 
928 #if defined(MHD_socket_nosignal_) || defined(MSG_NOSIGNAL)
935 #define MHD_SEND_SPIPE_SUPPRESS_POSSIBLE 1
936 #endif /* MHD_WINSOCK_SOCKETS || MHD_socket_nosignal_ || MSG_NOSIGNAL */
937 
938 #if ! defined(MHD_WINSOCK_SOCKETS)
942 #define MHD_SEND_SPIPE_SUPPRESS_NEEDED 1
943 #endif
944 
953 
954 
955 #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:481
Helper for obtaining FD_SETSIZE system default value.
int MHD_socket
Definition: microhttpd.h:207
int fd
Definition: microhttpd.h:3642