X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/c94fccbfceecbf8c936fdaa4a5b9dc5e4fff0b09..HEAD:/netdissect-stdinc.h diff --git a/netdissect-stdinc.h b/netdissect-stdinc.h index c7070f0a..15c3e284 100644 --- a/netdissect-stdinc.h +++ b/netdissect-stdinc.h @@ -39,120 +39,149 @@ #ifndef netdissect_stdinc_h #define netdissect_stdinc_h +#include "ftmacros.h" + #include +#include "compiler-tests.h" + +#include "varattrs.h" + +/* + * If we're compiling with Visual Studio, make sure we have at least + * VS 2015 or later, so we have sufficient C99 support. + * + * XXX - verify that we have at least C99 support on UN*Xes? + * + * What about MinGW or various DOS toolchains? We're currently assuming + * sufficient C99 support there. + */ +#if defined(_MSC_VER) + /* + * Make sure we have VS 2015 or later. + */ + #if _MSC_VER < 1900 + #error "Building tcpdump requires VS 2015 or later" + #endif +#endif + +/* + * Get the C99 types, and the PRI[doux]64 format strings, defined. + */ +#ifdef HAVE_PCAP_PCAP_INTTYPES_H + /* + * We have pcap/pcap-inttypes.h; use that, as it'll do all the + * work, and won't cause problems if a file includes this file + * and later includes a pcap header file that also includes + * pcap/pcap-inttypes.h. + */ + #include +#else + /* + * OK, we don't have pcap/pcap-inttypes.h, so we'll have to + * do the work ourselves, but at least we don't have to + * worry about other headers including it and causing + * clashes. + */ + + /* + * Include to get the integer types and PRi[doux]64 values + * defined. + * + * If the compiler is MSVC, we require VS 2015 or newer, so we + * have - and support for %zu in the formatted + * printing functions. + * + * If the compiler is MinGW, we assume we have - and + * support for %zu in the formatted printing functions. + * + * If the target is UN*X, we assume we have a C99-or-later development + * environment, and thus have - and support for %zu in + * the formatted printing functions. + * + * If the target is MS-DOS, we assume we have - and support + * for %zu in the formatted printing functions. + */ + #include + + #if defined(_MSC_VER) + /* + * Suppress definition of intN_t in bittypes.h, which might be included + * by in older versions of WinPcap. + * (Yes, HAVE_U_INTn_T, as the definition guards are UN*X-oriented.) + */ + #define HAVE_U_INT8_T + #define HAVE_U_INT16_T + #define HAVE_U_INT32_T + #define HAVE_U_INT64_T + #endif +#endif /* HAVE_PCAP_PCAP_INTTYPES_H */ + #ifdef _WIN32 /* * Includes and definitions for Windows. */ -#include #include #include #include -#include #include #include #include #include -#ifndef uint8_t -#define uint8_t unsigned char -#endif - -#ifndef int8_t -#define int8_t signed char -#endif - -#ifndef uint16_t -#define uint16_t unsigned short -#endif - -#ifndef int16_t -#define int16_t signed short -#endif - -#ifndef uint32_t -#define uint32_t unsigned int -#endif - -#ifndef int32_t -#define int32_t signed int -#endif - -#ifdef _MSC_EXTENSIONS - -#ifndef uint64_t -#define uint64_t unsigned _int64 -#endif - -#ifndef int64_t -#define int64_t _int64 -#endif - -#ifndef PRId64 -#define PRId64 "I64d" -#endif - -#ifndef PRIo64 -#define PRIo64 "I64o" -#endif - -#ifndef PRIu64 -#define PRIu64 "I64u" -#endif - -#ifndef PRIx64 -#define PRIx64 "I64x" -#endif - -#else /* _MSC_EXTENSIONS */ - -#ifndef uint64_t -#define uint64_t unsigned long long -#endif - -#ifndef int64_t -#define int64_t long long -#endif - -#ifndef PRId64 -#define PRId64 "lld" -#endif - -#ifndef PRIo64 -#define PRIo64 "llo" -#endif - -#ifndef PRIu64 -#define PRIu64 "llu" -#endif - -#ifndef PRIx64 -#define PRIx64 "llx" +#ifdef _MSC_VER + /* + * Compiler is MSVC. + * + * We require VS 2015 or newer, so we have strtoll(). Use that for + * strtoint64_t(). + */ + #define strtoint64_t strtoll +#else + /* + * Non-Microsoft compiler. + * + * XXX - should we use strtoll or should we use _strtoi64()? + */ + #define strtoint64_t strtoll #endif -#endif /* _MSC_EXTENSIONS */ - -/* - * Suppress definition of intN_t in bittypes.h, as included by - * on Windows. - * (Yes, HAVE_U_INTn_T, as the definition guards are UN*X-oriented, and - * we check for u_intN_t in the UN*X configure script.) - */ -#define HAVE_U_INT8_T -#define HAVE_U_INT16_T -#define HAVE_U_INT32_T -#define HAVE_U_INT64_T - #ifdef _MSC_VER -#define stat _stat -#define open _open -#define fstat _fstat -#define read _read -#define close _close -#define O_RDONLY _O_RDONLY + /* + * Microsoft tries to avoid polluting the C namespace with UN*Xisms, + * by adding a preceding underscore; we *want* the UN*Xisms, so add + * #defines to let us use them. + */ + #define isatty _isatty + #define stat _stat + #define open _open + #define read _read + #define close _close + #define O_RDONLY _O_RDONLY + + /* + * We define our_fstat64 as _fstati64, and define our_statb as + * struct _stati64, so we get 64-bit file sizes. + */ + #define our_fstat _fstati64 + #define our_statb struct _stati64 + + /* + * If has been included, and _DEBUG is defined, and + * __STDC__ is zero, will define strdup() to call + * _strdup_dbg(). So if it's already defined, don't redefine + * it. + */ + #ifndef strdup + #define strdup _strdup + #endif + + /* + * Windows doesn't have ssize_t; routines such as _read() return int. + */ + typedef int ssize_t; #endif /* _MSC_VER */ /* @@ -162,10 +191,6 @@ #define inline __inline #endif -#ifdef AF_INET6 -#define HAVE_OS_IPV6_SUPPORT -#endif - #ifndef INET6_ADDRSTRLEN #define INET6_ADDRSTRLEN 46 #endif @@ -177,13 +202,10 @@ #endif #ifndef caddr_t -typedef char* caddr_t; +typedef char *caddr_t; #endif /* caddr_t */ #define MAXHOSTNAMELEN 64 -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#define RETSIGTYPE void #else /* _WIN32 */ @@ -191,68 +213,35 @@ typedef char* caddr_t; * Includes and definitions for various flavors of UN*X. */ -#include #include #include -#if HAVE_INTTYPES_H -#include -#elif HAVE_STDINT_H -#include -#endif #include #include /* concession to AIX */ #include #include #include -#ifdef TIME_WITH_SYS_TIME #include -#endif #include -#endif /* _WIN32 */ +/* + * We should have large file support enabled, if it's available, + * so just use fstat as our_fstat and struct stat as our_statb. + */ +#define our_fstat fstat +#define our_statb struct stat -#ifndef HAVE___ATTRIBUTE__ -#define __attribute__(x) -#endif +/* + * Assume all UN*Xes have strtoll(), and use it for strtoint64_t(). + */ +#define strtoint64_t strtoll +#endif /* _WIN32 */ /* - * Used to declare a structure unaligned, so that the C compiler, - * if necessary, generates code that doesn't assume alignment. - * This is required because there is no guarantee that the packet - * data we get from libpcap/WinPcap is properly aligned. - * - * This assumes that, for all compilers that support __attribute__: - * - * 1) they support __attribute__((packed)); - * - * 2) for all instruction set architectures requiring strict - * alignment, declaring a structure with that attribute - * causes the compiler to generate code that handles - * misaligned 2-byte, 4-byte, and 8-byte integral - * quantities. - * - * It does not (yet) handle compilers where you can get the compiler - * to generate code of that sort by some other means. - * - * This is required in order to, for example, keep the compiler from - * generating, for - * - * if (bp->bp_htype == 1 && bp->bp_hlen == 6 && bp->bp_op == BOOTPREQUEST) { - * - * in print-bootp.c, code that loads the first 4-byte word of a - * "struct bootp", masking out the bp_hops field, and comparing the result - * against 0x01010600. - * - * Note: this also requires that padding be put into the structure, - * at least for compilers where it's implemented as __attribute__((packed)). + * Function attributes, for various compilers. */ -#if !(defined(_MSC_VER) && defined(UNALIGNED)) -/* MSVC may have its own macro defined with the same name and purpose. */ -#undef UNALIGNED -#define UNALIGNED __attribute__((packed)) -#endif +#include "funcattrs.h" /* * fopen() read and write modes for text files and binary files. @@ -275,8 +264,8 @@ typedef char* caddr_t; * an 80386, so, for example, it avoids the bswap instruction added in * the 80486. * - * (We don't use them on OS X; Apple provides their own, which *doesn't* - * avoid the bswap instruction, as OS X only supports machines that + * (We don't use them on macOS; Apple provides their own, which *doesn't* + * avoid the bswap instruction, as macOS only supports machines that * have it.) */ #if defined(__GNUC__) && defined(__i386__) && !defined(__APPLE__) && !defined(__ntohl) @@ -310,28 +299,6 @@ typedef char* caddr_t; } #endif -/* - * If the OS doesn't define AF_INET6 and struct in6_addr: - * - * define AF_INET6, so we can use it internally as a "this is an - * IPv6 address" indication; - * - * define struct in6_addr so that we can use it for IPv6 addresses. - */ -#ifndef HAVE_OS_IPV6_SUPPORT -#ifndef AF_INET6 -#define AF_INET6 24 - -struct in6_addr { - union { - __uint8_t __u6_addr8[16]; - __uint16_t __u6_addr16[8]; - __uint32_t __u6_addr32[4]; - } __u6_addr; /* 128-bit IP6 address */ -}; -#endif -#endif - #ifndef NI_MAXHOST #define NI_MAXHOST 1025 #endif @@ -349,56 +316,25 @@ struct in6_addr { #endif /* - * The Apple deprecation workaround macros below were adopted from the - * FreeRADIUS server code under permission of Alan DeKok and Arran Cudbard-Bell. - */ - -#define XSTRINGIFY(x) #x - -/* - * Macros for controlling warnings in GCC >= 4.2 and clang >= 2.8 - */ -#define DIAG_JOINSTR(x,y) XSTRINGIFY(x ## y) -#define DIAG_DO_PRAGMA(x) _Pragma (#x) - -#if defined(__GNUC__) && ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402 -# define DIAG_PRAGMA(x) DIAG_DO_PRAGMA(GCC diagnostic x) -# if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 -# define DIAG_OFF(x) DIAG_PRAGMA(push) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x)) -# define DIAG_ON(x) DIAG_PRAGMA(pop) -# else -# define DIAG_OFF(x) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x)) -# define DIAG_ON(x) DIAG_PRAGMA(warning DIAG_JOINSTR(-W,x)) -# endif -#elif defined(__clang__) && ((__clang_major__ * 100) + __clang_minor__ >= 208) -# define DIAG_PRAGMA(x) DIAG_DO_PRAGMA(clang diagnostic x) -# define DIAG_OFF(x) DIAG_PRAGMA(push) DIAG_PRAGMA(ignored DIAG_JOINSTR(-W,x)) -# define DIAG_ON(x) DIAG_PRAGMA(pop) -#else -# define DIAG_OFF(x) -# define DIAG_ON(x) -#endif - -/* - * For dealing with APIs which are only deprecated in OSX (like the OpenSSL API) + * Statement attributes, for various compilers. + * + * This was introduced sufficiently recently that compilers implementing + * it also implement __has_attribute() (for example, GCC 5.0 and later + * have __has_attribute(), and the "fallthrough" attribute was introduced + * in GCC 7). + * + * Unfortunately, Clang does this wrong - a statement + * + * __attribute__ ((fallthrough)); + * + * produces bogus -Wmissing-declaration "declaration does not declare + * anything" warnings (dear Clang: that's not a declaration, it's an + * empty statement). GCC, however, has no trouble with this. */ -#ifdef __APPLE__ -# define USES_APPLE_DEPRECATED_API DIAG_OFF(deprecated-declarations) -# define USES_APPLE_RST DIAG_ON(deprecated-declarations) +#if __has_attribute(fallthrough) && !defined(__clang__) +# define ND_FALL_THROUGH __attribute__ ((fallthrough)) #else -# define USES_APPLE_DEPRECATED_API -# define USES_APPLE_RST -#endif - -/* - * end of Apple deprecation workaround macros - */ - -#ifndef min -#define min(a,b) ((a)>(b)?(b):(a)) -#endif -#ifndef max -#define max(a,b) ((b)>(a)?(b):(a)) -#endif +# define ND_FALL_THROUGH +#endif /* __has_attribute(fallthrough) */ #endif /* netdissect_stdinc_h */