1 /* 2 * Copyright (c) 2002 - 2003 3 * NetGroup, Politecnico di Torino (Italy) 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the Politecnico di Torino nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Include the appropriate OS header files on Windows and various flavors 34 * of UNIX, include various non-OS header files on Windows, and define 35 * various items as needed, to isolate most of tcpdump's platform 36 * differences to this one file. 37 */ 38 39 #ifndef tcpdump_stdinc_h 40 #define tcpdump_stdinc_h 41 42 #include <errno.h> 43 44 #ifdef WIN32 45 46 #include <stdint.h> 47 #include <stdio.h> 48 #include <winsock2.h> 49 #include <ws2tcpip.h> 50 #include "bittypes.h" /* in wpcap's Win32/include */ 51 #include <ctype.h> 52 #include <time.h> 53 #include <io.h> 54 #include <fcntl.h> 55 #include <sys/types.h> 56 #include <net/netdb.h> /* in wpcap's Win32/include */ 57 58 #ifndef uint8_t 59 #define uint8_t unsigned char 60 #endif 61 62 #ifndef int8_t 63 #define int8_t signed char 64 #endif 65 66 #ifndef uint16_t 67 #define uint16_t unsigned short 68 #endif 69 70 #ifndef int16_t 71 #define int16_t signed short 72 #endif 73 74 #ifndef uint32_t 75 #define uint32_t unsigned int 76 #endif 77 78 #ifndef int32_t 79 #define int32_t signed int 80 #endif 81 82 #ifdef _MSC_EXTENSIONS 83 84 #ifndef uint64_t 85 #define uint64_t unsigned _int64 86 #endif 87 88 #ifndef int64_t 89 #define int64_t _int64 90 #endif 91 92 #ifndef PRId64 93 #define PRId64 "I64d" 94 #endif 95 96 #ifndef PRIo64 97 #define PRIo64 "I64o" 98 #endif 99 100 #ifndef PRIu64 101 #define PRIu64 "I64u" 102 #endif 103 104 #ifndef PRIx64 105 #define PRIx64 "I64x" 106 #endif 107 108 #else /* _MSC_EXTENSIONS */ 109 110 #ifndef uint64_t 111 #define uint64_t unsigned long long 112 #endif 113 114 #ifndef int64_t 115 #define int64_t long long 116 #endif 117 118 #ifndef PRId64 119 #define PRId64 "lld" 120 #endif 121 122 #ifndef PRIo64 123 #define PRIo64 "llo" 124 #endif 125 126 #ifndef PRIu64 127 #define PRIu64 "llu" 128 #endif 129 130 #ifndef PRIx64 131 #define PRIx64 "llx" 132 #endif 133 134 #endif /* _MSC_EXTENSIONS */ 135 136 #ifdef _MSC_VER 137 #define stat _stat 138 #define open _open 139 #define fstat _fstat 140 #define read _read 141 #define close _close 142 #define O_RDONLY _O_RDONLY 143 #endif /* _MSC_VER */ 144 145 /* Protos for missing/x.c functions (ideally <missing/addrinfo.h> 146 * should be used, but it clashes with <ws2tcpip.h>). 147 */ 148 extern const char *inet_ntop (int, const void *, char *, size_t); 149 extern int inet_pton (int, const char *, void *); 150 extern int inet_aton (const char *cp, struct in_addr *addr); 151 152 /* 153 * With MSVC, for C, __inline is used to make a function an inline. 154 */ 155 #ifdef _MSC_VER 156 #define inline __inline 157 #endif 158 159 #ifndef INET6_ADDRSTRLEN 160 #define INET6_ADDRSTRLEN 46 161 #endif 162 163 /* It is in MSVC's <errno.h>, but not defined in MingW+Watcom. 164 */ 165 #ifndef EAFNOSUPPORT 166 #define EAFNOSUPPORT WSAEAFNOSUPPORT 167 #endif 168 169 #ifndef caddr_t 170 typedef char* caddr_t; 171 #endif /* caddr_t */ 172 173 #define MAXHOSTNAMELEN 64 174 #define NI_MAXHOST 1025 175 #define snprintf _snprintf 176 #define vsnprintf _vsnprintf 177 #define RETSIGTYPE void 178 179 #else /* WIN32 */ 180 181 #include <ctype.h> 182 #include <unistd.h> 183 #include <netdb.h> 184 #if HAVE_INTTYPES_H 185 #include <inttypes.h> 186 #elif HAVE_STDINT_H 187 #include <stdint.h> 188 #endif 189 #include <sys/param.h> 190 #include <sys/types.h> /* concession to AIX */ 191 #include <sys/time.h> 192 #include <sys/socket.h> 193 #include <netinet/in.h> 194 195 #ifdef TIME_WITH_SYS_TIME 196 #include <time.h> 197 #endif 198 199 #include <arpa/inet.h> 200 201 #endif /* WIN32 */ 202 203 #ifndef HAVE___ATTRIBUTE__ 204 #define __attribute__(x) 205 #endif 206 207 /* 208 * Used to declare a structure unaligned, so that the C compiler, 209 * if necessary, generates code that doesn't assume alignment. 210 * This is required because there is no guarantee that the packet 211 * data we get from libpcap/WinPcap is properly aligned. 212 * 213 * This assumes that, for all compilers that support __attribute__: 214 * 215 * 1) they support __attribute__((packed)); 216 * 217 * 2) for all instruction set architectures requiring strict 218 * alignment, declaring a structure with that attribute 219 * causes the compiler to generate code that handles 220 * misaligned 2-byte, 4-byte, and 8-byte integral 221 * quantities. 222 * 223 * It does not (yet) handle compilers where you can get the compiler 224 * to generate code of that sort by some other means. 225 * 226 * This is required in order to, for example, keep the compiler from 227 * generating, for 228 * 229 * if (bp->bp_htype == 1 && bp->bp_hlen == 6 && bp->bp_op == BOOTPREQUEST) { 230 * 231 * in print-bootp.c, code that loads the first 4-byte word of a 232 * "struct bootp", masking out the bp_hops field, and comparing the result 233 * against 0x01010600. 234 * 235 * Note: this also requires that padding be put into the structure, 236 * at least for compilers where it's implemented as __attribute__((packed)). 237 */ 238 #if !(defined(_MSC_VER) && defined(UNALIGNED)) 239 /* MSVC may have its own macro defined with the same name and purpose. */ 240 #undef UNALIGNED 241 #define UNALIGNED __attribute__((packed)) 242 #endif 243 244 #if defined(WIN32) || defined(MSDOS) 245 #define FOPEN_READ_TXT "rt" 246 #define FOPEN_READ_BIN "rb" 247 #define FOPEN_WRITE_TXT "wt" 248 #define FOPEN_WRITE_BIN "wb" 249 #else 250 #define FOPEN_READ_TXT "r" 251 #define FOPEN_READ_BIN FOPEN_READ_TXT 252 #define FOPEN_WRITE_TXT "w" 253 #define FOPEN_WRITE_BIN FOPEN_WRITE_TXT 254 #endif 255 256 #if defined(__GNUC__) && defined(__i386__) && !defined(__APPLE__) && !defined(__ntohl) 257 #undef ntohl 258 #undef ntohs 259 #undef htonl 260 #undef htons 261 262 static __inline__ unsigned long __ntohl (unsigned long x); 263 static __inline__ unsigned short __ntohs (unsigned short x); 264 265 #define ntohl(x) __ntohl(x) 266 #define ntohs(x) __ntohs(x) 267 #define htonl(x) __ntohl(x) 268 #define htons(x) __ntohs(x) 269 270 static __inline__ unsigned long __ntohl (unsigned long x) 271 { 272 __asm__ ("xchgb %b0, %h0\n\t" /* swap lower bytes */ 273 "rorl $16, %0\n\t" /* swap words */ 274 "xchgb %b0, %h0" /* swap higher bytes */ 275 : "=q" (x) : "0" (x)); 276 return (x); 277 } 278 279 static __inline__ unsigned short __ntohs (unsigned short x) 280 { 281 __asm__ ("xchgb %b0, %h0" /* swap bytes */ 282 : "=q" (x) : "0" (x)); 283 return (x); 284 } 285 #endif 286 287 #ifndef INET_ADDRSTRLEN 288 #define INET_ADDRSTRLEN 16 289 #endif 290 291 #ifndef TRUE 292 #define TRUE 1 293 #endif 294 295 #ifndef FALSE 296 #define FALSE 0 297 #endif 298 299 /* 300 * The Apple deprecation workaround macros below were adopted from the 301 * FreeRADIUS server code under permission of Alan DeKok and Arran Cudbard-Bell. 302 */ 303 304 #define XSTRINGIFY(x) #x 305 306 /* 307 * Macros for controlling warnings in GCC >= 4.2 and clang >= 2.8 308 */ 309 #define DIAG_JOINSTR(x,y) XSTRINGIFY(x ## y) 310 #define DIAG_DO_PRAGMA(x) _Pragma (#x) 311 312 #if defined(__GNUC__) && ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402 313 # define DIAG_PRAGMA(x) DIAG_DO_PRAGMA(GCC diagnostic x) 314 # if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 315 # define DIAG_OFF(x) DIAG_PRAGMA(push) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x)) 316 # define DIAG_ON(x) DIAG_PRAGMA(pop) 317 # else 318 # define DIAG_OFF(x) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x)) 319 # define DIAG_ON(x) DIAG_PRAGMA(warning DIAG_JOINSTR(-W,x)) 320 # endif 321 #elif defined(__clang__) && ((__clang_major__ * 100) + __clang_minor__ >= 208) 322 # define DIAG_PRAGMA(x) DIAG_DO_PRAGMA(clang diagnostic x) 323 # define DIAG_OFF(x) DIAG_PRAGMA(push) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x)) 324 # define DIAG_ON(x) DIAG_PRAGMA(pop) 325 #else 326 # define DIAG_OFF(x) 327 # define DIAG_ON(x) 328 #endif 329 330 /* 331 * For dealing with APIs which are only deprecated in OSX (like the OpenSSL API) 332 */ 333 #ifdef __APPLE__ 334 # define USES_APPLE_DEPRECATED_API DIAG_OFF(deprecated-declarations) 335 # define USES_APPLE_RST DIAG_ON(deprecated-declarations) 336 #else 337 # define USES_APPLE_DEPRECATED_API 338 # define USES_APPLE_RST 339 #endif 340 341 /* 342 * end of Apple deprecation workaround macros 343 */ 344 345 #ifndef min 346 #define min(a,b) ((a)>(b)?(b):(a)) 347 #endif 348 #ifndef max 349 #define max(a,b) ((b)>(a)?(b):(a)) 350 #endif 351 352 #endif /* tcpdump_stdinc_h */ 353