GNU libmicrohttpd 1.0.0
Loading...
Searching...
No Matches
mhd_sockets.h
Go to the documentation of this file.
1/*
2 This file is part of libmicrohttpd
3 Copyright (C) 2014-2023 Karlson2k (Evgeny Grin)
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
19*/
20
32
33#ifndef MHD_SOCKETS_H
34#define MHD_SOCKETS_H 1
35#include "mhd_options.h"
36
37#include <errno.h>
38#ifdef HAVE_STDBOOL_H
39#include <stdbool.h>
40#endif /* HAVE_STDBOOL_H */
41#ifdef HAVE_UNISTD_H
42#include <unistd.h>
43#endif /* HAVE_UNISTD_H */
44#include <fcntl.h>
45#ifdef HAVE_STDDEF_H
46#include <stddef.h>
47#endif /* HAVE_STDDEF_H */
48#if defined(_MSC_FULL_VER) && ! defined(_SSIZE_T_DEFINED)
49# include <stdint.h>
50# define _SSIZE_T_DEFINED
51typedef intptr_t ssize_t;
52#endif /* !_SSIZE_T_DEFINED */
53
54#if ! defined(MHD_POSIX_SOCKETS) && ! defined(MHD_WINSOCK_SOCKETS)
55# if ! defined(_WIN32) || defined(__CYGWIN__)
56# define MHD_POSIX_SOCKETS 1
57# else /* defined(_WIN32) && !defined(__CYGWIN__) */
58# define MHD_WINSOCK_SOCKETS 1
59# endif /* defined(_WIN32) && !defined(__CYGWIN__) */
60#endif /* !MHD_POSIX_SOCKETS && !MHD_WINSOCK_SOCKETS */
61
62/*
63 * MHD require headers that define socket type, socket basic functions
64 * (socket(), accept(), listen(), bind(), send(), recv(), select()), socket
65 * parameters like SOCK_CLOEXEC, SOCK_NONBLOCK, additional socket functions
66 * (poll(), epoll(), accept4()), struct timeval and other types, required
67 * for socket function.
68 */
69#if defined(MHD_POSIX_SOCKETS)
70# ifdef HAVE_SYS_TYPES_H
71# include <sys/types.h> /* required on old platforms */
72# endif
73# ifdef HAVE_SYS_TIME_H
74# include <sys/time.h>
75# endif
76# ifdef HAVE_TIME_H
77# include <time.h>
78# endif
79# ifdef HAVE_STRING_H
80# include <string.h> /* for strerror() */
81# endif
82# ifdef HAVE_SYS_SOCKET_H
83# include <sys/socket.h>
84# endif
85# if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS)
86# include <strings.h> /* required for FD_SET (bzero() function) */
87# ifdef HAVE_SOCKLIB_H
88# include <sockLib.h>
89# endif /* HAVE_SOCKLIB_H */
90# ifdef HAVE_INETLIB_H
91# include <inetLib.h>
92# endif /* HAVE_INETLIB_H */
93# endif /* __VXWORKS__ || __vxworks || OS_VXWORKS */
94# ifdef HAVE_NETINET_IN_H
95# include <netinet/in.h>
96# endif /* HAVE_NETINET_IN_H */
97# ifdef HAVE_ARPA_INET_H
98# include <arpa/inet.h>
99# endif
100# ifdef HAVE_NET_IF_H
101# include <net/if.h>
102# endif
103# ifdef HAVE_NETDB_H
104# include <netdb.h>
105# endif
106# ifdef HAVE_SYS_SELECT_H
107# include <sys/select.h>
108# endif
109# ifdef EPOLL_SUPPORT
110# include <sys/epoll.h>
111# endif
112# ifdef HAVE_NETINET_TCP_H
113/* for TCP_FASTOPEN and TCP_CORK */
114# include <netinet/tcp.h>
115# endif
116#elif defined(MHD_WINSOCK_SOCKETS)
117# ifndef WIN32_LEAN_AND_MEAN
118# define WIN32_LEAN_AND_MEAN 1
119# endif /* !WIN32_LEAN_AND_MEAN */
120# include <winsock2.h>
121# include <ws2tcpip.h>
122#endif /* MHD_WINSOCK_SOCKETS */
123
124#if defined(HAVE_POLL_H) && defined(HAVE_POLL)
125# include <poll.h>
126#endif
127
128
129#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
130#include <sys/param.h> /* For __FreeBSD_version */
131#endif /* __FreeBSD__ */
132
133#include "mhd_limits.h"
134
135#ifdef _MHD_FD_SETSIZE_IS_DEFAULT
136# define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE
137#else /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
138# ifndef MHD_SYS_FD_SETSIZE_
139# include "sysfdsetsize.h"
140# define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value ()
141# else /* MHD_SYS_FD_SETSIZE_ */
142# define _MHD_SYS_DEFAULT_FD_SETSIZE MHD_SYS_FD_SETSIZE_
143# endif /* MHD_SYS_FD_SETSIZE_ */
144#endif /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
145
146#ifndef MHD_PANIC
147# include <stdio.h>
148# include <stdlib.h>
149/* Simple implementation of MHD_PANIC, to be used outside lib */
150# define MHD_PANIC(msg) \
151 do { fprintf (stderr, \
152 "Abnormal termination at %d line in file %s: %s\n", \
153 (int) __LINE__, __FILE__, msg); abort (); \
154} while (0)
155#endif /* ! MHD_PANIC */
156
157#ifndef MHD_SOCKET_DEFINED
161# if defined(MHD_POSIX_SOCKETS)
162typedef int MHD_socket;
163# define MHD_INVALID_SOCKET (-1)
164# elif defined(MHD_WINSOCK_SOCKETS)
165typedef SOCKET MHD_socket;
166# define MHD_INVALID_SOCKET (INVALID_SOCKET)
167# endif /* MHD_WINSOCK_SOCKETS */
168
169# define MHD_SOCKET_DEFINED 1
170#endif /* ! MHD_SOCKET_DEFINED */
171
172#ifdef SOCK_CLOEXEC
173# define SOCK_CLOEXEC_OR_ZERO SOCK_CLOEXEC
174#else /* ! SOCK_CLOEXEC */
175# define SOCK_CLOEXEC_OR_ZERO 0
176#endif /* ! SOCK_CLOEXEC */
177
178#ifdef HAVE_SOCK_NONBLOCK
179# define SOCK_NONBLOCK_OR_ZERO SOCK_NONBLOCK
180#else /* ! HAVE_SOCK_NONBLOCK */
181# define SOCK_NONBLOCK_OR_ZERO 0
182#endif /* ! HAVE_SOCK_NONBLOCK */
183
184#ifdef SOCK_NOSIGPIPE
185# define SOCK_NOSIGPIPE_OR_ZERO SOCK_NOSIGPIPE
186#else /* ! HAVE_SOCK_NONBLOCK */
187# define SOCK_NOSIGPIPE_OR_ZERO 0
188#endif /* ! HAVE_SOCK_NONBLOCK */
189
190#ifdef MSG_NOSIGNAL
191# define MSG_NOSIGNAL_OR_ZERO MSG_NOSIGNAL
192#else /* ! MSG_NOSIGNAL */
193# define MSG_NOSIGNAL_OR_ZERO 0
194#endif /* ! MSG_NOSIGNAL */
195
196#if ! defined(SHUT_WR) && defined(SD_SEND)
197# define SHUT_WR SD_SEND
198#endif
199#if ! defined(SHUT_RD) && defined(SD_RECEIVE)
200# define SHUT_RD SD_RECEIVE
201#endif
202#if ! defined(SHUT_RDWR) && defined(SD_BOTH)
203# define SHUT_RDWR SD_BOTH
204#endif
205
206#if defined(HAVE_ACCEPT4) && (defined(HAVE_SOCK_NONBLOCK) || \
207 defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE))
208# define USE_ACCEPT4 1
209#endif
210
211#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
212 defined(__OpenBSD__) || defined(__NetBSD__) || \
213 defined(MHD_WINSOCK_SOCKETS) || defined(__MACH__) || defined(__sun) || \
214 defined(SOMEBSD)
215/* Most of OSes inherit nonblocking setting from the listen socket */
216#define MHD_ACCEPT_INHERIT_NONBLOCK 1
217#endif
218
219#if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
220# define USE_EPOLL_CREATE1 1
221#endif /* HAVE_EPOLL_CREATE1 && EPOLL_CLOEXEC */
222
223#ifdef TCP_FASTOPEN
227#define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
228#endif
229
230
231#if defined(TCP_CORK)
235#define MHD_TCP_CORK_NOPUSH TCP_CORK
236#elif defined(TCP_NOPUSH)
240#define MHD_TCP_CORK_NOPUSH TCP_NOPUSH
241#endif /* TCP_NOPUSH */
242
243
244#ifdef MHD_TCP_CORK_NOPUSH
245#ifdef __linux__
249#define _MHD_CORK_RESET_PUSH_DATA 1
254#define _MHD_CORK_RESET_PUSH_DATA_ALWAYS 1
255#endif /* __linux__ */
256#if (defined(__FreeBSD__) && \
257 ((__FreeBSD__ + 0) >= 5 || (__FreeBSD_version + 0) >= 450000)) || \
258 (defined(__FreeBSD_kernel_version) && \
259 (__FreeBSD_kernel_version + 0) >= 450000)
260/* FreeBSD pushes data to the network with reset of TCP_NOPUSH
261 * starting from version 4.5. */
265#define _MHD_CORK_RESET_PUSH_DATA 1
266#endif /* __FreeBSD_version >= 450000 */
267#ifdef __OpenBSD__
268/* OpenBSD took implementation from FreeBSD */
272#define _MHD_CORK_RESET_PUSH_DATA 1
273#endif /* __OpenBSD__ */
274#endif /* MHD_TCP_CORK_NOPUSH */
275
276#ifdef __linux__
280#define _MHD_NODELAY_SET_PUSH_DATA 1
285#define _MHD_NODELAY_SET_PUSH_DATA_ALWAYS 1
286#endif /* __linux__ */
287
288#ifdef MSG_MORE
289#ifdef __linux__
290/* MSG_MORE signal kernel to buffer outbond data and works like
291 * TCP_CORK per call without actually setting TCP_CORK value.
292 * It's known to work on Linux. Add more OSes if they are compatible. */
296#define MHD_USE_MSG_MORE 1
297#endif /* __linux__ */
298#endif /* MSG_MORE */
299
300
304#ifdef MHD_POSIX_SOCKETS
305typedef int MHD_SCKT_OPT_BOOL_;
306#else /* MHD_WINSOCK_SOCKETS */
307typedef BOOL MHD_SCKT_OPT_BOOL_;
308#endif /* MHD_WINSOCK_SOCKETS */
309
314#if ! defined(MHD_WINSOCK_SOCKETS)
315typedef size_t MHD_SCKT_SEND_SIZE_;
316#else
317typedef int MHD_SCKT_SEND_SIZE_;
318#endif
319
323#if ! defined(MHD_WINSOCK_SOCKETS)
324# define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
325#else
326# define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
327#endif
328
339#if ! defined(MHD_WINSOCK_SOCKETS)
340# define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno))
341#else
342# define MHD_socket_close_(fd) (0 == closesocket ((fd)))
343#endif
344
350#define MHD_socket_close_chk_(fd) do { \
351 if (! MHD_socket_close_ (fd)) \
352 MHD_PANIC (_ ("Close socket failed.\n")); \
353} while (0)
354
355
364#define MHD_send4_(s,b,l,f) \
365 ((ssize_t) send ((s),(const void*) (b),(MHD_SCKT_SEND_SIZE_) (l), \
366 ((MSG_NOSIGNAL_OR_ZERO) | (f))))
367
368
376#define MHD_send_(s,b,l) MHD_send4_((s),(b),(l), 0)
377
378
386#define MHD_recv_(s,b,l) \
387 ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0))
388
389
399#if defined(MHD_POSIX_SOCKETS)
400# define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) \
401 ((fd) < ((MHD_socket) (setsize)))
402#elif defined(MHD_WINSOCK_SOCKETS)
403# define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) \
404 ( ((void*) (pset)== (void*) 0) || \
405 (((fd_set*) (pset))->fd_count < ((unsigned) setsize)) || \
406 (FD_ISSET ((fd), (pset))) )
407#endif
408
417#define MHD_SCKT_FD_FITS_FDSET_(fd,pset) \
418 MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), (pset), FD_SETSIZE)
419
428#if defined(MHD_POSIX_SOCKETS)
429# define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
430 FD_SET ((fd), (pset))
431#elif defined(MHD_WINSOCK_SOCKETS)
432# define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
433 do { \
434 u_int _i_ = 0; \
435 fd_set*const _s_ = (fd_set*) (pset); \
436 while ((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array [_i_])) {++_i_;} \
437 if ((_i_ == _s_->fd_count)) {_s_->fd_array [_s_->fd_count ++] = (fd);} \
438 } while (0)
439#endif
440
441/* MHD_SYS_select_ is wrapper macro for system select() function */
442#if ! defined(MHD_WINSOCK_SOCKETS)
443# define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t))
444#else
445# define MHD_SYS_select_(n,r,w,e,t) \
446 ( ( (((void*) (r) == (void*) 0) || ((fd_set*) (r))->fd_count == 0) && \
447 (((void*) (w) == (void*) 0) || ((fd_set*) (w))->fd_count == 0) && \
448 (((void*) (e) == (void*) 0) || ((fd_set*) (e))->fd_count == 0) ) ? \
449 ( ((void*) (t) == (void*) 0) ? 0 : \
450 (Sleep ((DWORD)((struct timeval*) (t))->tv_sec * 1000 \
451 + (DWORD)((struct timeval*) (t))->tv_usec / 1000), 0) ) : \
452 (select ((int) 0,(r),(w),(e),(t))) )
453#endif
454
455#if defined(HAVE_POLL)
456/* MHD_sys_poll_ is wrapper macro for system poll() function */
457# if ! defined(MHD_WINSOCK_SOCKETS)
458# define MHD_sys_poll_ poll
459# else /* MHD_WINSOCK_SOCKETS */
460# define MHD_sys_poll_ WSAPoll
461# endif /* MHD_WINSOCK_SOCKETS */
462
463# ifdef POLLPRI
464# define MHD_POLLPRI_OR_ZERO POLLPRI
465# else /* ! POLLPRI */
466# define MHD_POLLPRI_OR_ZERO 0
467# endif /* ! POLLPRI */
468# ifdef POLLRDBAND
469# define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
470# else /* ! POLLRDBAND */
471# define MHD_POLLRDBAND_OR_ZERO 0
472# endif /* ! POLLRDBAND */
473# ifdef POLLNVAL
474# define MHD_POLLNVAL_OR_ZERO POLLNVAL
475# else /* ! POLLNVAL */
476# define MHD_POLLNVAL_OR_ZERO 0
477# endif /* ! POLLNVAL */
478
479/* MHD_POLL_EVENTS_ERR_DISC is 'events' mask for errors and disconnect.
480 * Note: Out-of-band data is treated as error. */
481# if defined(_WIN32) && ! defined(__CYGWIN__)
482# define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND
483# elif defined(__linux__)
484# define MHD_POLL_EVENTS_ERR_DISC POLLPRI
485# else /* ! __linux__ */
486# define MHD_POLL_EVENTS_ERR_DISC \
487 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO)
488# endif /* ! __linux__ */
489/* MHD_POLL_REVENTS_ERR_DISC is 'revents' mask for errors and disconnect.
490 * Note: Out-of-band data is treated as error. */
491# define MHD_POLL_REVENTS_ERR_DISC \
492 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
493 | POLLERR | POLLHUP)
494/* MHD_POLL_REVENTS_ERRROR is 'revents' mask for errors.
495 * Note: Out-of-band data is treated as error. */
496# define MHD_POLL_REVENTS_ERRROR \
497 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
498 | POLLERR)
499#endif /* HAVE_POLL */
500
501#define MHD_SCKT_MISSING_ERR_CODE_ 31450
502
503#if defined(MHD_POSIX_SOCKETS)
504# if defined(EAGAIN)
505# define MHD_SCKT_EAGAIN_ EAGAIN
506# elif defined(EWOULDBLOCK)
507# define MHD_SCKT_EAGAIN_ EWOULDBLOCK
508# else /* !EAGAIN && !EWOULDBLOCK */
509# define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
510# endif /* !EAGAIN && !EWOULDBLOCK */
511# if defined(EWOULDBLOCK)
512# define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
513# elif defined(EAGAIN)
514# define MHD_SCKT_EWOULDBLOCK_ EAGAIN
515# else /* !EWOULDBLOCK && !EAGAIN */
516# define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
517# endif /* !EWOULDBLOCK && !EAGAIN */
518# ifdef EINTR
519# define MHD_SCKT_EINTR_ EINTR
520# else /* ! EINTR */
521# define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
522# endif /* ! EINTR */
523# ifdef ECONNRESET
524# define MHD_SCKT_ECONNRESET_ ECONNRESET
525# else /* ! ECONNRESET */
526# define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
527# endif /* ! ECONNRESET */
528# ifdef ECONNABORTED
529# define MHD_SCKT_ECONNABORTED_ ECONNABORTED
530# else /* ! ECONNABORTED */
531# define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
532# endif /* ! ECONNABORTED */
533# ifdef ENOTCONN
534# define MHD_SCKT_ENOTCONN_ ENOTCONN
535# else /* ! ENOTCONN */
536# define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
537# endif /* ! ENOTCONN */
538# ifdef EMFILE
539# define MHD_SCKT_EMFILE_ EMFILE
540# else /* ! EMFILE */
541# define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
542# endif /* ! EMFILE */
543# ifdef ENFILE
544# define MHD_SCKT_ENFILE_ ENFILE
545# else /* ! ENFILE */
546# define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
547# endif /* ! ENFILE */
548# ifdef ENOMEM
549# define MHD_SCKT_ENOMEM_ ENOMEM
550# else /* ! ENOMEM */
551# define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
552# endif /* ! ENOMEM */
553# ifdef ENOBUFS
554# define MHD_SCKT_ENOBUFS_ ENOBUFS
555# else /* ! ENOBUFS */
556# define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
557# endif /* ! ENOBUFS */
558# ifdef EBADF
559# define MHD_SCKT_EBADF_ EBADF
560# else /* ! EBADF */
561# define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
562# endif /* ! EBADF */
563# ifdef ENOTSOCK
564# define MHD_SCKT_ENOTSOCK_ ENOTSOCK
565# else /* ! ENOTSOCK */
566# define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
567# endif /* ! ENOTSOCK */
568# ifdef EINVAL
569# define MHD_SCKT_EINVAL_ EINVAL
570# else /* ! EINVAL */
571# define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
572# endif /* ! EINVAL */
573# ifdef EPIPE
574# define MHD_SCKT_EPIPE_ EPIPE
575# else /* ! EPIPE */
576# define MHD_SCKT_EPIPE_ MHD_SCKT_MISSING_ERR_CODE_
577# endif /* ! EPIPE */
578# ifdef EFAULT
579# define MHD_SCKT_EFAUL_ EFAULT
580# else /* ! EFAULT */
581# define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
582# endif /* ! EFAULT */
583# ifdef ENOSYS
584# define MHD_SCKT_ENOSYS_ ENOSYS
585# else /* ! ENOSYS */
586# define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
587# endif /* ! ENOSYS */
588# ifdef ENOPROTOOPT
589# define MHD_SCKT_ENOPROTOOPT_ ENOPROTOOPT
590# else /* ! ENOPROTOOPT */
591# define MHD_SCKT_ENOPROTOOPT_ MHD_SCKT_MISSING_ERR_CODE_
592# endif /* ! ENOPROTOOPT */
593# ifdef ENOTSUP
594# define MHD_SCKT_ENOTSUP_ ENOTSUP
595# else /* ! ENOTSUP */
596# define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
597# endif /* ! ENOTSUP */
598# ifdef EOPNOTSUPP
599# define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
600# else /* ! EOPNOTSUPP */
601# define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
602# endif /* ! EOPNOTSUPP */
603# ifdef EACCES
604# define MHD_SCKT_EACCESS_ EACCES
605# else /* ! EACCES */
606# define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
607# endif /* ! EACCES */
608# ifdef ENETDOWN
609# define MHD_SCKT_ENETDOWN_ ENETDOWN
610# else /* ! ENETDOWN */
611# define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
612# endif /* ! ENETDOWN */
613# ifdef EALREADY
614# define MHD_SCKT_EALREADY_ EALREADY
615# else /* ! EALREADY */
616# define MHD_SCKT_EALREADY_ MHD_SCKT_MISSING_ERR_CODE_
617# endif /* ! EALREADY */
618# ifdef EINPROGRESS
619# define MHD_SCKT_EINPROGRESS_ EINPROGRESS
620# else /* ! EINPROGRESS */
621# define MHD_SCKT_EINPROGRESS_ MHD_SCKT_MISSING_ERR_CODE_
622# endif /* ! EINPROGRESS */
623# ifdef EISCONN
624# define MHD_SCKT_EISCONN_ EISCONN
625# else /* ! EISCONN */
626# define MHD_SCKT_EISCONN_ MHD_SCKT_MISSING_ERR_CODE_
627# endif /* ! EISCONN */
628#elif defined(MHD_WINSOCK_SOCKETS)
629# define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
630# define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
631# define MHD_SCKT_EINTR_ WSAEINTR
632# define MHD_SCKT_ECONNRESET_ WSAECONNRESET
633# define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
634# define MHD_SCKT_ENOTCONN_ WSAENOTCONN
635# define MHD_SCKT_EMFILE_ WSAEMFILE
636# define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
637# define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
638# define MHD_SCKT_ENOBUFS_ WSAENOBUFS
639# define MHD_SCKT_EBADF_ WSAEBADF
640# define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
641# define MHD_SCKT_EINVAL_ WSAEINVAL
642# define MHD_SCKT_EPIPE_ WSAESHUTDOWN
643# define MHD_SCKT_EFAUL_ WSAEFAULT
644# define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
645# define MHD_SCKT_ENOPROTOOPT_ WSAENOPROTOOPT
646# define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
647# define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
648# define MHD_SCKT_EACCESS_ WSAEACCES
649# define MHD_SCKT_ENETDOWN_ WSAENETDOWN
650# define MHD_SCKT_EALREADY_ WSAEALREADY
651# define MHD_SCKT_EINPROGRESS_ WSAEINPROGRESS
652# define MHD_SCKT_EISCONN_ WSAEISCONN
653#endif
654
659#if defined(MHD_POSIX_SOCKETS)
660# define MHD_socket_get_error_() (errno)
661#elif defined(MHD_WINSOCK_SOCKETS)
662# define MHD_socket_get_error_() WSAGetLastError ()
663#endif
664
665#ifdef MHD_WINSOCK_SOCKETS
666/* POSIX-W32 sockets compatibility functions */
667
673const char *MHD_W32_strerror_winsock_ (int err);
674
675#endif /* MHD_WINSOCK_SOCKETS */
676
677/* MHD_socket_last_strerr_ is description string of specified socket error code */
678#if defined(MHD_POSIX_SOCKETS)
679# define MHD_socket_strerr_(err) strerror ((err))
680#elif defined(MHD_WINSOCK_SOCKETS)
681# define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err))
682#endif
683
684/* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
685 * description string of last socket error (W32) */
686#define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
687
691#if defined(MHD_POSIX_SOCKETS)
692# define MHD_socket_fset_error_(err) (errno = (err))
693#elif defined(MHD_WINSOCK_SOCKETS)
694# define MHD_socket_fset_error_(err) (WSASetLastError ((err)))
695#endif
696
705#define MHD_socket_try_set_error_(err) \
706 ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
707 (MHD_socket_fset_error_ ((err)), ! 0) : 0)
708
714#if defined(MHD_POSIX_SOCKETS)
715# if defined(ENOSYS)
716# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
717 (errno = ENOSYS) : (errno = (err)) )
718# elif defined(EOPNOTSUPP)
719# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
720 (errno = EOPNOTSUPP) : (errno = \
721 (err)) )
722# elif defined(EFAULT)
723# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
724 (errno = EFAULT) : (errno = (err)) )
725# elif defined(EINVAL)
726# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
727 (errno = EINVAL) : (errno = (err)) )
728# else /* !EOPNOTSUPP && !EFAULT && !EINVAL */
729# warning \
730 No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
731# define MHD_socket_set_error_(err) (errno = (err))
732# endif /* !EOPNOTSUPP && !EFAULT && !EINVAL*/
733#elif defined(MHD_WINSOCK_SOCKETS)
734# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
735 (WSASetLastError ((WSAEOPNOTSUPP))) : \
736 (WSASetLastError ((err))) )
737#endif
738
748#define MHD_SCKT_ERR_IS_(err,code) \
749 ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && ((code) == (err)) )
750
760#define MHD_SCKT_LAST_ERR_IS_(code) \
761 MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), (code))
762
763/* Specific error code checks */
764
771#define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
772
779#if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
780# define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
781#else /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
782# define MHD_SCKT_ERR_IS_EAGAIN_(err) \
783 ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EAGAIN_) || \
784 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EWOULDBLOCK_) )
785#endif /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
786
792#define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) \
793 ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EMFILE_) || \
794 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENFILE_) || \
795 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENOMEM_) || \
796 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENOBUFS_) )
797
804#if defined(MHD_POSIX_SOCKETS)
805# define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) \
806 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNABORTED_)
807#elif defined(MHD_WINSOCK_SOCKETS)
808# define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) \
809 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNRESET_)
810#endif
811
818#define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) \
819 ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNRESET_) || \
820 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNABORTED_) )
821
822/* Specific error code set */
823
828#if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
829# define MHD_socket_set_error_to_ENOMEM() \
830 MHD_socket_set_error_ (MHD_SCKT_ENOMEM_)
831#elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
832# define MHD_socket_set_error_to_ENOMEM() \
833 MHD_socket_set_error_ (MHD_SCKT_ENOBUFS_)
834#else
835# warning \
836 No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
837# define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
838 MHD_SCKT_ENOMEM_)
839#endif
840
841/* Socket functions */
842
843#if defined(AF_LOCAL)
844# define MHD_SCKT_LOCAL AF_LOCAL
845#elif defined(AF_UNIX)
846# define MHD_SCKT_LOCAL AF_UNIX
847#endif /* AF_UNIX */
848
849#if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
850# define MHD_socket_pair_(fdarr) \
851 (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, (fdarr)))
852# if defined(HAVE_SOCK_NONBLOCK)
853# define MHD_socket_pair_nblk_(fdarr) \
854 (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, (fdarr)))
855# endif /* HAVE_SOCK_NONBLOCK*/
856#elif defined(MHD_WINSOCK_SOCKETS)
864int MHD_W32_socket_pair_ (SOCKET sockets_pair[2], int non_blk);
865
866# define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0)
867# define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1)
868#endif
869
880int
882 fd_set *set,
883 MHD_socket *max_fd,
884 int fd_setsize);
885
886
893int
895
896
906int
908 bool on);
909
917int
919
920
921#if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
922static const int _MHD_socket_int_one = 1;
929#define MHD_socket_nosignal_(sock) \
930 (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \
931 sizeof(_MHD_socket_int_one)))
932#endif /* SOL_SOCKET && SO_NOSIGPIPE */
933
934
935#if defined(MHD_socket_nosignal_) || defined(MSG_NOSIGNAL)
942#define MHD_SEND_SPIPE_SUPPRESS_POSSIBLE 1
943#endif /* MHD_WINSOCK_SOCKETS || MHD_socket_nosignal_ || MSG_NOSIGNAL */
944
945#if ! defined(MHD_WINSOCK_SOCKETS)
949#define MHD_SEND_SPIPE_SUPPRESS_NEEDED 1
950#endif
951
960
961
962#endif /* ! MHD_SOCKETS_H */
int MHD_SCKT_OPT_BOOL_
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_set_nodelay_(MHD_socket sock, bool on)
Helper for obtaining FD_SETSIZE system default value.
int MHD_socket
Definition microhttpd.h:201
int fd