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