34 #define MHD_SOCKETS_H 1
39 #if !defined(MHD_POSIX_SOCKETS) && !defined(MHD_WINSOCK_SOCKETS)
40 # if !defined(_WIN32) || defined(__CYGWIN__)
41 # define MHD_POSIX_SOCKETS 1
43 # define MHD_WINSOCK_SOCKETS 1
54 #if defined(MHD_POSIX_SOCKETS)
55 # ifdef HAVE_SYS_TYPES_H
56 # include <sys/types.h>
58 # ifdef HAVE_SYS_SOCKET_H
59 # include <sys/socket.h>
61 # if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS)
62 # ifdef HAVE_SOCKLIB_H
65 # ifdef HAVE_INETLIB_H
70 # ifdef HAVE_NETINET_IN_H
71 # include <netinet/in.h>
73 # ifdef HAVE_ARPA_INET_H
74 # include <arpa/inet.h>
79 # ifdef HAVE_SYS_TIME_H
80 # include <sys/time.h>
88 # ifdef HAVE_SYS_SELECT_H
89 # include <sys/select.h>
92 # include <sys/epoll.h>
94 # ifdef HAVE_NETINET_TCP_H
96 # include <netinet/tcp.h>
101 #elif defined(MHD_WINSOCK_SOCKETS)
102 # ifndef WIN32_LEAN_AND_MEAN
103 # define WIN32_LEAN_AND_MEAN 1
105 # include <winsock2.h>
106 # include <ws2tcpip.h>
109 #if defined(HAVE_POLL_H) && defined(HAVE_POLL)
114 #if defined(_MSC_FULL_VER) && !defined (_SSIZE_T_DEFINED)
116 # define _SSIZE_T_DEFINED
117 typedef intptr_t ssize_t;
122 #ifdef _MHD_FD_SETSIZE_IS_DEFAULT
123 # define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE
126 # define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value()
133 # define MHD_PANIC(msg) do { fprintf (stderr, \
134 "Abnormal termination at %d line in file %s: %s\n", \
135 (int)__LINE__, __FILE__, msg); abort();} while(0)
138 #ifndef MHD_SOCKET_DEFINED
142 # if defined(MHD_POSIX_SOCKETS)
144 # define MHD_INVALID_SOCKET (-1)
145 # elif defined(MHD_WINSOCK_SOCKETS)
147 # define MHD_INVALID_SOCKET (INVALID_SOCKET)
150 # define MHD_SOCKET_DEFINED 1
154 # define MAYBE_SOCK_CLOEXEC SOCK_CLOEXEC
156 # define MAYBE_SOCK_CLOEXEC 0
159 #ifdef HAVE_SOCK_NONBLOCK
160 # define MAYBE_SOCK_NONBLOCK SOCK_NONBLOCK
162 # define MAYBE_SOCK_NONBLOCK 0
166 # define MAYBE_MSG_NOSIGNAL MSG_NOSIGNAL
168 # define MAYBE_MSG_NOSIGNAL 0
171 #if !defined(SHUT_WR) && defined(SD_SEND)
172 # define SHUT_WR SD_SEND
174 #if !defined(SHUT_RD) && defined(SD_RECEIVE)
175 # define SHUT_RD SD_RECEIVE
177 #if !defined(SHUT_RDWR) && defined(SD_BOTH)
178 # define SHUT_RDWR SD_BOTH
181 #if HAVE_ACCEPT4+0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || defined(SOCK_CLOEXEC))
182 # define USE_ACCEPT4 1
185 #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
186 # define USE_EPOLL_CREATE1 1
193 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
200 #ifdef MHD_POSIX_SOCKETS
210 #if !defined(MHD_WINSOCK_SOCKETS)
219 #if !defined(MHD_WINSOCK_SOCKETS)
220 # define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
222 # define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
235 #if !defined(MHD_WINSOCK_SOCKETS)
236 # define MHD_socket_close_(fd) ((0 == close((fd))) || (EBADF != errno))
238 # define MHD_socket_close_(fd) (0 == closesocket((fd)))
246 #define MHD_socket_close_chk_(fd) do { \
247 if (!MHD_socket_close_(fd)) \
248 MHD_PANIC(_("Close socket failed.\n")); \
259 #define MHD_send_(s,b,l) \
260 ((ssize_t)send((s),(const void*)(b),((MHD_SCKT_SEND_SIZE_)l), MAYBE_MSG_NOSIGNAL))
270 #define MHD_recv_(s,b,l) \
271 ((ssize_t)recv((s),(void*)(b),((MHD_SCKT_SEND_SIZE_)l), 0))
283 #if defined(MHD_POSIX_SOCKETS)
284 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ((fd) < ((MHD_socket)setsize))
285 #elif defined(MHD_WINSOCK_SOCKETS)
286 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ( ((void*)(pset)==(void*)0) || \
287 (((fd_set*)(pset))->fd_count < ((unsigned)setsize)) || \
288 (FD_ISSET((fd),(pset))) )
299 #define MHD_SCKT_FD_FITS_FDSET_(fd,pset) MHD_SCKT_FD_FITS_FDSET_SETSIZE_((fd),(pset),FD_SETSIZE)
309 #if defined(MHD_POSIX_SOCKETS)
310 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) FD_SET((fd),(pset))
311 #elif defined(MHD_WINSOCK_SOCKETS)
312 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
315 fd_set* const _s_ = (fd_set*)(pset); \
316 while((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array[_i_])) {++_i_;} \
317 if ((_i_ == _s_->fd_count)) {_s_->fd_array[_s_->fd_count++] = (fd);} \
322 #if !defined(MHD_WINSOCK_SOCKETS)
323 # define MHD_SYS_select_(n,r,w,e,t) select((n),(r),(w),(e),(t))
325 # define MHD_SYS_select_(n,r,w,e,t) \
326 ( ( (((void*)(r) == (void*)0) || ((fd_set*)(r))->fd_count == 0) && \
327 (((void*)(w) == (void*)0) || ((fd_set*)(w))->fd_count == 0) && \
328 (((void*)(e) == (void*)0) || ((fd_set*)(e))->fd_count == 0) ) ? \
329 ( ((void*)(t) == (void*)0) ? 0 : \
330 (Sleep(((struct timeval*)(t))->tv_sec * 1000 + \
331 ((struct timeval*)(t))->tv_usec / 1000), 0) ) : \
332 (select((int)0,(r),(w),(e),(t))) )
335 #if defined(HAVE_POLL)
337 # if !defined(MHD_WINSOCK_SOCKETS)
338 # define MHD_sys_poll_ poll
340 # define MHD_sys_poll_ WSAPoll
344 # define MHD_POLLPRI_OR_ZERO POLLPRI
346 # define MHD_POLLPRI_OR_ZERO 0
349 # define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
351 # define MHD_POLLRDBAND_OR_ZERO 0
354 # define MHD_POLLNVAL_OR_ZERO POLLNVAL
356 # define MHD_POLLNVAL_OR_ZERO 0
361 # if defined(_WIN32) && ! defined(__CYGWIN__)
362 # define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND
363 # elif defined(__linux__)
364 # define MHD_POLL_EVENTS_ERR_DISC POLLPRI
366 # define MHD_POLL_EVENTS_ERR_DISC (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO)
370 # define MHD_POLL_REVENTS_ERR_DISC \
371 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO | POLLERR | POLLHUP)
374 # define MHD_POLL_REVENTS_ERRROR \
375 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO | POLLERR)
378 #define MHD_SCKT_MISSING_ERR_CODE_ 31450
380 #if defined(MHD_POSIX_SOCKETS)
382 # define MHD_SCKT_EAGAIN_ EAGAIN
383 # elif defined(EWOULDBLOCK)
384 # define MHD_SCKT_EAGAIN_ EWOULDBLOCK
386 # define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
388 # if defined(EWOULDBLOCK)
389 # define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
390 # elif defined(EAGAIN)
391 # define MHD_SCKT_EWOULDBLOCK_ EAGAIN
393 # define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
396 # define MHD_SCKT_EINTR_ EINTR
398 # define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
401 # define MHD_SCKT_ECONNRESET_ ECONNRESET
403 # define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
406 # define MHD_SCKT_ECONNABORTED_ ECONNABORTED
408 # define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
411 # define MHD_SCKT_ENOTCONN_ ENOTCONN
413 # define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
416 # define MHD_SCKT_EMFILE_ EMFILE
418 # define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
421 # define MHD_SCKT_ENFILE_ ENFILE
423 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
426 # define MHD_SCKT_ENOMEM_ ENOMEM
428 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
431 # define MHD_SCKT_ENOBUFS_ ENOBUFS
433 # define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
436 # define MHD_SCKT_EBADF_ EBADF
438 # define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
441 # define MHD_SCKT_ENOTSOCK_ ENOTSOCK
443 # define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
446 # define MHD_SCKT_EINVAL_ EINVAL
448 # define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
451 # define MHD_SCKT_EFAUL_ EFAULT
453 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
456 # define MHD_SCKT_ENOSYS_ ENOSYS
458 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
461 # define MHD_SCKT_ENOTSUP_ ENOTSUP
463 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
466 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
468 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
471 # define MHD_SCKT_EACCESS_ EACCES
473 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
476 # define MHD_SCKT_ENETDOWN_ ENETDOWN
478 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
480 #elif defined(MHD_WINSOCK_SOCKETS)
481 # define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
482 # define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
483 # define MHD_SCKT_EINTR_ WSAEINTR
484 # define MHD_SCKT_ECONNRESET_ WSAECONNRESET
485 # define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
486 # define MHD_SCKT_ENOTCONN_ WSAENOTCONN
487 # define MHD_SCKT_EMFILE_ WSAEMFILE
488 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
489 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
490 # define MHD_SCKT_ENOBUFS_ WSAENOBUFS
491 # define MHD_SCKT_EBADF_ WSAEBADF
492 # define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
493 # define MHD_SCKT_EINVAL_ WSAEINVAL
494 # define MHD_SCKT_EFAUL_ WSAEFAULT
495 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
496 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
497 # define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
498 # define MHD_SCKT_EACCESS_ WSAEACCES
499 # define MHD_SCKT_ENETDOWN_ WSAENETDOWN
506 #if defined(MHD_POSIX_SOCKETS)
507 # define MHD_socket_get_error_() (errno)
508 #elif defined(MHD_WINSOCK_SOCKETS)
509 # define MHD_socket_get_error_() WSAGetLastError()
512 #ifdef MHD_WINSOCK_SOCKETS
520 const char* MHD_W32_strerror_winsock_(
int err);
524 #if defined(MHD_POSIX_SOCKETS)
525 # define MHD_socket_strerr_(err) strerror((err))
526 #elif defined(MHD_WINSOCK_SOCKETS)
527 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_((err))
532 #define MHD_socket_last_strerr_() MHD_socket_strerr_(MHD_socket_get_error_())
537 #if defined(MHD_POSIX_SOCKETS)
538 # define MHD_socket_fset_error_(err) (errno = (err))
539 #elif defined(MHD_WINSOCK_SOCKETS)
540 # define MHD_socket_fset_error_(err) (WSASetLastError((err)))
551 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
552 (MHD_socket_fset_error_((err)), !0) : 0 )
559 #if defined(MHD_POSIX_SOCKETS)
561 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
562 (errno = ENOSYS) : (errno = (err)) )
563 # elif defined(EOPNOTSUPP)
564 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
565 (errno = EOPNOTSUPP) : (errno = (err)) )
566 # elif defined (EFAULT)
567 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
568 (errno = EFAULT) : (errno = (err)) )
569 # elif defined (EINVAL)
570 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
571 (errno = EINVAL) : (errno = (err)) )
573 # warning No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
574 # define MHD_socket_set_error_(err) (errno = (err))
576 #elif defined(MHD_WINSOCK_SOCKETS)
577 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
578 (WSASetLastError((WSAEOPNOTSUPP))) : \
579 (WSASetLastError((err))) )
591 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \
603 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_(MHD_socket_get_error_() ,(code))
613 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_EINTR_)
621 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
622 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_EAGAIN_)
624 # define MHD_SCKT_ERR_IS_EAGAIN_(err) ( MHD_SCKT_ERR_IS_((err),MHD_SCKT_EAGAIN_) || \
625 MHD_SCKT_ERR_IS_((err),MHD_SCKT_EWOULDBLOCK_) )
633 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) ( MHD_SCKT_ERR_IS_((err),MHD_SCKT_EMFILE_) || \
634 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ENFILE_) || \
635 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ENOMEM_) || \
636 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ENOBUFS_) )
644 #if defined(MHD_POSIX_SOCKETS)
645 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNABORTED_)
646 #elif defined(MHD_WINSOCK_SOCKETS)
647 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNRESET_)
656 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) ( MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNRESET_) || \
657 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNABORTED_))
665 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
666 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_(MHD_SCKT_ENOMEM_)
667 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
668 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_(MHD_SCKT_ENOBUFS_)
670 # warning No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
671 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_(MHD_SCKT_ENOMEM_)
676 #if defined(AF_LOCAL)
677 # define MHD_SCKT_LOCAL AF_LOCAL
678 #elif defined(AF_UNIX)
679 # define MHD_SCKT_LOCAL AF_UNIX
682 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
683 # define MHD_socket_pair_(fdarr) (!socketpair(MHD_SCKT_LOCAL, SOCK_STREAM, 0, (fdarr)))
684 # if defined(HAVE_SOCK_NONBLOCK)
685 # define MHD_socket_pair_nblk_(fdarr) (!socketpair(MHD_SCKT_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, (fdarr)))
687 #elif defined(MHD_WINSOCK_SOCKETS)
695 int MHD_W32_socket_pair_(SOCKET sockets_pair[2],
int non_blk);
697 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_((fdarr), 0)
698 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_((fdarr), 1)
715 unsigned int fd_setsize);
739 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
740 static const int _MHD_socket_int_one = 1;
747 # define MHD_socket_nosignal_(sock) \
748 (!setsockopt((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one,sizeof(_MHD_socket_int_one)))
additional automatic macros for MHD_config.h
MHD_socket MHD_socket_create_listen_(int pf)
int MHD_add_to_fd_set_(MHD_socket fd, fd_set *set, MHD_socket *max_fd, unsigned int fd_setsize)
size_t MHD_SCKT_SEND_SIZE_
int MHD_socket_nonblocking_(MHD_socket sock)
Helper for obtaining FD_SETSIZE system default value.
limits values definitions
int MHD_socket_noninheritable_(MHD_socket sock)