34 #define MHD_SOCKETS_H 1
44 #if ! defined(MHD_POSIX_SOCKETS) && ! defined(MHD_WINSOCK_SOCKETS)
45 # if ! defined(_WIN32) || defined(__CYGWIN__)
46 # define MHD_POSIX_SOCKETS 1
48 # define MHD_WINSOCK_SOCKETS 1
59 #if defined(MHD_POSIX_SOCKETS)
60 # ifdef HAVE_SYS_TYPES_H
61 # include <sys/types.h>
63 # ifdef HAVE_SYS_SOCKET_H
64 # include <sys/socket.h>
66 # if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS)
67 # ifdef HAVE_SOCKLIB_H
70 # ifdef HAVE_INETLIB_H
75 # ifdef HAVE_NETINET_IN_H
76 # include <netinet/in.h>
78 # ifdef HAVE_ARPA_INET_H
79 # include <arpa/inet.h>
84 # ifdef HAVE_SYS_TIME_H
85 # include <sys/time.h>
93 # ifdef HAVE_SYS_SELECT_H
94 # include <sys/select.h>
97 # include <sys/epoll.h>
99 # ifdef HAVE_NETINET_TCP_H
101 # include <netinet/tcp.h>
103 # ifdef HAVE_STRING_H
106 #elif defined(MHD_WINSOCK_SOCKETS)
107 # ifndef WIN32_LEAN_AND_MEAN
108 # define WIN32_LEAN_AND_MEAN 1
110 # include <winsock2.h>
111 # include <ws2tcpip.h>
114 #if defined(HAVE_POLL_H) && defined(HAVE_POLL)
119 #if defined(_MSC_FULL_VER) && ! defined (_SSIZE_T_DEFINED)
121 # define _SSIZE_T_DEFINED
122 typedef intptr_t ssize_t;
126 #include <sys/param.h>
131 #ifdef _MHD_FD_SETSIZE_IS_DEFAULT
132 # define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE
135 # define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value ()
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 (); \
148 #ifndef MHD_SOCKET_DEFINED
152 # if defined(MHD_POSIX_SOCKETS)
154 # define MHD_INVALID_SOCKET (-1)
155 # elif defined(MHD_WINSOCK_SOCKETS)
157 # define MHD_INVALID_SOCKET (INVALID_SOCKET)
160 # define MHD_SOCKET_DEFINED 1
164 # define SOCK_CLOEXEC_OR_ZERO SOCK_CLOEXEC
166 # define SOCK_CLOEXEC_OR_ZERO 0
169 #ifdef HAVE_SOCK_NONBLOCK
170 # define SOCK_NONBLOCK_OR_ZERO SOCK_NONBLOCK
172 # define SOCK_NONBLOCK_OR_ZERO 0
175 #ifdef SOCK_NOSIGPIPE
176 # define SOCK_NOSIGPIPE_OR_ZERO SOCK_NOSIGPIPE
178 # define SOCK_NOSIGPIPE_OR_ZERO 0
182 # define MSG_NOSIGNAL_OR_ZERO MSG_NOSIGNAL
184 # define MSG_NOSIGNAL_OR_ZERO 0
187 #if ! defined(SHUT_WR) && defined(SD_SEND)
188 # define SHUT_WR SD_SEND
190 #if ! defined(SHUT_RD) && defined(SD_RECEIVE)
191 # define SHUT_RD SD_RECEIVE
193 #if ! defined(SHUT_RDWR) && defined(SD_BOTH)
194 # define SHUT_RDWR SD_BOTH
197 #if HAVE_ACCEPT4 + 0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || \
198 defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE))
199 # define USE_ACCEPT4 1
202 #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
203 # define USE_EPOLL_CREATE1 1
210 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
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
227 #ifdef MHD_TCP_CORK_NOPUSH
232 #define _MHD_CORK_RESET_PUSH_DATA 1
237 #define _MHD_CORK_RESET_PUSH_DATA_ALWAYS 1
239 #if defined(__FreeBSD__) && \
240 ((__FreeBSD__ + 0) >= 5 || (__FreeBSD_version + 0) >= 450000)
246 #define _MHD_CORK_RESET_PUSH_DATA 1
253 #define _MHD_CORK_RESET_PUSH_DATA 1
261 #define _MHD_NODELAY_SET_PUSH_DATA 1
266 #define _MHD_NODELAY_SET_PUSH_DATA_ALWAYS 1
277 #define MHD_USE_MSG_MORE 1
285 #ifdef MHD_POSIX_SOCKETS
295 #if ! defined(MHD_WINSOCK_SOCKETS)
304 #if ! defined(MHD_WINSOCK_SOCKETS)
305 # define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
307 # define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
320 #if ! defined(MHD_WINSOCK_SOCKETS)
321 # define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno))
323 # define MHD_socket_close_(fd) (0 == closesocket ((fd)))
331 #define MHD_socket_close_chk_(fd) do { \
332 if (! MHD_socket_close_ (fd)) \
333 MHD_PANIC (_ ("Close socket failed.\n")); \
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))))
357 #define MHD_send_(s,b,l) MHD_send4_((s),(b),(l), 0)
367 #define MHD_recv_(s,b,l) \
368 ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0))
380 #if defined(MHD_POSIX_SOCKETS)
381 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ((fd) < \
384 #elif defined(MHD_WINSOCK_SOCKETS)
385 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ( ((void*) (pset)== \
387 (((fd_set*) (pset)) \
403 #define MHD_SCKT_FD_FITS_FDSET_(fd,pset) MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), \
415 #if defined(MHD_POSIX_SOCKETS)
416 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) FD_SET ((fd), \
418 #elif defined(MHD_WINSOCK_SOCKETS)
419 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
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);} \
429 #if ! defined(MHD_WINSOCK_SOCKETS)
430 # define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t))
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))) )
442 #if defined(HAVE_POLL)
444 # if ! defined(MHD_WINSOCK_SOCKETS)
445 # define MHD_sys_poll_ poll
447 # define MHD_sys_poll_ WSAPoll
451 # define MHD_POLLPRI_OR_ZERO POLLPRI
453 # define MHD_POLLPRI_OR_ZERO 0
456 # define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
458 # define MHD_POLLRDBAND_OR_ZERO 0
461 # define MHD_POLLNVAL_OR_ZERO POLLNVAL
463 # define MHD_POLLNVAL_OR_ZERO 0
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
473 # define MHD_POLL_EVENTS_ERR_DISC (MHD_POLLPRI_OR_ZERO \
474 | MHD_POLLRDBAND_OR_ZERO)
478 # define MHD_POLL_REVENTS_ERR_DISC \
479 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
483 # define MHD_POLL_REVENTS_ERRROR \
484 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
488 #define MHD_SCKT_MISSING_ERR_CODE_ 31450
490 #if defined(MHD_POSIX_SOCKETS)
492 # define MHD_SCKT_EAGAIN_ EAGAIN
493 # elif defined(EWOULDBLOCK)
494 # define MHD_SCKT_EAGAIN_ EWOULDBLOCK
496 # define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
498 # if defined(EWOULDBLOCK)
499 # define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
500 # elif defined(EAGAIN)
501 # define MHD_SCKT_EWOULDBLOCK_ EAGAIN
503 # define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
506 # define MHD_SCKT_EINTR_ EINTR
508 # define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
511 # define MHD_SCKT_ECONNRESET_ ECONNRESET
513 # define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
516 # define MHD_SCKT_ECONNABORTED_ ECONNABORTED
518 # define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
521 # define MHD_SCKT_ENOTCONN_ ENOTCONN
523 # define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
526 # define MHD_SCKT_EMFILE_ EMFILE
528 # define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
531 # define MHD_SCKT_ENFILE_ ENFILE
533 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
536 # define MHD_SCKT_ENOMEM_ ENOMEM
538 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
541 # define MHD_SCKT_ENOBUFS_ ENOBUFS
543 # define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
546 # define MHD_SCKT_EBADF_ EBADF
548 # define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
551 # define MHD_SCKT_ENOTSOCK_ ENOTSOCK
553 # define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
556 # define MHD_SCKT_EINVAL_ EINVAL
558 # define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
561 # define MHD_SCKT_EFAUL_ EFAULT
563 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
566 # define MHD_SCKT_ENOSYS_ ENOSYS
568 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
571 # define MHD_SCKT_ENOTSUP_ ENOTSUP
573 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
576 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
578 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
581 # define MHD_SCKT_EACCESS_ EACCES
583 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
586 # define MHD_SCKT_ENETDOWN_ ENETDOWN
588 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
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
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 ()
622 #ifdef MHD_WINSOCK_SOCKETS
630 const char*MHD_W32_strerror_winsock_ (
int err);
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))
643 #define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
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)))
662 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
663 (MHD_socket_fset_error_ ((err)), ! 0) : \
671 #if defined(MHD_POSIX_SOCKETS)
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 = \
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)) )
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))
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))) )
705 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \
717 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), \
728 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
736 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
737 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
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_) )
750 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) (MHD_SCKT_ERR_IS_ ((err), \
753 MHD_SCKT_ERR_IS_ ((err), \
756 MHD_SCKT_ERR_IS_ ((err), \
759 MHD_SCKT_ERR_IS_ ((err), \
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_)
782 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) (MHD_SCKT_ERR_IS_ ((err), \
783 MHD_SCKT_ECONNRESET_) \
785 MHD_SCKT_ERR_IS_ ((err), \
786 MHD_SCKT_ECONNABORTED_))
794 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
795 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
797 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
798 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
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_ ( \
809 #if defined(AF_LOCAL)
810 # define MHD_SCKT_LOCAL AF_LOCAL
811 #elif defined(AF_UNIX)
812 # define MHD_SCKT_LOCAL AF_UNIX
815 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
816 # define MHD_socket_pair_(fdarr) (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, \
818 # if defined(HAVE_SOCK_NONBLOCK)
819 # define MHD_socket_pair_nblk_(fdarr) (! socketpair (MHD_SCKT_LOCAL, \
821 | SOCK_NONBLOCK, 0, \
824 #elif defined(MHD_WINSOCK_SOCKETS)
832 int MHD_W32_socket_pair_ (SOCKET sockets_pair[2],
int non_blk);
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)
852 unsigned int fd_setsize);
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)))
937 #if defined(MHD_WINSOCK_SOCKETS) || defined(MHD_socket_nosignal_) || \
938 defined(MSG_NOSIGNAL)
945 #define HAVE_SEND_SIGPIPE_SUPPRESS 1
size_t MHD_SCKT_SEND_SIZE_
int MHD_add_to_fd_set_(MHD_socket fd, fd_set *set, MHD_socket *max_fd, unsigned int fd_setsize)
int MHD_socket_noninheritable_(MHD_socket sock)
int MHD_socket_nonblocking_(MHD_socket sock)
MHD_socket MHD_socket_create_listen_(int pf)
additional automatic macros for MHD_config.h
limits values definitions
int MHD_socket_cork_(MHD_socket sock, bool on)
int MHD_socket_buffering_reset_(MHD_socket sock)
int MHD_socket_set_nodelay_(MHD_socket sock, bool on)
Helper for obtaining FD_SETSIZE system default value.