Go to the documentation of this file.
34 #define MHD_SOCKETS_H 1
40 #if ! defined(MHD_POSIX_SOCKETS) && ! defined(MHD_WINSOCK_SOCKETS)
41 # if ! defined(_WIN32) || defined(__CYGWIN__)
42 # define MHD_POSIX_SOCKETS 1
44 # define MHD_WINSOCK_SOCKETS 1
55 #if defined(MHD_POSIX_SOCKETS)
56 # ifdef HAVE_SYS_TYPES_H
57 # include <sys/types.h>
59 # ifdef HAVE_SYS_SOCKET_H
60 # include <sys/socket.h>
62 # if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS)
63 # ifdef HAVE_SOCKLIB_H
66 # ifdef HAVE_INETLIB_H
71 # ifdef HAVE_NETINET_IN_H
72 # include <netinet/in.h>
74 # ifdef HAVE_ARPA_INET_H
75 # include <arpa/inet.h>
80 # ifdef HAVE_SYS_TIME_H
81 # include <sys/time.h>
89 # ifdef HAVE_SYS_SELECT_H
90 # include <sys/select.h>
93 # include <sys/epoll.h>
95 # ifdef HAVE_NETINET_TCP_H
97 # include <netinet/tcp.h>
102 #elif defined(MHD_WINSOCK_SOCKETS)
103 # ifndef WIN32_LEAN_AND_MEAN
104 # define WIN32_LEAN_AND_MEAN 1
106 # include <winsock2.h>
107 # include <ws2tcpip.h>
110 #if defined(HAVE_POLL_H) && defined(HAVE_POLL)
115 #if defined(_MSC_FULL_VER) && ! defined (_SSIZE_T_DEFINED)
117 # define _SSIZE_T_DEFINED
118 typedef intptr_t ssize_t;
123 #ifdef _MHD_FD_SETSIZE_IS_DEFAULT
124 # define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE
127 # define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value ()
134 # define MHD_PANIC(msg) do { fprintf (stderr, \
135 "Abnormal termination at %d line in file %s: %s\n", \
136 (int) __LINE__, __FILE__, msg); abort (); \
140 #ifndef MHD_SOCKET_DEFINED
144 # if defined(MHD_POSIX_SOCKETS)
146 # define MHD_INVALID_SOCKET (-1)
147 # elif defined(MHD_WINSOCK_SOCKETS)
149 # define MHD_INVALID_SOCKET (INVALID_SOCKET)
152 # define MHD_SOCKET_DEFINED 1
156 # define MAYBE_SOCK_CLOEXEC SOCK_CLOEXEC
158 # define MAYBE_SOCK_CLOEXEC 0
161 #ifdef HAVE_SOCK_NONBLOCK
162 # define MAYBE_SOCK_NONBLOCK SOCK_NONBLOCK
164 # define MAYBE_SOCK_NONBLOCK 0
167 #ifdef SOCK_NOSIGPIPE
168 # define MAYBE_SOCK_NOSIGPIPE SOCK_NOSIGPIPE
170 # define MAYBE_SOCK_NOSIGPIPE 0
174 # define MAYBE_MSG_NOSIGNAL MSG_NOSIGNAL
176 # define MAYBE_MSG_NOSIGNAL 0
179 #if ! defined(SHUT_WR) && defined(SD_SEND)
180 # define SHUT_WR SD_SEND
182 #if ! defined(SHUT_RD) && defined(SD_RECEIVE)
183 # define SHUT_RD SD_RECEIVE
185 #if ! defined(SHUT_RDWR) && defined(SD_BOTH)
186 # define SHUT_RDWR SD_BOTH
189 #if HAVE_ACCEPT4 + 0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || \
190 defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE))
191 # define USE_ACCEPT4 1
194 #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
195 # define USE_EPOLL_CREATE1 1
202 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
206 #if defined(TCP_CORK)
210 #define MHD_TCP_CORK_NOPUSH TCP_CORK
211 #elif defined(TCP_NOPUSH)
215 #define MHD_TCP_CORK_NOPUSH TCP_NOPUSH
222 #ifdef MHD_POSIX_SOCKETS
232 #if ! defined(MHD_WINSOCK_SOCKETS)
241 #if ! defined(MHD_WINSOCK_SOCKETS)
242 # define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
244 # define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
257 #if ! defined(MHD_WINSOCK_SOCKETS)
258 # define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno))
260 # define MHD_socket_close_(fd) (0 == closesocket ((fd)))
268 #define MHD_socket_close_chk_(fd) do { \
269 if (! MHD_socket_close_ (fd)) \
270 MHD_PANIC (_ ("Close socket failed.\n")); \
281 #define MHD_send_(s,b,l) \
282 ((ssize_t) send ((s),(const void*) (b),(MHD_SCKT_SEND_SIZE_) (l), \
293 #define MHD_recv_(s,b,l) \
294 ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0))
306 #if defined(MHD_POSIX_SOCKETS)
307 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ((fd) < \
310 #elif defined(MHD_WINSOCK_SOCKETS)
311 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ( ((void*) (pset)== \
313 (((fd_set*) (pset)) \
329 #define MHD_SCKT_FD_FITS_FDSET_(fd,pset) MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), \
341 #if defined(MHD_POSIX_SOCKETS)
342 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) FD_SET ((fd), \
344 #elif defined(MHD_WINSOCK_SOCKETS)
345 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
348 fd_set*const _s_ = (fd_set*) (pset); \
349 while ((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array [_i_])) {++_i_;} \
350 if ((_i_ == _s_->fd_count)) {_s_->fd_array [_s_->fd_count ++] = (fd);} \
355 #if ! defined(MHD_WINSOCK_SOCKETS)
356 # define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t))
358 # define MHD_SYS_select_(n,r,w,e,t) \
359 ( ( (((void*) (r) == (void*) 0) || ((fd_set*) (r))->fd_count == 0) && \
360 (((void*) (w) == (void*) 0) || ((fd_set*) (w))->fd_count == 0) && \
361 (((void*) (e) == (void*) 0) || ((fd_set*) (e))->fd_count == 0) ) ? \
362 ( ((void*) (t) == (void*) 0) ? 0 : \
363 (Sleep (((struct timeval*) (t))->tv_sec * 1000 \
364 + ((struct timeval*) (t))->tv_usec / 1000), 0) ) : \
365 (select ((int) 0,(r),(w),(e),(t))) )
368 #if defined(HAVE_POLL)
370 # if ! defined(MHD_WINSOCK_SOCKETS)
371 # define MHD_sys_poll_ poll
373 # define MHD_sys_poll_ WSAPoll
377 # define MHD_POLLPRI_OR_ZERO POLLPRI
379 # define MHD_POLLPRI_OR_ZERO 0
382 # define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
384 # define MHD_POLLRDBAND_OR_ZERO 0
387 # define MHD_POLLNVAL_OR_ZERO POLLNVAL
389 # define MHD_POLLNVAL_OR_ZERO 0
394 # if defined(_WIN32) && ! defined(__CYGWIN__)
395 # define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND
396 # elif defined(__linux__)
397 # define MHD_POLL_EVENTS_ERR_DISC POLLPRI
399 # define MHD_POLL_EVENTS_ERR_DISC (MHD_POLLPRI_OR_ZERO \
400 | MHD_POLLRDBAND_OR_ZERO)
404 # define MHD_POLL_REVENTS_ERR_DISC \
405 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
409 # define MHD_POLL_REVENTS_ERRROR \
410 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
414 #define MHD_SCKT_MISSING_ERR_CODE_ 31450
416 #if defined(MHD_POSIX_SOCKETS)
418 # define MHD_SCKT_EAGAIN_ EAGAIN
419 # elif defined(EWOULDBLOCK)
420 # define MHD_SCKT_EAGAIN_ EWOULDBLOCK
422 # define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
424 # if defined(EWOULDBLOCK)
425 # define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
426 # elif defined(EAGAIN)
427 # define MHD_SCKT_EWOULDBLOCK_ EAGAIN
429 # define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
432 # define MHD_SCKT_EINTR_ EINTR
434 # define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
437 # define MHD_SCKT_ECONNRESET_ ECONNRESET
439 # define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
442 # define MHD_SCKT_ECONNABORTED_ ECONNABORTED
444 # define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
447 # define MHD_SCKT_ENOTCONN_ ENOTCONN
449 # define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
452 # define MHD_SCKT_EMFILE_ EMFILE
454 # define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
457 # define MHD_SCKT_ENFILE_ ENFILE
459 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
462 # define MHD_SCKT_ENOMEM_ ENOMEM
464 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
467 # define MHD_SCKT_ENOBUFS_ ENOBUFS
469 # define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
472 # define MHD_SCKT_EBADF_ EBADF
474 # define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
477 # define MHD_SCKT_ENOTSOCK_ ENOTSOCK
479 # define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
482 # define MHD_SCKT_EINVAL_ EINVAL
484 # define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
487 # define MHD_SCKT_EFAUL_ EFAULT
489 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
492 # define MHD_SCKT_ENOSYS_ ENOSYS
494 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
497 # define MHD_SCKT_ENOTSUP_ ENOTSUP
499 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
502 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
504 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
507 # define MHD_SCKT_EACCESS_ EACCES
509 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
512 # define MHD_SCKT_ENETDOWN_ ENETDOWN
514 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
516 #elif defined(MHD_WINSOCK_SOCKETS)
517 # define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
518 # define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
519 # define MHD_SCKT_EINTR_ WSAEINTR
520 # define MHD_SCKT_ECONNRESET_ WSAECONNRESET
521 # define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
522 # define MHD_SCKT_ENOTCONN_ WSAENOTCONN
523 # define MHD_SCKT_EMFILE_ WSAEMFILE
524 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
525 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
526 # define MHD_SCKT_ENOBUFS_ WSAENOBUFS
527 # define MHD_SCKT_EBADF_ WSAEBADF
528 # define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
529 # define MHD_SCKT_EINVAL_ WSAEINVAL
530 # define MHD_SCKT_EFAUL_ WSAEFAULT
531 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
532 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
533 # define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
534 # define MHD_SCKT_EACCESS_ WSAEACCES
535 # define MHD_SCKT_ENETDOWN_ WSAENETDOWN
542 #if defined(MHD_POSIX_SOCKETS)
543 # define MHD_socket_get_error_() (errno)
544 #elif defined(MHD_WINSOCK_SOCKETS)
545 # define MHD_socket_get_error_() WSAGetLastError ()
548 #ifdef MHD_WINSOCK_SOCKETS
556 const char*MHD_W32_strerror_winsock_ (
int err);
561 #if defined(MHD_POSIX_SOCKETS)
562 # define MHD_socket_strerr_(err) strerror ((err))
563 #elif defined(MHD_WINSOCK_SOCKETS)
564 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err))
569 #define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
574 #if defined(MHD_POSIX_SOCKETS)
575 # define MHD_socket_fset_error_(err) (errno = (err))
576 #elif defined(MHD_WINSOCK_SOCKETS)
577 # define MHD_socket_fset_error_(err) (WSASetLastError ((err)))
588 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
589 (MHD_socket_fset_error_ ((err)), ! 0) : \
597 #if defined(MHD_POSIX_SOCKETS)
599 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
600 (errno = ENOSYS) : (errno = (err)) )
601 # elif defined(EOPNOTSUPP)
602 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
603 (errno = EOPNOTSUPP) : (errno = \
605 # elif defined (EFAULT)
606 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
607 (errno = EFAULT) : (errno = (err)) )
608 # elif defined (EINVAL)
609 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
610 (errno = EINVAL) : (errno = (err)) )
613 No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
614 # define MHD_socket_set_error_(err) (errno = (err))
616 #elif defined(MHD_WINSOCK_SOCKETS)
617 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
618 (WSASetLastError ((WSAEOPNOTSUPP))) : \
619 (WSASetLastError ((err))) )
631 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \
643 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), \
654 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
662 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
663 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
665 # define MHD_SCKT_ERR_IS_EAGAIN_(err) (MHD_SCKT_ERR_IS_ ((err), \
666 MHD_SCKT_EAGAIN_) || \
667 MHD_SCKT_ERR_IS_ ((err), \
668 MHD_SCKT_EWOULDBLOCK_) )
676 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) (MHD_SCKT_ERR_IS_ ((err), \
679 MHD_SCKT_ERR_IS_ ((err), \
682 MHD_SCKT_ERR_IS_ ((err), \
685 MHD_SCKT_ERR_IS_ ((err), \
694 #if defined(MHD_POSIX_SOCKETS)
695 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
696 MHD_SCKT_ECONNABORTED_)
697 #elif defined(MHD_WINSOCK_SOCKETS)
698 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
699 MHD_SCKT_ECONNRESET_)
708 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) (MHD_SCKT_ERR_IS_ ((err), \
709 MHD_SCKT_ECONNRESET_) \
711 MHD_SCKT_ERR_IS_ ((err), \
712 MHD_SCKT_ECONNABORTED_))
720 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
721 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
723 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
724 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
728 No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
729 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
735 #if defined(AF_LOCAL)
736 # define MHD_SCKT_LOCAL AF_LOCAL
737 #elif defined(AF_UNIX)
738 # define MHD_SCKT_LOCAL AF_UNIX
741 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
742 # define MHD_socket_pair_(fdarr) (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, \
744 # if defined(HAVE_SOCK_NONBLOCK)
745 # define MHD_socket_pair_nblk_(fdarr) (! socketpair (MHD_SCKT_LOCAL, \
747 | SOCK_NONBLOCK, 0, \
750 #elif defined(MHD_WINSOCK_SOCKETS)
758 int MHD_W32_socket_pair_ (SOCKET sockets_pair[2],
int non_blk);
760 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0)
761 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1)
778 unsigned int fd_setsize);
849 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
850 static const int _MHD_socket_int_one = 1;
857 # define MHD_socket_nosignal_(sock) \
858 (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \
859 sizeof(_MHD_socket_int_one)))
limits values definitions
int MHD_add_to_fd_set_(MHD_socket fd, fd_set *set, MHD_socket *max_fd, unsigned int fd_setsize)
additional automatic macros for MHD_config.h
int MHD_socket_nonblocking_(MHD_socket sock)
Helper for obtaining FD_SETSIZE system default value.
MHD_socket MHD_socket_create_listen_(int pf)
int MHD_socket_cork_(MHD_socket sock, bool on)
size_t MHD_SCKT_SEND_SIZE_
int MHD_socket_buffering_reset_(MHD_socket sock)
int MHD_socket_noninheritable_(MHD_socket sock)
int MHD_socket_set_nodelay_(MHD_socket sock, bool on)