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