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 165 #ifdef SOCK_NOSIGPIPE 166 # define MAYBE_SOCK_NOSIGPIPE SOCK_NOSIGPIPE 168 # define MAYBE_SOCK_NOSIGPIPE 0 172 # define MAYBE_MSG_NOSIGNAL MSG_NOSIGNAL 174 # define MAYBE_MSG_NOSIGNAL 0 177 #if !defined(SHUT_WR) && defined(SD_SEND) 178 # define SHUT_WR SD_SEND 180 #if !defined(SHUT_RD) && defined(SD_RECEIVE) 181 # define SHUT_RD SD_RECEIVE 183 #if !defined(SHUT_RDWR) && defined(SD_BOTH) 184 # define SHUT_RDWR SD_BOTH 187 #if HAVE_ACCEPT4+0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE)) 188 # define USE_ACCEPT4 1 191 #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC) 192 # define USE_EPOLL_CREATE1 1 199 #define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10 203 #if defined(TCP_CORK) 207 #define MHD_TCP_CORK_NOPUSH TCP_CORK 208 #elif defined(TCP_NOPUSH) 212 #define MHD_TCP_CORK_NOPUSH TCP_NOPUSH 219 #ifdef MHD_POSIX_SOCKETS 229 #if !defined(MHD_WINSOCK_SOCKETS) 238 #if !defined(MHD_WINSOCK_SOCKETS) 239 # define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX 241 # define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX 254 #if !defined(MHD_WINSOCK_SOCKETS) 255 # define MHD_socket_close_(fd) ((0 == close((fd))) || (EBADF != errno)) 257 # define MHD_socket_close_(fd) (0 == closesocket((fd))) 265 #define MHD_socket_close_chk_(fd) do { \ 266 if (!MHD_socket_close_(fd)) \ 267 MHD_PANIC(_("Close socket failed.\n")); \ 278 #define MHD_send_(s,b,l) \ 279 ((ssize_t)send((s),(const void*)(b),(MHD_SCKT_SEND_SIZE_)(l), MAYBE_MSG_NOSIGNAL)) 289 #define MHD_recv_(s,b,l) \ 290 ((ssize_t)recv((s),(void*)(b),(MHD_SCKT_SEND_SIZE_)(l), 0)) 302 #if defined(MHD_POSIX_SOCKETS) 303 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ((fd) < ((MHD_socket)setsize)) 304 #elif defined(MHD_WINSOCK_SOCKETS) 305 # define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ( ((void*)(pset)==(void*)0) || \ 306 (((fd_set*)(pset))->fd_count < ((unsigned)setsize)) || \ 307 (FD_ISSET((fd),(pset))) ) 318 #define MHD_SCKT_FD_FITS_FDSET_(fd,pset) MHD_SCKT_FD_FITS_FDSET_SETSIZE_((fd),(pset),FD_SETSIZE) 328 #if defined(MHD_POSIX_SOCKETS) 329 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) FD_SET((fd),(pset)) 330 #elif defined(MHD_WINSOCK_SOCKETS) 331 # define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \ 334 fd_set* const _s_ = (fd_set*)(pset); \ 335 while((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array[_i_])) {++_i_;} \ 336 if ((_i_ == _s_->fd_count)) {_s_->fd_array[_s_->fd_count++] = (fd);} \ 341 #if !defined(MHD_WINSOCK_SOCKETS) 342 # define MHD_SYS_select_(n,r,w,e,t) select((n),(r),(w),(e),(t)) 344 # define MHD_SYS_select_(n,r,w,e,t) \ 345 ( ( (((void*)(r) == (void*)0) || ((fd_set*)(r))->fd_count == 0) && \ 346 (((void*)(w) == (void*)0) || ((fd_set*)(w))->fd_count == 0) && \ 347 (((void*)(e) == (void*)0) || ((fd_set*)(e))->fd_count == 0) ) ? \ 348 ( ((void*)(t) == (void*)0) ? 0 : \ 349 (Sleep(((struct timeval*)(t))->tv_sec * 1000 + \ 350 ((struct timeval*)(t))->tv_usec / 1000), 0) ) : \ 351 (select((int)0,(r),(w),(e),(t))) ) 354 #if defined(HAVE_POLL) 356 # if !defined(MHD_WINSOCK_SOCKETS) 357 # define MHD_sys_poll_ poll 359 # define MHD_sys_poll_ WSAPoll 363 # define MHD_POLLPRI_OR_ZERO POLLPRI 365 # define MHD_POLLPRI_OR_ZERO 0 368 # define MHD_POLLRDBAND_OR_ZERO POLLRDBAND 370 # define MHD_POLLRDBAND_OR_ZERO 0 373 # define MHD_POLLNVAL_OR_ZERO POLLNVAL 375 # define MHD_POLLNVAL_OR_ZERO 0 380 # if defined(_WIN32) && ! defined(__CYGWIN__) 381 # define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND 382 # elif defined(__linux__) 383 # define MHD_POLL_EVENTS_ERR_DISC POLLPRI 385 # define MHD_POLL_EVENTS_ERR_DISC (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO) 389 # define MHD_POLL_REVENTS_ERR_DISC \ 390 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO | POLLERR | POLLHUP) 393 # define MHD_POLL_REVENTS_ERRROR \ 394 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO | POLLERR) 397 #define MHD_SCKT_MISSING_ERR_CODE_ 31450 399 #if defined(MHD_POSIX_SOCKETS) 401 # define MHD_SCKT_EAGAIN_ EAGAIN 402 # elif defined(EWOULDBLOCK) 403 # define MHD_SCKT_EAGAIN_ EWOULDBLOCK 405 # define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_ 407 # if defined(EWOULDBLOCK) 408 # define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK 409 # elif defined(EAGAIN) 410 # define MHD_SCKT_EWOULDBLOCK_ EAGAIN 412 # define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_ 415 # define MHD_SCKT_EINTR_ EINTR 417 # define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_ 420 # define MHD_SCKT_ECONNRESET_ ECONNRESET 422 # define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_ 425 # define MHD_SCKT_ECONNABORTED_ ECONNABORTED 427 # define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_ 430 # define MHD_SCKT_ENOTCONN_ ENOTCONN 432 # define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_ 435 # define MHD_SCKT_EMFILE_ EMFILE 437 # define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_ 440 # define MHD_SCKT_ENFILE_ ENFILE 442 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_ 445 # define MHD_SCKT_ENOMEM_ ENOMEM 447 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_ 450 # define MHD_SCKT_ENOBUFS_ ENOBUFS 452 # define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_ 455 # define MHD_SCKT_EBADF_ EBADF 457 # define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_ 460 # define MHD_SCKT_ENOTSOCK_ ENOTSOCK 462 # define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_ 465 # define MHD_SCKT_EINVAL_ EINVAL 467 # define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_ 470 # define MHD_SCKT_EFAUL_ EFAULT 472 # define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_ 475 # define MHD_SCKT_ENOSYS_ ENOSYS 477 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_ 480 # define MHD_SCKT_ENOTSUP_ ENOTSUP 482 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_ 485 # define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP 487 # define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_ 490 # define MHD_SCKT_EACCESS_ EACCES 492 # define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_ 495 # define MHD_SCKT_ENETDOWN_ ENETDOWN 497 # define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_ 499 #elif defined(MHD_WINSOCK_SOCKETS) 500 # define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK 501 # define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK 502 # define MHD_SCKT_EINTR_ WSAEINTR 503 # define MHD_SCKT_ECONNRESET_ WSAECONNRESET 504 # define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED 505 # define MHD_SCKT_ENOTCONN_ WSAENOTCONN 506 # define MHD_SCKT_EMFILE_ WSAEMFILE 507 # define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_ 508 # define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_ 509 # define MHD_SCKT_ENOBUFS_ WSAENOBUFS 510 # define MHD_SCKT_EBADF_ WSAEBADF 511 # define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK 512 # define MHD_SCKT_EINVAL_ WSAEINVAL 513 # define MHD_SCKT_EFAUL_ WSAEFAULT 514 # define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_ 515 # define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_ 516 # define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP 517 # define MHD_SCKT_EACCESS_ WSAEACCES 518 # define MHD_SCKT_ENETDOWN_ WSAENETDOWN 525 #if defined(MHD_POSIX_SOCKETS) 526 # define MHD_socket_get_error_() (errno) 527 #elif defined(MHD_WINSOCK_SOCKETS) 528 # define MHD_socket_get_error_() WSAGetLastError() 531 #ifdef MHD_WINSOCK_SOCKETS 539 const char* MHD_W32_strerror_winsock_(
int err);
543 #if defined(MHD_POSIX_SOCKETS) 544 # define MHD_socket_strerr_(err) strerror((err)) 545 #elif defined(MHD_WINSOCK_SOCKETS) 546 # define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_((err)) 551 #define MHD_socket_last_strerr_() MHD_socket_strerr_(MHD_socket_get_error_()) 556 #if defined(MHD_POSIX_SOCKETS) 557 # define MHD_socket_fset_error_(err) (errno = (err)) 558 #elif defined(MHD_WINSOCK_SOCKETS) 559 # define MHD_socket_fset_error_(err) (WSASetLastError((err))) 570 #define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \ 571 (MHD_socket_fset_error_((err)), !0) : 0 ) 578 #if defined(MHD_POSIX_SOCKETS) 580 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 581 (errno = ENOSYS) : (errno = (err)) ) 582 # elif defined(EOPNOTSUPP) 583 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 584 (errno = EOPNOTSUPP) : (errno = (err)) ) 585 # elif defined (EFAULT) 586 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 587 (errno = EFAULT) : (errno = (err)) ) 588 # elif defined (EINVAL) 589 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 590 (errno = EINVAL) : (errno = (err)) ) 592 # warning No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system. 593 # define MHD_socket_set_error_(err) (errno = (err)) 595 #elif defined(MHD_WINSOCK_SOCKETS) 596 # define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \ 597 (WSASetLastError((WSAEOPNOTSUPP))) : \ 598 (WSASetLastError((err))) ) 610 #define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \ 622 #define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_(MHD_socket_get_error_() ,(code)) 632 #define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_EINTR_) 640 #if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_ 641 # define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_EAGAIN_) 643 # define MHD_SCKT_ERR_IS_EAGAIN_(err) ( MHD_SCKT_ERR_IS_((err),MHD_SCKT_EAGAIN_) || \ 644 MHD_SCKT_ERR_IS_((err),MHD_SCKT_EWOULDBLOCK_) ) 652 #define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) ( MHD_SCKT_ERR_IS_((err),MHD_SCKT_EMFILE_) || \ 653 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ENFILE_) || \ 654 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ENOMEM_) || \ 655 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ENOBUFS_) ) 663 #if defined(MHD_POSIX_SOCKETS) 664 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNABORTED_) 665 #elif defined(MHD_WINSOCK_SOCKETS) 666 # define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNRESET_) 675 #define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) ( MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNRESET_) || \ 676 MHD_SCKT_ERR_IS_((err),MHD_SCKT_ECONNABORTED_)) 684 #if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_ 685 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_(MHD_SCKT_ENOMEM_) 686 #elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_ 687 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_(MHD_SCKT_ENOBUFS_) 689 # warning No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system. 690 # define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_(MHD_SCKT_ENOMEM_) 695 #if defined(AF_LOCAL) 696 # define MHD_SCKT_LOCAL AF_LOCAL 697 #elif defined(AF_UNIX) 698 # define MHD_SCKT_LOCAL AF_UNIX 701 #if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL) 702 # define MHD_socket_pair_(fdarr) (!socketpair(MHD_SCKT_LOCAL, SOCK_STREAM, 0, (fdarr))) 703 # if defined(HAVE_SOCK_NONBLOCK) 704 # define MHD_socket_pair_nblk_(fdarr) (!socketpair(MHD_SCKT_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, (fdarr))) 706 #elif defined(MHD_WINSOCK_SOCKETS) 714 int MHD_W32_socket_pair_(SOCKET sockets_pair[2],
int non_blk);
716 # define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_((fdarr), 0) 717 # define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_((fdarr), 1) 734 unsigned int fd_setsize);
768 #if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE) 769 static const int _MHD_socket_int_one = 1;
776 # define MHD_socket_nosignal_(sock) \ 777 (!setsockopt((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one,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_buffering_reset_(MHD_socket sock)
int MHD_socket_noninheritable_(MHD_socket sock)
size_t MHD_SCKT_SEND_SIZE_
Helper for obtaining FD_SETSIZE system default value.
MHD_socket MHD_socket_create_listen_(int pf)
limits values definitions