GNU libmicrohttpd 0.9.73
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#include <stdbool.h>
39#ifdef HAVE_UNISTD_H
40#include <unistd.h>
41#endif /* HAVE_UNISTD_H */
42#include <fcntl.h>
43
44#if ! defined(MHD_POSIX_SOCKETS) && ! defined(MHD_WINSOCK_SOCKETS)
45# if ! defined(_WIN32) || defined(__CYGWIN__)
46# define MHD_POSIX_SOCKETS 1
47# else /* defined(_WIN32) && !defined(__CYGWIN__) */
48# define MHD_WINSOCK_SOCKETS 1
49# endif /* defined(_WIN32) && !defined(__CYGWIN__) */
50#endif /* !MHD_POSIX_SOCKETS && !MHD_WINSOCK_SOCKETS */
51
52/*
53 * MHD require headers that define socket type, socket basic functions
54 * (socket(), accept(), listen(), bind(), send(), recv(), select()), socket
55 * parameters like SOCK_CLOEXEC, SOCK_NONBLOCK, additional socket functions
56 * (poll(), epoll(), accept4()), struct timeval and other types, required
57 * for socket function.
58 */
59#if defined(MHD_POSIX_SOCKETS)
60# ifdef HAVE_SYS_TYPES_H
61# include <sys/types.h> /* required on old platforms */
62# endif
63# ifdef HAVE_SYS_SOCKET_H
64# include <sys/socket.h>
65# endif
66# if defined(__VXWORKS__) || defined(__vxworks) || defined(OS_VXWORKS)
67# ifdef HAVE_SOCKLIB_H
68# include <sockLib.h>
69# endif /* HAVE_SOCKLIB_H */
70# ifdef HAVE_INETLIB_H
71# include <inetLib.h>
72# endif /* HAVE_INETLIB_H */
73# include <strings.h> /* required for FD_SET (bzero() function) */
74# endif /* __VXWORKS__ || __vxworks || OS_VXWORKS */
75# ifdef HAVE_NETINET_IN_H
76# include <netinet/in.h>
77# endif /* HAVE_NETINET_IN_H */
78# ifdef HAVE_ARPA_INET_H
79# include <arpa/inet.h>
80# endif
81# ifdef HAVE_NET_IF_H
82# include <net/if.h>
83# endif
84# ifdef HAVE_SYS_TIME_H
85# include <sys/time.h>
86# endif
87# ifdef HAVE_TIME_H
88# include <time.h>
89# endif
90# ifdef HAVE_NETDB_H
91# include <netdb.h>
92# endif
93# ifdef HAVE_SYS_SELECT_H
94# include <sys/select.h>
95# endif
96# ifdef EPOLL_SUPPORT
97# include <sys/epoll.h>
98# endif
99# ifdef HAVE_NETINET_TCP_H
100/* for TCP_FASTOPEN and TCP_CORK */
101# include <netinet/tcp.h>
102# endif
103# ifdef HAVE_STRING_H
104# include <string.h> /* for strerror() */
105# endif
106#elif defined(MHD_WINSOCK_SOCKETS)
107# ifndef WIN32_LEAN_AND_MEAN
108# define WIN32_LEAN_AND_MEAN 1
109# endif /* !WIN32_LEAN_AND_MEAN */
110# include <winsock2.h>
111# include <ws2tcpip.h>
112#endif /* MHD_WINSOCK_SOCKETS */
113
114#if defined(HAVE_POLL_H) && defined(HAVE_POLL)
115# include <poll.h>
116#endif
117
118#include <stddef.h>
119#if defined(_MSC_FULL_VER) && ! defined (_SSIZE_T_DEFINED)
120# include <stdint.h>
121# define _SSIZE_T_DEFINED
122typedef intptr_t ssize_t;
123#endif /* !_SSIZE_T_DEFINED */
124
125#ifdef __FreeBSD__
126#include <sys/param.h> /* For __FreeBSD_version */
127#endif /* __FreeBSD__ */
128
129#include "mhd_limits.h"
130
131#ifdef _MHD_FD_SETSIZE_IS_DEFAULT
132# define _MHD_SYS_DEFAULT_FD_SETSIZE FD_SETSIZE
133#else /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
134# include "sysfdsetsize.h"
135# define _MHD_SYS_DEFAULT_FD_SETSIZE get_system_fdsetsize_value ()
136#endif /* ! _MHD_FD_SETSIZE_IS_DEFAULT */
137
138#ifndef MHD_PANIC
139# include <stdio.h>
140# include <stdlib.h>
141/* Simple implementation of MHD_PANIC, to be used outside lib */
142# define MHD_PANIC(msg) do { fprintf (stderr, \
143 "Abnormal termination at %d line in file %s: %s\n", \
144 (int) __LINE__, __FILE__, msg); abort (); \
145} while (0)
146#endif /* ! MHD_PANIC */
147
148#ifndef MHD_SOCKET_DEFINED
152# if defined(MHD_POSIX_SOCKETS)
153typedef int MHD_socket;
154# define MHD_INVALID_SOCKET (-1)
155# elif defined(MHD_WINSOCK_SOCKETS)
156typedef SOCKET MHD_socket;
157# define MHD_INVALID_SOCKET (INVALID_SOCKET)
158# endif /* MHD_WINSOCK_SOCKETS */
159
160# define MHD_SOCKET_DEFINED 1
161#endif /* ! MHD_SOCKET_DEFINED */
162
163#ifdef SOCK_CLOEXEC
164# define SOCK_CLOEXEC_OR_ZERO SOCK_CLOEXEC
165#else /* ! SOCK_CLOEXEC */
166# define SOCK_CLOEXEC_OR_ZERO 0
167#endif /* ! SOCK_CLOEXEC */
168
169#ifdef HAVE_SOCK_NONBLOCK
170# define SOCK_NONBLOCK_OR_ZERO SOCK_NONBLOCK
171#else /* ! HAVE_SOCK_NONBLOCK */
172# define SOCK_NONBLOCK_OR_ZERO 0
173#endif /* ! HAVE_SOCK_NONBLOCK */
174
175#ifdef SOCK_NOSIGPIPE
176# define SOCK_NOSIGPIPE_OR_ZERO SOCK_NOSIGPIPE
177#else /* ! HAVE_SOCK_NONBLOCK */
178# define SOCK_NOSIGPIPE_OR_ZERO 0
179#endif /* ! HAVE_SOCK_NONBLOCK */
180
181#ifdef MSG_NOSIGNAL
182# define MSG_NOSIGNAL_OR_ZERO MSG_NOSIGNAL
183#else /* ! MSG_NOSIGNAL */
184# define MSG_NOSIGNAL_OR_ZERO 0
185#endif /* ! MSG_NOSIGNAL */
186
187#if ! defined(SHUT_WR) && defined(SD_SEND)
188# define SHUT_WR SD_SEND
189#endif
190#if ! defined(SHUT_RD) && defined(SD_RECEIVE)
191# define SHUT_RD SD_RECEIVE
192#endif
193#if ! defined(SHUT_RDWR) && defined(SD_BOTH)
194# define SHUT_RDWR SD_BOTH
195#endif
196
197#if HAVE_ACCEPT4 + 0 != 0 && (defined(HAVE_SOCK_NONBLOCK) || \
198 defined(SOCK_CLOEXEC) || defined(SOCK_NOSIGPIPE))
199# define USE_ACCEPT4 1
200#endif
201
202#if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
203# define USE_EPOLL_CREATE1 1
204#endif /* HAVE_EPOLL_CREATE1 && EPOLL_CLOEXEC */
205
206#ifdef TCP_FASTOPEN
210#define MHD_TCP_FASTOPEN_QUEUE_SIZE_DEFAULT 10
211#endif
212
213
214#if defined(TCP_CORK)
218#define MHD_TCP_CORK_NOPUSH TCP_CORK
219#elif defined(TCP_NOPUSH)
223#define MHD_TCP_CORK_NOPUSH TCP_NOPUSH
224#endif /* TCP_NOPUSH */
225
226
227#ifdef MHD_TCP_CORK_NOPUSH
228#ifdef __linux__
232#define _MHD_CORK_RESET_PUSH_DATA 1
237#define _MHD_CORK_RESET_PUSH_DATA_ALWAYS 1
238#endif /* __linux__ */
239#if defined(__FreeBSD__) && \
240 ((__FreeBSD__ + 0) >= 5 || (__FreeBSD_version + 0) >= 450000)
241/* FreeBSD pushes data to the network with reset of TCP_NOPUSH
242 * starting from version 4.5. */
246#define _MHD_CORK_RESET_PUSH_DATA 1
247#endif /* __FreeBSD_version >= 450000 */
248#ifdef __OpenBSD__
249/* OpenBSD took implementation from FreeBSD */
253#define _MHD_CORK_RESET_PUSH_DATA 1
254#endif /* __OpenBSD__ */
255#endif /* MHD_TCP_CORK_NOPUSH */
256
257#ifdef __linux__
261#define _MHD_NODELAY_SET_PUSH_DATA 1
266#define _MHD_NODELAY_SET_PUSH_DATA_ALWAYS 1
267#endif /* __linux__ */
268
269#ifdef MSG_MORE
270#ifdef __linux__
271/* MSG_MORE signal kernel to buffer outbond data and works like
272 * TCP_CORK per call without actually setting TCP_CORK value.
273 * It's known to work on Linux. Add more OSes if they are compatible. */
277#define MHD_USE_MSG_MORE 1
278#endif /* __linux__ */
279#endif /* MSG_MORE */
280
281
285#ifdef MHD_POSIX_SOCKETS
287#else /* MHD_WINSOCK_SOCKETS */
288typedef BOOL MHD_SCKT_OPT_BOOL_;
289#endif /* MHD_WINSOCK_SOCKETS */
290
295#if ! defined(MHD_WINSOCK_SOCKETS)
296typedef size_t MHD_SCKT_SEND_SIZE_;
297#else
298typedef int MHD_SCKT_SEND_SIZE_;
299#endif
300
304#if ! defined(MHD_WINSOCK_SOCKETS)
305# define MHD_SCKT_SEND_MAX_SIZE_ SSIZE_MAX
306#else
307# define MHD_SCKT_SEND_MAX_SIZE_ INT_MAX
308#endif
309
320#if ! defined(MHD_WINSOCK_SOCKETS)
321# define MHD_socket_close_(fd) ((0 == close ((fd))) || (EBADF != errno))
322#else
323# define MHD_socket_close_(fd) (0 == closesocket ((fd)))
324#endif
325
331#define MHD_socket_close_chk_(fd) do { \
332 if (! MHD_socket_close_ (fd)) \
333 MHD_PANIC (_ ("Close socket failed.\n")); \
334} while (0)
335
336
345#define MHD_send4_(s,b,l,f) \
346 ((ssize_t) send ((s),(const void*) (b),(MHD_SCKT_SEND_SIZE_) (l), \
347 ((MSG_NOSIGNAL_OR_ZERO) | (f))))
348
349
357#define MHD_send_(s,b,l) MHD_send4_((s),(b),(l), 0)
358
359
367#define MHD_recv_(s,b,l) \
368 ((ssize_t) recv ((s),(void*) (b),(MHD_SCKT_SEND_SIZE_) (l), 0))
369
370
380#if defined(MHD_POSIX_SOCKETS)
381# define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ((fd) < \
382 ((MHD_socket) \
383 setsize))
384#elif defined(MHD_WINSOCK_SOCKETS)
385# define MHD_SCKT_FD_FITS_FDSET_SETSIZE_(fd,pset,setsize) ( ((void*) (pset)== \
386 (void*) 0) || \
387 (((fd_set*) (pset)) \
388 ->fd_count < \
389 ((unsigned) \
390 setsize)) || \
391 (FD_ISSET ((fd), \
392 (pset))) )
393#endif
394
403#define MHD_SCKT_FD_FITS_FDSET_(fd,pset) MHD_SCKT_FD_FITS_FDSET_SETSIZE_ ((fd), \
404 (pset), \
405 FD_SETSIZE)
406
415#if defined(MHD_POSIX_SOCKETS)
416# define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) FD_SET ((fd), \
417 (pset))
418#elif defined(MHD_WINSOCK_SOCKETS)
419# define MHD_SCKT_ADD_FD_TO_FDSET_SETSIZE_(fd,pset,setsize) \
420 do { \
421 u_int _i_ = 0; \
422 fd_set*const _s_ = (fd_set*) (pset); \
423 while ((_i_ < _s_->fd_count) && ((fd) != _s_->fd_array [_i_])) {++_i_;} \
424 if ((_i_ == _s_->fd_count)) {_s_->fd_array [_s_->fd_count ++] = (fd);} \
425 } while (0)
426#endif
427
428/* MHD_SYS_select_ is wrapper macro for system select() function */
429#if ! defined(MHD_WINSOCK_SOCKETS)
430# define MHD_SYS_select_(n,r,w,e,t) select ((n),(r),(w),(e),(t))
431#else
432# define MHD_SYS_select_(n,r,w,e,t) \
433 ( ( (((void*) (r) == (void*) 0) || ((fd_set*) (r))->fd_count == 0) && \
434 (((void*) (w) == (void*) 0) || ((fd_set*) (w))->fd_count == 0) && \
435 (((void*) (e) == (void*) 0) || ((fd_set*) (e))->fd_count == 0) ) ? \
436 ( ((void*) (t) == (void*) 0) ? 0 : \
437 (Sleep (((struct timeval*) (t))->tv_sec * 1000 \
438 + ((struct timeval*) (t))->tv_usec / 1000), 0) ) : \
439 (select ((int) 0,(r),(w),(e),(t))) )
440#endif
441
442#if defined(HAVE_POLL)
443/* MHD_sys_poll_ is wrapper macro for system poll() function */
444# if ! defined(MHD_WINSOCK_SOCKETS)
445# define MHD_sys_poll_ poll
446# else /* MHD_WINSOCK_SOCKETS */
447# define MHD_sys_poll_ WSAPoll
448# endif /* MHD_WINSOCK_SOCKETS */
449
450# ifdef POLLPRI
451# define MHD_POLLPRI_OR_ZERO POLLPRI
452# else /* ! POLLPRI */
453# define MHD_POLLPRI_OR_ZERO 0
454# endif /* ! POLLPRI */
455# ifdef POLLRDBAND
456# define MHD_POLLRDBAND_OR_ZERO POLLRDBAND
457# else /* ! POLLRDBAND */
458# define MHD_POLLRDBAND_OR_ZERO 0
459# endif /* ! POLLRDBAND */
460# ifdef POLLNVAL
461# define MHD_POLLNVAL_OR_ZERO POLLNVAL
462# else /* ! POLLNVAL */
463# define MHD_POLLNVAL_OR_ZERO 0
464# endif /* ! POLLNVAL */
465
466/* MHD_POLL_EVENTS_ERR_DISC is 'events' mask for errors and disconnect.
467 * Note: Out-of-band data is treated as error. */
468# if defined(_WIN32) && ! defined(__CYGWIN__)
469# define MHD_POLL_EVENTS_ERR_DISC POLLRDBAND
470# elif defined(__linux__)
471# define MHD_POLL_EVENTS_ERR_DISC POLLPRI
472# else /* ! __linux__ */
473# define MHD_POLL_EVENTS_ERR_DISC (MHD_POLLPRI_OR_ZERO \
474 | MHD_POLLRDBAND_OR_ZERO)
475# endif /* ! __linux__ */
476/* MHD_POLL_REVENTS_ERR_DISC is 'revents' mask for errors and disconnect.
477 * Note: Out-of-band data is treated as error. */
478# define MHD_POLL_REVENTS_ERR_DISC \
479 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
480 | POLLERR | POLLHUP)
481/* MHD_POLL_REVENTS_ERRROR is 'revents' mask for errors.
482 * Note: Out-of-band data is treated as error. */
483# define MHD_POLL_REVENTS_ERRROR \
484 (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO \
485 | POLLERR)
486#endif /* HAVE_POLL */
487
488#define MHD_SCKT_MISSING_ERR_CODE_ 31450
489
490#if defined(MHD_POSIX_SOCKETS)
491# if defined(EAGAIN)
492# define MHD_SCKT_EAGAIN_ EAGAIN
493# elif defined(EWOULDBLOCK)
494# define MHD_SCKT_EAGAIN_ EWOULDBLOCK
495# else /* !EAGAIN && !EWOULDBLOCK */
496# define MHD_SCKT_EAGAIN_ MHD_SCKT_MISSING_ERR_CODE_
497# endif /* !EAGAIN && !EWOULDBLOCK */
498# if defined(EWOULDBLOCK)
499# define MHD_SCKT_EWOULDBLOCK_ EWOULDBLOCK
500# elif defined(EAGAIN)
501# define MHD_SCKT_EWOULDBLOCK_ EAGAIN
502# else /* !EWOULDBLOCK && !EAGAIN */
503# define MHD_SCKT_EWOULDBLOCK_ MHD_SCKT_MISSING_ERR_CODE_
504# endif /* !EWOULDBLOCK && !EAGAIN */
505# ifdef EINTR
506# define MHD_SCKT_EINTR_ EINTR
507# else /* ! EINTR */
508# define MHD_SCKT_EINTR_ MHD_SCKT_MISSING_ERR_CODE_
509# endif /* ! EINTR */
510# ifdef ECONNRESET
511# define MHD_SCKT_ECONNRESET_ ECONNRESET
512# else /* ! ECONNRESET */
513# define MHD_SCKT_ECONNRESET_ MHD_SCKT_MISSING_ERR_CODE_
514# endif /* ! ECONNRESET */
515# ifdef ECONNABORTED
516# define MHD_SCKT_ECONNABORTED_ ECONNABORTED
517# else /* ! ECONNABORTED */
518# define MHD_SCKT_ECONNABORTED_ MHD_SCKT_MISSING_ERR_CODE_
519# endif /* ! ECONNABORTED */
520# ifdef ENOTCONN
521# define MHD_SCKT_ENOTCONN_ ENOTCONN
522# else /* ! ENOTCONN */
523# define MHD_SCKT_ENOTCONN_ MHD_SCKT_MISSING_ERR_CODE_
524# endif /* ! ENOTCONN */
525# ifdef EMFILE
526# define MHD_SCKT_EMFILE_ EMFILE
527# else /* ! EMFILE */
528# define MHD_SCKT_EMFILE_ MHD_SCKT_MISSING_ERR_CODE_
529# endif /* ! EMFILE */
530# ifdef ENFILE
531# define MHD_SCKT_ENFILE_ ENFILE
532# else /* ! ENFILE */
533# define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
534# endif /* ! ENFILE */
535# ifdef ENOMEM
536# define MHD_SCKT_ENOMEM_ ENOMEM
537# else /* ! ENOMEM */
538# define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
539# endif /* ! ENOMEM */
540# ifdef ENOBUFS
541# define MHD_SCKT_ENOBUFS_ ENOBUFS
542# else /* ! ENOBUFS */
543# define MHD_SCKT_ENOBUFS_ MHD_SCKT_MISSING_ERR_CODE_
544# endif /* ! ENOBUFS */
545# ifdef EBADF
546# define MHD_SCKT_EBADF_ EBADF
547# else /* ! EBADF */
548# define MHD_SCKT_EBADF_ MHD_SCKT_MISSING_ERR_CODE_
549# endif /* ! EBADF */
550# ifdef ENOTSOCK
551# define MHD_SCKT_ENOTSOCK_ ENOTSOCK
552# else /* ! ENOTSOCK */
553# define MHD_SCKT_ENOTSOCK_ MHD_SCKT_MISSING_ERR_CODE_
554# endif /* ! ENOTSOCK */
555# ifdef EINVAL
556# define MHD_SCKT_EINVAL_ EINVAL
557# else /* ! EINVAL */
558# define MHD_SCKT_EINVAL_ MHD_SCKT_MISSING_ERR_CODE_
559# endif /* ! EINVAL */
560# ifdef EPIPE
561# define MHD_SCKT_EPIPE_ EPIPE
562# else /* ! EPIPE */
563# define MHD_SCKT_EPIPE_ MHD_SCKT_MISSING_ERR_CODE_
564# endif /* ! EPIPE */
565# ifdef EFAULT
566# define MHD_SCKT_EFAUL_ EFAULT
567# else /* ! EFAULT */
568# define MHD_SCKT_EFAUL_ MHD_SCKT_MISSING_ERR_CODE_
569# endif /* ! EFAULT */
570# ifdef ENOSYS
571# define MHD_SCKT_ENOSYS_ ENOSYS
572# else /* ! ENOSYS */
573# define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
574# endif /* ! ENOSYS */
575# ifdef ENOPROTOOPT
576# define MHD_SCKT_ENOPROTOOPT_ ENOPROTOOPT
577# else /* ! ENOPROTOOPT */
578# define MHD_SCKT_ENOPROTOOPT_ MHD_SCKT_MISSING_ERR_CODE_
579# endif /* ! ENOPROTOOPT */
580# ifdef ENOTSUP
581# define MHD_SCKT_ENOTSUP_ ENOTSUP
582# else /* ! ENOTSUP */
583# define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
584# endif /* ! ENOTSUP */
585# ifdef EOPNOTSUPP
586# define MHD_SCKT_EOPNOTSUPP_ EOPNOTSUPP
587# else /* ! EOPNOTSUPP */
588# define MHD_SCKT_EOPNOTSUPP_ MHD_SCKT_MISSING_ERR_CODE_
589# endif /* ! EOPNOTSUPP */
590# ifdef EACCES
591# define MHD_SCKT_EACCESS_ EACCES
592# else /* ! EACCES */
593# define MHD_SCKT_EACCESS_ MHD_SCKT_MISSING_ERR_CODE_
594# endif /* ! EACCES */
595# ifdef ENETDOWN
596# define MHD_SCKT_ENETDOWN_ ENETDOWN
597# else /* ! ENETDOWN */
598# define MHD_SCKT_ENETDOWN_ MHD_SCKT_MISSING_ERR_CODE_
599# endif /* ! ENETDOWN */
600#elif defined(MHD_WINSOCK_SOCKETS)
601# define MHD_SCKT_EAGAIN_ WSAEWOULDBLOCK
602# define MHD_SCKT_EWOULDBLOCK_ WSAEWOULDBLOCK
603# define MHD_SCKT_EINTR_ WSAEINTR
604# define MHD_SCKT_ECONNRESET_ WSAECONNRESET
605# define MHD_SCKT_ECONNABORTED_ WSAECONNABORTED
606# define MHD_SCKT_ENOTCONN_ WSAENOTCONN
607# define MHD_SCKT_EMFILE_ WSAEMFILE
608# define MHD_SCKT_ENFILE_ MHD_SCKT_MISSING_ERR_CODE_
609# define MHD_SCKT_ENOMEM_ MHD_SCKT_MISSING_ERR_CODE_
610# define MHD_SCKT_ENOBUFS_ WSAENOBUFS
611# define MHD_SCKT_EBADF_ WSAEBADF
612# define MHD_SCKT_ENOTSOCK_ WSAENOTSOCK
613# define MHD_SCKT_EINVAL_ WSAEINVAL
614# define MHD_SCKT_EPIPE_ WSAESHUTDOWN
615# define MHD_SCKT_EFAUL_ WSAEFAULT
616# define MHD_SCKT_ENOSYS_ MHD_SCKT_MISSING_ERR_CODE_
617# define MHD_SCKT_ENOPROTOOPT_ WSAENOPROTOOPT
618# define MHD_SCKT_ENOTSUP_ MHD_SCKT_MISSING_ERR_CODE_
619# define MHD_SCKT_EOPNOTSUPP_ WSAEOPNOTSUPP
620# define MHD_SCKT_EACCESS_ WSAEACCES
621# define MHD_SCKT_ENETDOWN_ WSAENETDOWN
622#endif
623
628#if defined(MHD_POSIX_SOCKETS)
629# define MHD_socket_get_error_() (errno)
630#elif defined(MHD_WINSOCK_SOCKETS)
631# define MHD_socket_get_error_() WSAGetLastError ()
632#endif
633
634#ifdef MHD_WINSOCK_SOCKETS
635/* POSIX-W32 sockets compatibility functions */
636
642const char*MHD_W32_strerror_winsock_ (int err);
643
644#endif /* MHD_WINSOCK_SOCKETS */
645
646/* MHD_socket_last_strerr_ is description string of specified socket error code */
647#if defined(MHD_POSIX_SOCKETS)
648# define MHD_socket_strerr_(err) strerror ((err))
649#elif defined(MHD_WINSOCK_SOCKETS)
650# define MHD_socket_strerr_(err) MHD_W32_strerror_winsock_ ((err))
651#endif
652
653/* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
654 * description string of last socket error (W32) */
655#define MHD_socket_last_strerr_() MHD_socket_strerr_ (MHD_socket_get_error_ ())
656
660#if defined(MHD_POSIX_SOCKETS)
661# define MHD_socket_fset_error_(err) (errno = (err))
662#elif defined(MHD_WINSOCK_SOCKETS)
663# define MHD_socket_fset_error_(err) (WSASetLastError ((err)))
664#endif
665
674#define MHD_socket_try_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ != (err)) ? \
675 (MHD_socket_fset_error_ ((err)), ! 0) : \
676 0)
677
683#if defined(MHD_POSIX_SOCKETS)
684# if defined(ENOSYS)
685# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
686 (errno = ENOSYS) : (errno = (err)) )
687# elif defined(EOPNOTSUPP)
688# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
689 (errno = EOPNOTSUPP) : (errno = \
690 (err)) )
691# elif defined (EFAULT)
692# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
693 (errno = EFAULT) : (errno = (err)) )
694# elif defined (EINVAL)
695# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
696 (errno = EINVAL) : (errno = (err)) )
697# else /* !EOPNOTSUPP && !EFAULT && !EINVAL */
698# warning \
699 No suitable replacement for missing socket error code is found. Edit this file and add replacement code which is defined on system.
700# define MHD_socket_set_error_(err) (errno = (err))
701# endif /* !EOPNOTSUPP && !EFAULT && !EINVAL*/
702#elif defined(MHD_WINSOCK_SOCKETS)
703# define MHD_socket_set_error_(err) ( (MHD_SCKT_MISSING_ERR_CODE_ == (err)) ? \
704 (WSASetLastError ((WSAEOPNOTSUPP))) : \
705 (WSASetLastError ((err))) )
706#endif
707
717#define MHD_SCKT_ERR_IS_(err,code) ( (MHD_SCKT_MISSING_ERR_CODE_ != (code)) && \
718 ((code) == (err)) )
719
729#define MHD_SCKT_LAST_ERR_IS_(code) MHD_SCKT_ERR_IS_ (MHD_socket_get_error_ (), \
730 (code))
731
732/* Specific error code checks */
733
740#define MHD_SCKT_ERR_IS_EINTR_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EINTR_)
741
748#if MHD_SCKT_EAGAIN_ == MHD_SCKT_EWOULDBLOCK_
749# define MHD_SCKT_ERR_IS_EAGAIN_(err) MHD_SCKT_ERR_IS_ ((err),MHD_SCKT_EAGAIN_)
750#else /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
751# define MHD_SCKT_ERR_IS_EAGAIN_(err) (MHD_SCKT_ERR_IS_ ((err), \
752 MHD_SCKT_EAGAIN_) || \
753 MHD_SCKT_ERR_IS_ ((err), \
754 MHD_SCKT_EWOULDBLOCK_) )
755#endif /* MHD_SCKT_EAGAIN_ != MHD_SCKT_EWOULDBLOCK_ */
756
762#define MHD_SCKT_ERR_IS_LOW_RESOURCES_(err) (MHD_SCKT_ERR_IS_ ((err), \
763 MHD_SCKT_EMFILE_) \
764 || \
765 MHD_SCKT_ERR_IS_ ((err), \
766 MHD_SCKT_ENFILE_) \
767 || \
768 MHD_SCKT_ERR_IS_ ((err), \
769 MHD_SCKT_ENOMEM_) \
770 || \
771 MHD_SCKT_ERR_IS_ ((err), \
772 MHD_SCKT_ENOBUFS_) )
773
780#if defined(MHD_POSIX_SOCKETS)
781# define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
782 MHD_SCKT_ECONNABORTED_)
783#elif defined(MHD_WINSOCK_SOCKETS)
784# define MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err) MHD_SCKT_ERR_IS_ ((err), \
785 MHD_SCKT_ECONNRESET_)
786#endif
787
794#define MHD_SCKT_ERR_IS_REMOTE_DISCNN_(err) (MHD_SCKT_ERR_IS_ ((err), \
795 MHD_SCKT_ECONNRESET_) \
796 || \
797 MHD_SCKT_ERR_IS_ ((err), \
798 MHD_SCKT_ECONNABORTED_))
799
800/* Specific error code set */
801
806#if MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOMEM_
807# define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
808 MHD_SCKT_ENOMEM_)
809#elif MHD_SCKT_MISSING_ERR_CODE_ != MHD_SCKT_ENOBUFS_
810# define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
811 MHD_SCKT_ENOBUFS_)
812#else
813# warning \
814 No suitable replacement for ENOMEM error codes is found. Edit this file and add replacement code which is defined on system.
815# define MHD_socket_set_error_to_ENOMEM() MHD_socket_set_error_ ( \
816 MHD_SCKT_ENOMEM_)
817#endif
818
819/* Socket functions */
820
821#if defined(AF_LOCAL)
822# define MHD_SCKT_LOCAL AF_LOCAL
823#elif defined(AF_UNIX)
824# define MHD_SCKT_LOCAL AF_UNIX
825#endif /* AF_UNIX */
826
827#if defined(MHD_POSIX_SOCKETS) && defined(MHD_SCKT_LOCAL)
828# define MHD_socket_pair_(fdarr) (! socketpair (MHD_SCKT_LOCAL, SOCK_STREAM, 0, \
829 (fdarr)))
830# if defined(HAVE_SOCK_NONBLOCK)
831# define MHD_socket_pair_nblk_(fdarr) (! socketpair (MHD_SCKT_LOCAL, \
832 SOCK_STREAM \
833 | SOCK_NONBLOCK, 0, \
834 (fdarr)))
835# endif /* HAVE_SOCK_NONBLOCK*/
836#elif defined(MHD_WINSOCK_SOCKETS)
844int MHD_W32_socket_pair_ (SOCKET sockets_pair[2], int non_blk);
845
846# define MHD_socket_pair_(fdarr) MHD_W32_socket_pair_ ((fdarr), 0)
847# define MHD_socket_pair_nblk_(fdarr) MHD_W32_socket_pair_ ((fdarr), 1)
848#endif
849
860int
862 fd_set *set,
863 MHD_socket *max_fd,
864 unsigned int fd_setsize);
865
866
873int
875
876
886int
888 bool on);
889
897int
899
900
901#if defined(SOL_SOCKET) && defined(SO_NOSIGPIPE)
902static const int _MHD_socket_int_one = 1;
909#define MHD_socket_nosignal_(sock) \
910 (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE,&_MHD_socket_int_one, \
911 sizeof(_MHD_socket_int_one)))
912#endif /* SOL_SOCKET && SO_NOSIGPIPE */
913
914
915#if defined(MHD_socket_nosignal_) || defined(MSG_NOSIGNAL)
922#define MHD_SEND_SPIPE_SUPPRESS_POSSIBLE 1
923#endif /* MHD_WINSOCK_SOCKETS || MHD_socket_nosignal_ || MSG_NOSIGNAL */
924
925#if ! defined(MHD_WINSOCK_SOCKETS)
929#define MHD_SEND_SPIPE_SUPPRESS_NEEDED 1
930#endif
931
940
941
942#endif /* ! MHD_SOCKETS_H */
int MHD_socket
Definition: mhd_sockets.h:144
int MHD_SCKT_OPT_BOOL_
Definition: mhd_sockets.h:203
size_t MHD_SCKT_SEND_SIZE_
Definition: mhd_sockets.h:213
int MHD_add_to_fd_set_(MHD_socket fd, fd_set *set, MHD_socket *max_fd, unsigned int fd_setsize)
Definition: mhd_sockets.c:377
int MHD_socket_noninheritable_(MHD_socket sock)
Definition: mhd_sockets.c:442
int MHD_socket_nonblocking_(MHD_socket sock)
Definition: mhd_sockets.c:407
MHD_socket MHD_socket_create_listen_(int pf)
Definition: mhd_sockets.c:474
additional automatic macros for MHD_config.h
limits values definitions
int MHD_socket_set_nodelay_(MHD_socket sock, bool on)
Definition: mhd_sockets.c:471
Helper for obtaining FD_SETSIZE system default value.
int MHD_socket
Definition: microhttpd.h:193
int fd
Definition: microhttpd.h:3269