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);
560 #if defined(MHD_POSIX_SOCKETS) 561 # define MHD_socket_strerr_(err) strerror ((err)) 562 #elif defined(MHD_WINSOCK_SOCKETS) 563 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err)) 568 #define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ()) 573 #if defined(MHD_POSIX_SOCKETS) 574 # define MHD_socket_fset_error_(err) (errno = (err)) 575 #elif defined(MHD_WINSOCK_SOCKETS) 576 # define MHD_socket_fset_error_(err) (WSASetLastError ((err))) 587 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \ 588 (MHD_socket_fset_error_ ((err)), ! 0) : \ 596 #if defined(MHD_POSIX_SOCKETS) 598 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 599 (errno = ENOSYS) : (errno = (err)) ) 600 # elif defined(EOPNOTSUPP) 601 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 602 (errno = EOPNOTSUPP) : (errno = \ 604 # elif defined (EFAULT) 605 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 606 (errno = EFAULT) : (errno = (err)) ) 607 # elif defined (EINVAL) 608 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 609 (errno = EINVAL) : (errno = (err)) ) 612 No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system. 613 # define MHD_socket_set_error_(err) (errno = (err)) 615 #elif defined(MHD_WINSOCK_SOCKETS) 616 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 617 (WSASetLastError ((WSAEOPNOTSUPP))) : \ 618 (WSASetLastError ((err))) ) 630 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \ 642 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), \ 653 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_) 661 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_ 662 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_) 664 # define MHD_SCKT_ERR_IS_EAGAIN_(err) (MHD_SCKT_ERR_IS_ ((err), \ 665 MHD_SCKT_EAGAIN_) || \ 666 MHD_SCKT_ERR_IS_ ((err), \ 667 MHD_SCKT_EWOULDBLOCK_) ) 675 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) (MHD_SCKT_ERR_IS_ ((err), \ 678 MHD_SCKT_ERR_IS_ ((err), \ 681 MHD_SCKT_ERR_IS_ ((err), \ 684 MHD_SCKT_ERR_IS_ ((err), \ 693 #if defined(MHD_POSIX_SOCKETS) 694 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \ 695 MHD_SCKT_ECONNABORTED_) 696 #elif defined(MHD_WINSOCK_SOCKETS) 697 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \ 698 MHD_SCKT_ECONNRESET_) 707 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) (MHD_SCKT_ERR_IS_ ((err), \ 708 MHD_SCKT_ECONNRESET_) \ 710 MHD_SCKT_ERR_IS_ ((err), \ 711 MHD_SCKT_ECONNABORTED_)) 719 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_ 720 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \ 722 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_ 723 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \ 727 No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system. 728 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \ 734 #if defined(AF_LOCAL) 735 # define MHD_SCKT_LOCAL AF_LOCAL 736 #elif defined(AF_UNIX) 737 # define MHD_SCKT_LOCAL AF_UNIX 740 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL) 741 # define MHD_socket_pair_(fdarr) (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, \ 743 # if defined(HAVE_SOCK_NONBLOCK) 744 # define MHD_socket_pair_nblk_(fdarr) (! socketpair (MHD_SCKT_LOCAL, \ 746 | SOCK_NONBLOCK, 0, \ 749 #elif defined(MHD_WINSOCK_SOCKETS) 757 int MHD_W32_socket_pair_ (SOCKET sockets_pair[2],
int non_blk);
759 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0) 760 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1) 777 unsigned int fd_setsize);
848 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE) 849 static const int _MHD_socket_int_one = 1;
856 # define MHD_socket_nosignal_(sock) \ 857 (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \ 858 sizeof(_MHD_socket_int_one))) 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