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 169 typedef 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 177 typedef 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> 182 typedef 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 195 typedef int MHD_pipe; 196 #else /* ! MHD_DONT_USE_PIPES */ 197 typedef 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