1/*
2     This file is part of libmicrohttpd
3     Copyright (C) 2008 Christian Grothoff (and other contributing authors)
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/**
21 * @file platform.h
22 * @brief platform-specific includes for libmicrohttpd
23 * @author Christian Grothoff
24 *
25 * This file is included by the libmicrohttpd code
26 * before "microhttpd.h"; it provides the required
27 * standard headers (which are platform-specific).<p>
28 *
29 * Note that this file depends on our configure.ac
30 * build process and the generated config.h file.
31 * Hence you cannot include it directly in applications
32 * that use libmicrohttpd.
33 */
34#ifndef MHD_PLATFORM_H
35#define MHD_PLATFORM_H
36
37#include "MHD_config.h"
38
39#ifndef BUILDING_MHD_LIB
40#ifdef _MHD_EXTERN
41#undef _MHD_EXTERN
42#endif /* _MHD_EXTERN */
43#if defined(_WIN32) && defined(MHD_W32LIB)
44#define _MHD_EXTERN extern
45#elif defined (_WIN32) && defined(MHD_W32DLL)
46#define _MHD_EXTERN __declspec(dllimport)
47#else
48#define _MHD_EXTERN extern
49#endif
50#elif !defined(_MHD_EXTERN) /* && BUILDING_MHD_LIB */
51#if defined(_WIN32) && defined(MHD_W32LIB)
52#define _MHD_EXTERN extern
53#elif defined (_WIN32) && defined(MHD_W32DLL)
54#define _MHD_EXTERN extern __declspec(dllexport)
55#else
56#define _MHD_EXTERN extern
57#endif
58#endif /* BUILDING_MHD_LIB */
59
60#define _XOPEN_SOURCE_EXTENDED  1
61#if OS390
62#define _OPEN_THREADS
63#define _OPEN_SYS_SOCK_IPV6
64#define _OPEN_MSGQ_EXT
65#define _LP64
66#endif
67
68#if defined(_WIN32)
69#ifndef _WIN32_WINNT
70#define _WIN32_WINNT 0x0501
71#else // _WIN32_WINNT
72#if _WIN32_WINNT < 0x0501
73#error "Headers for Windows XP or later are required"
74#endif // _WIN32_WINNT < 0x0501
75#endif // _WIN32_WINNT
76#ifndef WIN32_LEAN_AND_MEAN
77#define WIN32_LEAN_AND_MEAN 1
78#endif /* !WIN32_LEAN_AND_MEAN */
79#endif // _WIN32
80
81#include <stdio.h>
82#include <stdlib.h>
83#include <stdint.h>
84#include <string.h>
85#ifdef HAVE_UNISTD_H
86#include <unistd.h>
87#endif
88#include <stdarg.h>
89#include <errno.h>
90#include <fcntl.h>
91#include <signal.h>
92#include <stddef.h>
93#ifdef MHD_USE_POSIX_THREADS
94#undef HAVE_CONFIG_H
95#include <pthread.h>
96#define HAVE_CONFIG_H 1
97#endif // MHD_USE_POSIX_THREADS
98
99/* different OSes have fd_set in
100   a broad range of header files;
101   we just include most of them (if they
102   are available) */
103
104
105#ifdef OS_VXWORKS
106#include <sockLib.h>
107#include <netinet/in.h>
108#include <stdarg.h>
109#include <sys/mman.h>
110#define RESTRICT __restrict__
111#endif
112#if HAVE_MEMORY_H
113#include <memory.h>
114#endif
115
116#if HAVE_SYS_SELECT_H
117#include <sys/select.h>
118#endif
119#if HAVE_SYS_TYPES_H
120#include <sys/types.h>
121#endif
122#if HAVE_SYS_TIME_H
123#include <sys/time.h>
124#endif
125#if HAVE_SYS_STAT_H
126#include <sys/stat.h>
127#endif
128#if HAVE_SYS_MSG_H
129#include <sys/msg.h>
130#endif
131#if HAVE_SYS_MMAN_H
132#include <sys/mman.h>
133#endif
134#if HAVE_NETDB_H
135#include <netdb.h>
136#endif
137#if HAVE_NETINET_IN_H
138#include <netinet/in.h>
139#endif
140#if HAVE_TIME_H
141#include <time.h>
142#endif
143#if HAVE_SYS_SOCKET_H
144#include <sys/socket.h>
145#endif
146#if HAVE_ARPA_INET_H
147#include <arpa/inet.h>
148#endif
149
150
151#if defined(_WIN32) && !defined(__CYGWIN__)
152#include <ws2tcpip.h>
153#define sleep(seconds) (SleepEx((seconds)*1000, 1)/1000)
154#define usleep(useconds) (void)SleepEx((useconds)/1000, 1)
155#endif
156
157#if !defined(SHUT_WR) && defined(SD_SEND)
158#define SHUT_WR SD_SEND
159#endif
160#if !defined(SHUT_RD) && defined(SD_RECEIVE)
161#define SHUT_RD SD_RECEIVE
162#endif
163#if !defined(SHUT_RDWR) && defined(SD_BOTH)
164#define SHUT_RDWR SD_BOTH
165#endif
166
167#if defined(_MSC_FULL_VER) && !defined (_SSIZE_T_DEFINED)
168#define _SSIZE_T_DEFINED
169typedef intptr_t ssize_t;
170#endif // !_SSIZE_T_DEFINED */
171#ifndef MHD_SOCKET_DEFINED
172/**
173 * MHD_socket is type for socket FDs
174 */
175#if !defined(_WIN32) || defined(_SYS_TYPES_FD_SET)
176#define MHD_POSIX_SOCKETS 1
177typedef int MHD_socket;
178#define MHD_INVALID_SOCKET (-1)
179#else /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */
180#define MHD_WINSOCK_SOCKETS 1
181#include <winsock2.h>
182typedef SOCKET MHD_socket;
183#define MHD_INVALID_SOCKET (INVALID_SOCKET)
184#endif /* !defined(_WIN32) || defined(_SYS_TYPES_FD_SET) */
185#define MHD_SOCKET_DEFINED 1
186#endif /* MHD_SOCKET_DEFINED */
187
188/* Force don't use pipes on W32 */
189#if defined(_WIN32) && !defined(MHD_DONT_USE_PIPES)
190#define MHD_DONT_USE_PIPES 1
191#endif /* defined(_WIN32) && !defined(MHD_DONT_USE_PIPES) */
192
193/* MHD_pipe is type for pipe FDs*/
194#ifndef MHD_DONT_USE_PIPES
195typedef int MHD_pipe;
196#else /* ! MHD_DONT_USE_PIPES */
197typedef MHD_socket MHD_pipe;
198#endif /* ! MHD_DONT_USE_PIPES */
199
200#if !defined(IPPROTO_IPV6) && defined(_MSC_FULL_VER) && _WIN32_WINNT >= 0x0501
201/* VC use IPPROTO_IPV6 as part of enum */
202#define IPPROTO_IPV6 IPPROTO_IPV6
203#endif
204
205#endif
206