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;
127 #ifdef _MHD_FD_SETSIZE_IS_DEFAULT 128 # define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE 131 # define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value () 138 # define MHD_PANIC(msg) do { fprintf (stderr, \ 139 "Abnormal termination at %d line in file %s: %s\n", \ 140 (int) __LINE__, __FILE__, msg); abort (); \ 144 #ifndef MHD_SOCKET_DEFINED 148 # if defined(MHD_POSIX_SOCKETS) 150 # define MHD_INVALID_SOCKET (-1) 151 # elif defined(MHD_WINSOCK_SOCKETS) 153 # define MHD_INVALID_SOCKET (INVALID_SOCKET) 156 # define MHD_SOCKET_DEFINED 1 160 # define MAYBE_SOCK_CLOEXEC SOCK_CLOEXEC 162 # define MAYBE_SOCK_CLOEXEC 0 165 #ifdef HAVE_SOCK_NONBLOCK 166 # define MAYBE_SOCK_NONBLOCK SOCK_NONBLOCK 168 # define MAYBE_SOCK_NONBLOCK 0 171 #ifdef SOCK_NOSIGPIPE 172 # define MAYBE_SOCK_NOSIGPIPE SOCK_NOSIGPIPE 174 # define MAYBE_SOCK_NOSIGPIPE 0 178 # define MAYBE_MSG_NOSIGNAL MSG_NOSIGNAL 180 # define MAYBE_MSG_NOSIGNAL 0 183 #if ! defined(SHUT_WR) && defined(SD_SEND) 184 # define SHUT_WR SD_SEND 186 #if ! defined(SHUT_RD) && defined(SD_RECEIVE) 187 # define SHUT_RD SD_RECEIVE 189 #if ! defined(SHUT_RDWR) && defined(SD_BOTH) 190 # define SHUT_RDWR SD_BOTH 193 #if HAVE_ACCEPT4 + 0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || \ 194 defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE)) 195 # define USE_ACCEPT4 1 198 #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC) 199 # define USE_EPOLL_CREATE1 1 206 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10 210 #if defined(TCP_CORK) 214 #define MHD_TCP_CORK_NOPUSH TCP_CORK 215 #elif defined(TCP_NOPUSH) 219 #define MHD_TCP_CORK_NOPUSH TCP_NOPUSH 226 #ifdef MHD_POSIX_SOCKETS 236 #if ! defined(MHD_WINSOCK_SOCKETS) 245 #if ! defined(MHD_WINSOCK_SOCKETS) 246 # define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX 248 # define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX 261 #if ! defined(MHD_WINSOCK_SOCKETS) 262 # define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno)) 264 # define MHD_socket_close_(fd) (0 == closesocket ((fd))) 272 #define MHD_socket_close_chk_(fd) do { \ 273 if (! MHD_socket_close_ (fd)) \ 274 MHD_PANIC (_ ("Close socket failed.\n")); \ 285 #define MHD_send_(s,b,l) \ 286 ((ssize_t) send ((s),(const void*) (b),(MHD_SCKT_SEND_SIZE_) (l), \ 297 #define MHD_recv_(s,b,l) \ 298 ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0)) 310 #if defined(MHD_POSIX_SOCKETS) 311 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ((fd) < \ 314 #elif defined(MHD_WINSOCK_SOCKETS) 315 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ( ((void*) (pset)== \ 317 (((fd_set*) (pset)) \ 333 #define MHD_SCKT_FD_FITS_FDSET_(fd,pset) MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), \ 345 #if defined(MHD_POSIX_SOCKETS) 346 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) FD_SET ((fd), \ 348 #elif defined(MHD_WINSOCK_SOCKETS) 349 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \ 352 fd_set*const _s_ = (fd_set*) (pset); \ 353 while ((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array [_i_])) {++_i_;} \ 354 if ((_i_ == _s_->fd_count)) {_s_->fd_array [_s_->fd_count ++] = (fd);} \ 359 #if ! defined(MHD_WINSOCK_SOCKETS) 360 # define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t)) 362 # define MHD_SYS_select_(n,r,w,e,t) \ 363 ( ( (((void*) (r) == (void*) 0) || ((fd_set*) (r))->fd_count == 0) && \ 364 (((void*) (w) == (void*) 0) || ((fd_set*) (w))->fd_count == 0) && \ 365 (((void*) (e) == (void*) 0) || ((fd_set*) (e))->fd_count == 0) ) ? \ 366 ( ((void*) (t) == (void*) 0) ? 0 : \ 367 (Sleep (((struct timeval*) (t))->tv_sec * 1000 \ 368 + ((struct timeval*) (t))->tv_usec / 1000), 0) ) : \ 369 (select ((int) 0,(r),(w),(e),(t))) ) 372 #if defined(HAVE_POLL) 374 # if ! defined(MHD_WINSOCK_SOCKETS) 375 # define MHD_sys_poll_ poll 377 # define MHD_sys_poll_ WSAPoll 381 # define MHD_POLLPRI_OR_ZERO POLLPRI 383 # define MHD_POLLPRI_OR_ZERO 0 386 # define MHD_POLLRDBAND_OR_ZERO POLLRDBAND 388 # define MHD_POLLRDBAND_OR_ZERO 0 391 # define MHD_POLLNVAL_OR_ZERO POLLNVAL 393 # define MHD_POLLNVAL_OR_ZERO 0 398 # if defined(_WIN32) && ! defined(__CYGWIN__) 399 # define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND 400 # elif defined(__linux__) 401 # define MHD_POLL_EVENTS_ERR_DISC POLLPRI 403 # define MHD_POLL_EVENTS_ERR_DISC (MHD_POLLPRI_OR_ZERO \ 404 | MHD_POLLRDBAND_OR_ZERO) 408 # define MHD_POLL_REVENTS_ERR_DISC \ 409 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \ 413 # define MHD_POLL_REVENTS_ERRROR \ 414 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \ 418 #define MHD_SCKT_MISSING_ERR_CODE_ 31450 420 #if defined(MHD_POSIX_SOCKETS) 422 # define MHD_SCKT_EAGAIN_ EAGAIN 423 # elif defined(EWOULDBLOCK) 424 # define MHD_SCKT_EAGAIN_ EWOULDBLOCK 426 # define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_ 428 # if defined(EWOULDBLOCK) 429 # define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK 430 # elif defined(EAGAIN) 431 # define MHD_SCKT_EWOULDBLOCK_ EAGAIN 433 # define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_ 436 # define MHD_SCKT_EINTR_ EINTR 438 # define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_ 441 # define MHD_SCKT_ECONNRESET_ ECONNRESET 443 # define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_ 446 # define MHD_SCKT_ECONNABORTED_ ECONNABORTED 448 # define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_ 451 # define MHD_SCKT_ENOTCONN_ ENOTCONN 453 # define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_ 456 # define MHD_SCKT_EMFILE_ EMFILE 458 # define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_ 461 # define MHD_SCKT_ENFILE_ ENFILE 463 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_ 466 # define MHD_SCKT_ENOMEM_ ENOMEM 468 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_ 471 # define MHD_SCKT_ENOBUFS_ ENOBUFS 473 # define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_ 476 # define MHD_SCKT_EBADF_ EBADF 478 # define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_ 481 # define MHD_SCKT_ENOTSOCK_ ENOTSOCK 483 # define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_ 486 # define MHD_SCKT_EINVAL_ EINVAL 488 # define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_ 491 # define MHD_SCKT_EFAUL_ EFAULT 493 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_ 496 # define MHD_SCKT_ENOSYS_ ENOSYS 498 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_ 501 # define MHD_SCKT_ENOTSUP_ ENOTSUP 503 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_ 506 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP 508 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_ 511 # define MHD_SCKT_EACCESS_ EACCES 513 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_ 516 # define MHD_SCKT_ENETDOWN_ ENETDOWN 518 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_ 520 #elif defined(MHD_WINSOCK_SOCKETS) 521 # define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK 522 # define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK 523 # define MHD_SCKT_EINTR_ WSAEINTR 524 # define MHD_SCKT_ECONNRESET_ WSAECONNRESET 525 # define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED 526 # define MHD_SCKT_ENOTCONN_ WSAENOTCONN 527 # define MHD_SCKT_EMFILE_ WSAEMFILE 528 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_ 529 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_ 530 # define MHD_SCKT_ENOBUFS_ WSAENOBUFS 531 # define MHD_SCKT_EBADF_ WSAEBADF 532 # define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK 533 # define MHD_SCKT_EINVAL_ WSAEINVAL 534 # define MHD_SCKT_EFAUL_ WSAEFAULT 535 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_ 536 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_ 537 # define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP 538 # define MHD_SCKT_EACCESS_ WSAEACCES 539 # define MHD_SCKT_ENETDOWN_ WSAENETDOWN 546 #if defined(MHD_POSIX_SOCKETS) 547 # define MHD_socket_get_error_() (errno) 548 #elif defined(MHD_WINSOCK_SOCKETS) 549 # define MHD_socket_get_error_() WSAGetLastError () 552 #ifdef MHD_WINSOCK_SOCKETS 560 const char*MHD_W32_strerror_winsock_ (
int err);
565 #if defined(MHD_POSIX_SOCKETS) 566 # define MHD_socket_strerr_(err) strerror ((err)) 567 #elif defined(MHD_WINSOCK_SOCKETS) 568 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err)) 573 #define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ()) 578 #if defined(MHD_POSIX_SOCKETS) 579 # define MHD_socket_fset_error_(err) (errno = (err)) 580 #elif defined(MHD_WINSOCK_SOCKETS) 581 # define MHD_socket_fset_error_(err) (WSASetLastError ((err))) 592 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \ 593 (MHD_socket_fset_error_ ((err)), ! 0) : \ 601 #if defined(MHD_POSIX_SOCKETS) 603 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 604 (errno = ENOSYS) : (errno = (err)) ) 605 # elif defined(EOPNOTSUPP) 606 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 607 (errno = EOPNOTSUPP) : (errno = \ 609 # elif defined (EFAULT) 610 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 611 (errno = EFAULT) : (errno = (err)) ) 612 # elif defined (EINVAL) 613 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 614 (errno = EINVAL) : (errno = (err)) ) 617 No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system. 618 # define MHD_socket_set_error_(err) (errno = (err)) 620 #elif defined(MHD_WINSOCK_SOCKETS) 621 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 622 (WSASetLastError ((WSAEOPNOTSUPP))) : \ 623 (WSASetLastError ((err))) ) 635 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \ 647 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), \ 658 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_) 666 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_ 667 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_) 669 # define MHD_SCKT_ERR_IS_EAGAIN_(err) (MHD_SCKT_ERR_IS_ ((err), \ 670 MHD_SCKT_EAGAIN_) || \ 671 MHD_SCKT_ERR_IS_ ((err), \ 672 MHD_SCKT_EWOULDBLOCK_) ) 680 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) (MHD_SCKT_ERR_IS_ ((err), \ 683 MHD_SCKT_ERR_IS_ ((err), \ 686 MHD_SCKT_ERR_IS_ ((err), \ 689 MHD_SCKT_ERR_IS_ ((err), \ 698 #if defined(MHD_POSIX_SOCKETS) 699 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \ 700 MHD_SCKT_ECONNABORTED_) 701 #elif defined(MHD_WINSOCK_SOCKETS) 702 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \ 703 MHD_SCKT_ECONNRESET_) 712 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) (MHD_SCKT_ERR_IS_ ((err), \ 713 MHD_SCKT_ECONNRESET_) \ 715 MHD_SCKT_ERR_IS_ ((err), \ 716 MHD_SCKT_ECONNABORTED_)) 724 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_ 725 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \ 727 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_ 728 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \ 732 No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system. 733 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \ 739 #if defined(AF_LOCAL) 740 # define MHD_SCKT_LOCAL AF_LOCAL 741 #elif defined(AF_UNIX) 742 # define MHD_SCKT_LOCAL AF_UNIX 745 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL) 746 # define MHD_socket_pair_(fdarr) (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, \ 748 # if defined(HAVE_SOCK_NONBLOCK) 749 # define MHD_socket_pair_nblk_(fdarr) (! socketpair (MHD_SCKT_LOCAL, \ 751 | SOCK_NONBLOCK, 0, \ 754 #elif defined(MHD_WINSOCK_SOCKETS) 762 int MHD_W32_socket_pair_ (SOCKET sockets_pair[2],
int non_blk);
764 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0) 765 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1) 782 unsigned int fd_setsize);
853 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE) 854 static const int _MHD_socket_int_one = 1;
861 #define MHD_socket_nosignal_(sock) \ 862 (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \ 863 sizeof(_MHD_socket_int_one))) 864 #elif defined(MHD_POSIX_SOCKETS) && defined(SOCK_NOSIGPIPE) && \ 865 defined(SOCK_CLOEXEC) 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)
int MHD_socket_cork_(MHD_socket sock, bool on)
int MHD_socket_buffering_reset_(MHD_socket sock)
int MHD_socket_noninheritable_(MHD_socket sock)
size_t MHD_SCKT_SEND_SIZE_
int MHD_socket_set_nodelay_(MHD_socket sock, bool on)
Helper for obtaining FD_SETSIZE system default value.
MHD_socket MHD_socket_create_listen_(int pf)
limits values definitions