GNU libmicrohttpd 0.9.77
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-2016 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
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#ifdef __FreeBSD__
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# include "sysfdsetsize.h"
139# define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value ()
140#endif /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
141
142#ifndef MHD_PANIC
143# include <stdio.h>
144# include <stdlib.h>
145/* Simple implementation of MHD_PANIC, to be used outside lib */
146# define MHD_PANIC(msg) \
147 do { fprintf (stderr, \
148 "Abnormal termination at %d line in file %s: %s\n", \
149 (int) __LINE__, __FILE__, msg); abort (); \
150} while (0)
151#endif /* ! MHD_PANIC */
152
153#ifndef MHD_SOCKET_DEFINED
157# if defined(MHD_POSIX_SOCKETS)
158typedef int MHD_socket;
159# define MHD_INVALID_SOCKET (-1)
160# elif defined(MHD_WINSOCK_SOCKETS)
161typedef SOCKET MHD_socket;
162# define MHD_INVALID_SOCKET (INVALID_SOCKET)
163# endif /* MHD_WINSOCK_SOCKETS */
164
165# define MHD_SOCKET_DEFINED 1
166#endif /* ! MHD_SOCKET_DEFINED */
167
168#ifdef SOCK_CLOEXEC
169# define SOCK_CLOEXEC_OR_ZERO SOCK_CLOEXEC
170#else /* ! SOCK_CLOEXEC */
171# define SOCK_CLOEXEC_OR_ZERO 0
172#endif /* ! SOCK_CLOEXEC */
173
174#ifdef HAVE_SOCK_NONBLOCK
175# define SOCK_NONBLOCK_OR_ZERO SOCK_NONBLOCK
176#else /* ! HAVE_SOCK_NONBLOCK */
177# define SOCK_NONBLOCK_OR_ZERO 0
178#endif /* ! HAVE_SOCK_NONBLOCK */
179
180#ifdef SOCK_NOSIGPIPE
181# define SOCK_NOSIGPIPE_OR_ZERO SOCK_NOSIGPIPE
182#else /* ! HAVE_SOCK_NONBLOCK */
183# define SOCK_NOSIGPIPE_OR_ZERO 0
184#endif /* ! HAVE_SOCK_NONBLOCK */
185
186#ifdef MSG_NOSIGNAL
187# define MSG_NOSIGNAL_OR_ZERO MSG_NOSIGNAL
188#else /* ! MSG_NOSIGNAL */
189# define MSG_NOSIGNAL_OR_ZERO 0
190#endif /* ! MSG_NOSIGNAL */
191
192#if ! defined(SHUT_WR) && defined(SD_SEND)
193# define SHUT_WR SD_SEND
194#endif
195#if ! defined(SHUT_RD) && defined(SD_RECEIVE)
196# define SHUT_RD SD_RECEIVE
197#endif
198#if ! defined(SHUT_RDWR) && defined(SD_BOTH)
199# define SHUT_RDWR SD_BOTH
200#endif
201
202#if HAVE_ACCEPT4 + 0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || \
203 defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE))
204# define USE_ACCEPT4 1
205#endif
206
207#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || \
208 defined(MHD_WINSOCK_SOCKETS) || defined(__MACH__) || defined(__sun) || \
209 defined(SOMEBSD)
210/* Most of OSes inherit nonblocking setting from the listen socket */
211#define MHD_ACCEPT_INHERIT_NONBLOCK 1
212#endif
213
214#if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
215# define USE_EPOLL_CREATE1 1
216#endif /* HAVE_EPOLL_CREATE1 && EPOLL_CLOEXEC */
217
218#ifdef TCP_FASTOPEN
222#define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
223#endif
224
225
226#if defined(TCP_CORK)
230#define MHD_TCP_CORK_NOPUSH TCP_CORK
231#elif defined(TCP_NOPUSH)
235#define MHD_TCP_CORK_NOPUSH TCP_NOPUSH
236#endif /* TCP_NOPUSH */
237
238
239#ifdef MHD_TCP_CORK_NOPUSH
240#ifdef __linux__
244#define _MHD_CORK_RESET_PUSH_DATA 1
249#define _MHD_CORK_RESET_PUSH_DATA_ALWAYS 1
250#endif /* __linux__ */
251#if defined(__FreeBSD__) && \
252 ((__FreeBSD__ + 0) >= 5 || (__FreeBSD_version + 0) >= 450000)
253/* FreeBSD pushes data to the network with reset of TCP_NOPUSH
254 * starting from version 4.5. */
258#define _MHD_CORK_RESET_PUSH_DATA 1
259#endif /* __FreeBSD_version >= 450000 */
260#ifdef __OpenBSD__
261/* OpenBSD took implementation from FreeBSD */
265#define _MHD_CORK_RESET_PUSH_DATA 1
266#endif /* __OpenBSD__ */
267#endif /* MHD_TCP_CORK_NOPUSH */
268
269#ifdef __linux__
273#define _MHD_NODELAY_SET_PUSH_DATA 1
278#define _MHD_NODELAY_SET_PUSH_DATA_ALWAYS 1
279#endif /* __linux__ */
280
281#ifdef MSG_MORE
282#ifdef __linux__
283/* MSG_MORE signal kernel to buffer outbond data and works like
284 * TCP_CORK per call without actually setting TCP_CORK value.
285 * It's known to work on Linux. Add more OSes if they are compatible. */
289#define MHD_USE_MSG_MORE 1
290#endif /* __linux__ */
291#endif /* MSG_MORE */
292
293
297#ifdef MHD_POSIX_SOCKETS
299#else /* MHD_WINSOCK_SOCKETS */
300typedef BOOL MHD_SCKT_OPT_BOOL_;
301#endif /* MHD_WINSOCK_SOCKETS */
302
307#if ! defined(MHD_WINSOCK_SOCKETS)
308typedef size_t MHD_SCKT_SEND_SIZE_;
309#else
310typedef int MHD_SCKT_SEND_SIZE_;
311#endif
312
316#if ! defined(MHD_WINSOCK_SOCKETS)
317# define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
318#else
319# define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
320#endif
321
332#if ! defined(MHD_WINSOCK_SOCKETS)
333# define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno))
334#else
335# define MHD_socket_close_(fd) (0 == closesocket ((fd)))
336#endif
337
343#define MHD_socket_close_chk_(fd) do { \
344 if (! MHD_socket_close_ (fd)) \
345 MHD_PANIC (_ ("Close socket failed.\n")); \
346} while (0)
347
348
357#define MHD_send4_(s,b,l,f) \
358 ((ssize_t) send ((s),(const void*) (b),(MHD_SCKT_SEND_SIZE_) (l), \
359 ((MSG_NOSIGNAL_OR_ZERO) | (f))))
360
361
369#define MHD_send_(s,b,l) MHD_send4_((s),(b),(l), 0)
370
371
379#define MHD_recv_(s,b,l) \
380 ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0))
381
382
392#if defined(MHD_POSIX_SOCKETS)
393# define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) \
394 ((fd) < ((MHD_socket) setsize))
395#elif defined(MHD_WINSOCK_SOCKETS)
396# define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) \
397 ( ((void*) (pset)== (void*) 0) || \
398 (((fd_set*) (pset))->fd_count < ((unsigned) setsize)) || \
399 (FD_ISSET ((fd), (pset))) )
400#endif
401
410#define MHD_SCKT_FD_FITS_FDSET_(fd,pset) \
411 MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), (pset), FD_SETSIZE)
412
421#if defined(MHD_POSIX_SOCKETS)
422# define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
423 FD_SET ((fd), (pset))
424#elif defined(MHD_WINSOCK_SOCKETS)
425# define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
426 do { \
427 u_int _i_ = 0; \
428 fd_set*const _s_ = (fd_set*) (pset); \
429 while ((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array [_i_])) {++_i_;} \
430 if ((_i_ == _s_->fd_count)) {_s_->fd_array [_s_->fd_count ++] = (fd);} \
431 } while (0)
432#endif
433
434/* MHD_SYS_select_ is wrapper macro for system select() function */
435#if ! defined(MHD_WINSOCK_SOCKETS)
436# define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t))
437#else
438# define MHD_SYS_select_(n,r,w,e,t) \
439 ( ( (((void*) (r) == (void*) 0) || ((fd_set*) (r))->fd_count == 0) && \
440 (((void*) (w) == (void*) 0) || ((fd_set*) (w))->fd_count == 0) && \
441 (((void*) (e) == (void*) 0) || ((fd_set*) (e))->fd_count == 0) ) ? \
442 ( ((void*) (t) == (void*) 0) ? 0 : \
443 (Sleep (((struct timeval*) (t))->tv_sec * 1000 \
444 + ((struct timeval*) (t))->tv_usec / 1000), 0) ) : \
445 (select ((int) 0,(r),(w),(e),(t))) )
446#endif
447
448#if defined(HAVE_POLL)
449/* MHD_sys_poll_ is wrapper macro for system poll() function */
450# if ! defined(MHD_WINSOCK_SOCKETS)
451# define MHD_sys_poll_ poll
452# else /* MHD_WINSOCK_SOCKETS */
453# define MHD_sys_poll_ WSAPoll
454# endif /* MHD_WINSOCK_SOCKETS */
455
456# ifdef POLLPRI
457# define MHD_POLLPRI_OR_ZERO POLLPRI
458# else /* ! POLLPRI */
459# define MHD_POLLPRI_OR_ZERO 0
460# endif /* ! POLLPRI */
461# ifdef POLLRDBAND
462# define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
463# else /* ! POLLRDBAND */
464# define MHD_POLLRDBAND_OR_ZERO 0
465# endif /* ! POLLRDBAND */
466# ifdef POLLNVAL
467# define MHD_POLLNVAL_OR_ZERO POLLNVAL
468# else /* ! POLLNVAL */
469# define MHD_POLLNVAL_OR_ZERO 0
470# endif /* ! POLLNVAL */
471
472/* MHD_POLL_EVENTS_ERR_DISC is 'events' mask for errors and disconnect.
473 * Note: Out-of-band data is treated as error. */
474# if defined(_WIN32) && ! defined(__CYGWIN__)
475# define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND
476# elif defined(__linux__)
477# define MHD_POLL_EVENTS_ERR_DISC POLLPRI
478# else /* ! __linux__ */
479# define MHD_POLL_EVENTS_ERR_DISC \
480 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO)
481# endif /* ! __linux__ */
482/* MHD_POLL_REVENTS_ERR_DISC is 'revents' mask for errors and disconnect.
483 * Note: Out-of-band data is treated as error. */
484# define MHD_POLL_REVENTS_ERR_DISC \
485 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
486 | POLLERR | POLLHUP)
487/* MHD_POLL_REVENTS_ERRROR is 'revents' mask for errors.
488 * Note: Out-of-band data is treated as error. */
489# define MHD_POLL_REVENTS_ERRROR \
490 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
491 | POLLERR)
492#endif /* HAVE_POLL */
493
494#define MHD_SCKT_MISSING_ERR_CODE_ 31450
495
496#if defined(MHD_POSIX_SOCKETS)
497# if defined(EAGAIN)
498# define MHD_SCKT_EAGAIN_ EAGAIN
499# elif defined(EWOULDBLOCK)
500# define MHD_SCKT_EAGAIN_ EWOULDBLOCK
501# else /* !EAGAIN && !EWOULDBLOCK */
502# define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
503# endif /* !EAGAIN && !EWOULDBLOCK */
504# if defined(EWOULDBLOCK)
505# define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
506# elif defined(EAGAIN)
507# define MHD_SCKT_EWOULDBLOCK_ EAGAIN
508# else /* !EWOULDBLOCK && !EAGAIN */
509# define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
510# endif /* !EWOULDBLOCK && !EAGAIN */
511# ifdef EINTR
512# define MHD_SCKT_EINTR_ EINTR
513# else /* ! EINTR */
514# define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
515# endif /* ! EINTR */
516# ifdef ECONNRESET
517# define MHD_SCKT_ECONNRESET_ ECONNRESET
518# else /* ! ECONNRESET */
519# define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
520# endif /* ! ECONNRESET */
521# ifdef ECONNABORTED
522# define MHD_SCKT_ECONNABORTED_ ECONNABORTED
523# else /* ! ECONNABORTED */
524# define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
525# endif /* ! ECONNABORTED */
526# ifdef ENOTCONN
527# define MHD_SCKT_ENOTCONN_ ENOTCONN
528# else /* ! ENOTCONN */
529# define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
530# endif /* ! ENOTCONN */
531# ifdef EMFILE
532# define MHD_SCKT_EMFILE_ EMFILE
533# else /* ! EMFILE */
534# define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
535# endif /* ! EMFILE */
536# ifdef ENFILE
537# define MHD_SCKT_ENFILE_ ENFILE
538# else /* ! ENFILE */
539# define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
540# endif /* ! ENFILE */
541# ifdef ENOMEM
542# define MHD_SCKT_ENOMEM_ ENOMEM
543# else /* ! ENOMEM */
544# define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
545# endif /* ! ENOMEM */
546# ifdef ENOBUFS
547# define MHD_SCKT_ENOBUFS_ ENOBUFS
548# else /* ! ENOBUFS */
549# define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
550# endif /* ! ENOBUFS */
551# ifdef EBADF
552# define MHD_SCKT_EBADF_ EBADF
553# else /* ! EBADF */
554# define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
555# endif /* ! EBADF */
556# ifdef ENOTSOCK
557# define MHD_SCKT_ENOTSOCK_ ENOTSOCK
558# else /* ! ENOTSOCK */
559# define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
560# endif /* ! ENOTSOCK */
561# ifdef EINVAL
562# define MHD_SCKT_EINVAL_ EINVAL
563# else /* ! EINVAL */
564# define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
565# endif /* ! EINVAL */
566# ifdef EPIPE
567# define MHD_SCKT_EPIPE_ EPIPE
568# else /* ! EPIPE */
569# define MHD_SCKT_EPIPE_ MHD_SCKT_MISSING_ERR_CODE_
570# endif /* ! EPIPE */
571# ifdef EFAULT
572# define MHD_SCKT_EFAUL_ EFAULT
573# else /* ! EFAULT */
574# define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
575# endif /* ! EFAULT */
576# ifdef ENOSYS
577# define MHD_SCKT_ENOSYS_ ENOSYS
578# else /* ! ENOSYS */
579# define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
580# endif /* ! ENOSYS */
581# ifdef ENOPROTOOPT
582# define MHD_SCKT_ENOPROTOOPT_ ENOPROTOOPT
583# else /* ! ENOPROTOOPT */
584# define MHD_SCKT_ENOPROTOOPT_ MHD_SCKT_MISSING_ERR_CODE_
585# endif /* ! ENOPROTOOPT */
586# ifdef ENOTSUP
587# define MHD_SCKT_ENOTSUP_ ENOTSUP
588# else /* ! ENOTSUP */
589# define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
590# endif /* ! ENOTSUP */
591# ifdef EOPNOTSUPP
592# define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
593# else /* ! EOPNOTSUPP */
594# define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
595# endif /* ! EOPNOTSUPP */
596# ifdef EACCES
597# define MHD_SCKT_EACCESS_ EACCES
598# else /* ! EACCES */
599# define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
600# endif /* ! EACCES */
601# ifdef ENETDOWN
602# define MHD_SCKT_ENETDOWN_ ENETDOWN
603# else /* ! ENETDOWN */
604# define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
605# endif /* ! ENETDOWN */
606# ifdef EALREADY
607# define MHD_SCKT_EALREADY_ EALREADY
608# else /* ! EALREADY */
609# define MHD_SCKT_EALREADY_ MHD_SCKT_MISSING_ERR_CODE_
610# endif /* ! EALREADY */
611# ifdef EINPROGRESS
612# define MHD_SCKT_EINPROGRESS_ EINPROGRESS
613# else /* ! EINPROGRESS */
614# define MHD_SCKT_EINPROGRESS_ MHD_SCKT_MISSING_ERR_CODE_
615# endif /* ! EINPROGRESS */
616# ifdef EISCONN
617# define MHD_SCKT_EISCONN_ EISCONN
618# else /* ! EISCONN */
619# define MHD_SCKT_EISCONN_ MHD_SCKT_MISSING_ERR_CODE_
620# endif /* ! EISCONN */
621#elif defined(MHD_WINSOCK_SOCKETS)
622# define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
623# define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
624# define MHD_SCKT_EINTR_ WSAEINTR
625# define MHD_SCKT_ECONNRESET_ WSAECONNRESET
626# define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
627# define MHD_SCKT_ENOTCONN_ WSAENOTCONN
628# define MHD_SCKT_EMFILE_ WSAEMFILE
629# define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
630# define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
631# define MHD_SCKT_ENOBUFS_ WSAENOBUFS
632# define MHD_SCKT_EBADF_ WSAEBADF
633# define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
634# define MHD_SCKT_EINVAL_ WSAEINVAL
635# define MHD_SCKT_EPIPE_ WSAESHUTDOWN
636# define MHD_SCKT_EFAUL_ WSAEFAULT
637# define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
638# define MHD_SCKT_ENOPROTOOPT_ WSAENOPROTOOPT
639# define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
640# define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
641# define MHD_SCKT_EACCESS_ WSAEACCES
642# define MHD_SCKT_ENETDOWN_ WSAENETDOWN
643# define MHD_SCKT_EALREADY_ WSAEALREADY
644# define MHD_SCKT_EINPROGRESS_ WSAEACCES
645# define MHD_SCKT_EISCONN_ WSAEISCONN
646#endif
647
652#if defined(MHD_POSIX_SOCKETS)
653# define MHD_socket_get_error_() (errno)
654#elif defined(MHD_WINSOCK_SOCKETS)
655# define MHD_socket_get_error_() WSAGetLastError ()
656#endif
657
658#ifdef MHD_WINSOCK_SOCKETS
659/* POSIX-W32 sockets compatibility functions */
660
666const char *MHD_W32_strerror_winsock_ (int err);
667
668#endif /* MHD_WINSOCK_SOCKETS */
669
670/* MHD_socket_last_strerr_ is description string of specified socket error code */
671#if defined(MHD_POSIX_SOCKETS)
672# define MHD_socket_strerr_(err) strerror ((err))
673#elif defined(MHD_WINSOCK_SOCKETS)
674# define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err))
675#endif
676
677/* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
678 * description string of last socket error (W32) */
679#define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
680
684#if defined(MHD_POSIX_SOCKETS)
685# define MHD_socket_fset_error_(err) (errno = (err))
686#elif defined(MHD_WINSOCK_SOCKETS)
687# define MHD_socket_fset_error_(err) (WSASetLastError ((err)))
688#endif
689
698#define MHD_socket_try_set_error_(err) \
699 ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
700 (MHD_socket_fset_error_ ((err)), ! 0) : 0)
701
707#if defined(MHD_POSIX_SOCKETS)
708# if defined(ENOSYS)
709# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
710 (errno = ENOSYS) : (errno = (err)) )
711# elif defined(EOPNOTSUPP)
712# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
713 (errno = EOPNOTSUPP) : (errno = \
714 (err)) )
715# elif defined(EFAULT)
716# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
717 (errno = EFAULT) : (errno = (err)) )
718# elif defined(EINVAL)
719# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
720 (errno = EINVAL) : (errno = (err)) )
721# else /* !EOPNOTSUPP && !EFAULT && !EINVAL */
722# warning \
723 No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
724# define MHD_socket_set_error_(err) (errno = (err))
725# endif /* !EOPNOTSUPP && !EFAULT && !EINVAL*/
726#elif defined(MHD_WINSOCK_SOCKETS)
727# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
728 (WSASetLastError ((WSAEOPNOTSUPP))) : \
729 (WSASetLastError ((err))) )
730#endif
731
741#define MHD_SCKT_ERR_IS_(err,code) \
742 ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && ((code) == (err)) )
743
753#define MHD_SCKT_LAST_ERR_IS_(code) \
754 MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), (code))
755
756/* Specific error code checks */
757
764#define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
765
772#if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
773# define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
774#else /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
775# define MHD_SCKT_ERR_IS_EAGAIN_(err) \
776 ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EAGAIN_) || \
777 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EWOULDBLOCK_) )
778#endif /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
779
785#define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) \
786 ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_EMFILE_) || \
787 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENFILE_) || \
788 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENOMEM_) || \
789 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ENOBUFS_) )
790
797#if defined(MHD_POSIX_SOCKETS)
798# define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) \
799 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNABORTED_)
800#elif defined(MHD_WINSOCK_SOCKETS)
801# define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) \
802 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNRESET_)
803#endif
804
811#define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) \
812 ( MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNRESET_) || \
813 MHD_SCKT_ERR_IS_ ((err), MHD_SCKT_ECONNABORTED_) )
814
815/* Specific error code set */
816
821#if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
822# define MHD_socket_set_error_to_ENOMEM() \
823 MHD_socket_set_error_ (MHD_SCKT_ENOMEM_)
824#elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
825# define MHD_socket_set_error_to_ENOMEM() \
826 MHD_socket_set_error_ (MHD_SCKT_ENOBUFS_)
827#else
828# warning \
829 No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
830# define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
831 MHD_SCKT_ENOMEM_)
832#endif
833
834/* Socket functions */
835
836#if defined(AF_LOCAL)
837# define MHD_SCKT_LOCAL AF_LOCAL
838#elif defined(AF_UNIX)
839# define MHD_SCKT_LOCAL AF_UNIX
840#endif /* AF_UNIX */
841
842#if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
843# define MHD_socket_pair_(fdarr) \
844 (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, (fdarr)))
845# if defined(HAVE_SOCK_NONBLOCK)
846# define MHD_socket_pair_nblk_(fdarr) \
847 (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, (fdarr)))
848# endif /* HAVE_SOCK_NONBLOCK*/
849#elif defined(MHD_WINSOCK_SOCKETS)
857int MHD_W32_socket_pair_ (SOCKET sockets_pair[2], int non_blk);
858
859# define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0)
860# define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1)
861#endif
862
873int
875 fd_set *set,
876 MHD_socket *max_fd,
877 unsigned int fd_setsize);
878
879
886int
888
889
899int
901 bool on);
902
910int
912
913
914#if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
915static const int _MHD_socket_int_one = 1;
922#define MHD_socket_nosignal_(sock) \
923 (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \
924 sizeof(_MHD_socket_int_one)))
925#endif /* SOL_SOCKET && SO_NOSIGPIPE */
926
927
928#if defined(MHD_socket_nosignal_) || defined(MSG_NOSIGNAL)
935#define MHD_SEND_SPIPE_SUPPRESS_POSSIBLE 1
936#endif /* MHD_WINSOCK_SOCKETS || MHD_socket_nosignal_ || MSG_NOSIGNAL */
937
938#if ! defined(MHD_WINSOCK_SOCKETS)
942#define MHD_SEND_SPIPE_SUPPRESS_NEEDED 1
943#endif
944
953
954
955#endif /* ! MHD_SOCKETS_H */
int MHD_socket
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:207
int fd