X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/de7c6192e47b605a48b6fc37adf8de31a1b331a3..0f328b4aa16b0b47f05a85c440ce1d07719e3cac:/netdissect-stdinc.h diff --git a/netdissect-stdinc.h b/netdissect-stdinc.h old mode 100755 new mode 100644 index e201afa4..b214be5f --- a/netdissect-stdinc.h +++ b/netdissect-stdinc.h @@ -41,13 +41,124 @@ #include +/* + * 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. + */ + #if defined(_MSC_VER) + /* + * Compiler is MSVC. + */ + #if _MSC_VER >= 1800 + /* + * VS 2013 or newer; we have . + */ + #include + #else + /* + * Earlier VS; we have to define this stuff ourselves. + */ + typedef unsigned char uint8_t; + typedef signed char int8_t; + typedef unsigned short uint16_t; + typedef signed short int16_t; + typedef unsigned int uint32_t; + typedef signed int int32_t; + #ifdef _MSC_EXTENSIONS + typedef unsigned _int64 uint64_t; + typedef _int64 int64_t; + #else /* _MSC_EXTENSIONS */ + typedef unsigned long long uint64_t; + typedef long long int64_t; + #endif + + /* + * We have _strtoi64(). Use that for strtoint64_t(). + */ + #define strtoint64_t _strtoi64 + #endif + + /* + * 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, 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 + + /* + * These may be defined by . If not, define them + * ourselves. + * + * XXX - for MSVC, we always want the _MSC_EXTENSIONS versions. + * What about other compilers? If, as the MinGW Web site says MinGW + * does, the other compilers just use Microsoft's run-time library, + * then they should probably use the _MSC_EXTENSIONS even if the + * compiler doesn't define _MSC_EXTENSIONS. + */ + #ifndef PRId64 + #ifdef _MSC_EXTENSIONS + #define PRId64 "I64d" + #else + #define PRId64 "lld" + #endif + #endif /* PRId64 */ + + #ifndef PRIo64 + #ifdef _MSC_EXTENSIONS + #define PRIo64 "I64o" + #else + #define PRIo64 "llo" + #endif + #endif /* PRIo64 */ + + #ifndef PRIx64 + #ifdef _MSC_EXTENSIONS + #define PRIx64 "I64x" + #else + #define PRIx64 "llx" + #endif + #endif + + #ifndef PRIu64 + #ifdef _MSC_EXTENSIONS + #define PRIu64 "I64u" + #else + #define PRIu64 "llu" + #endif + #endif + #elif defined(__MINGW32__) || !defined(_WIN32) + /* + * Compiler is MinGW or target is UN*X or MS-DOS. Just use + * . + */ + #include + #endif +#endif /* HAVE_PCAP_PCAP_INTTYPES_H */ + #ifdef _WIN32 /* * Includes and definitions for Windows. */ -#include #include #include #include @@ -57,95 +168,42 @@ #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 +#ifdef _MSC_VER + /* + * Compiler is MSVC. + */ + #if _MSC_VER >= 1800 + /* + * VS 2013 or newer; we have strtoll(). Use that for strtoint64_t(). + */ + #define strtoint64_t strtoll + #else + /* + * Earlier VS; we don't have strtoll(), but we do have + * _strtoi64(). Use that for strtoint64_t(). + */ + #define strtoint64_t _strtoi64 + #endif + + /* + * Microsoft's documentation doesn't speak of LL as a valid + * suffix for 64-bit integers, so we'll just use i64. + */ + #define INT64_T_CONSTANT(constant) (constant##i64) +#else + /* + * Non-Microsoft compiler. + * + * XXX - should we use strtoll or should we use _strtoi64()? + */ + #define strtoint64_t strtoll -#ifndef PRIx64 -#define PRIx64 "llx" + /* + * Assume LL works. + */ + #define INT64_T_CONSTANT(constant) (constant##LL) #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 @@ -162,7 +220,7 @@ #define inline __inline #endif -#ifdef AF_INET6 +#if defined(AF_INET6) && !defined(HAVE_OS_IPV6_SUPPORT) #define HAVE_OS_IPV6_SUPPORT #endif @@ -183,7 +241,6 @@ typedef char* caddr_t; #define MAXHOSTNAMELEN 64 #define snprintf _snprintf #define vsnprintf _vsnprintf -#define RETSIGTYPE void #else /* _WIN32 */ @@ -194,23 +251,26 @@ typedef char* caddr_t; #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 +/* + * Assume all UN*Xes have strtoll(), and use it for strtoint64_t(). + */ +#define strtoint64_t strtoll + +/* + * Assume LL works. + */ +#define INT64_T_CONSTANT(constant) (constant##LL) + #endif /* _WIN32 */ #ifndef HAVE___ATTRIBUTE__ @@ -319,6 +379,7 @@ typedef char* caddr_t; * 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 { @@ -329,11 +390,12 @@ struct in6_addr { } __u6_addr; /* 128-bit IP6 address */ }; #endif +#endif #ifndef NI_MAXHOST #define NI_MAXHOST 1025 #endif - + #ifndef INET_ADDRSTRLEN #define INET_ADDRSTRLEN 16 #endif @@ -359,7 +421,20 @@ struct in6_addr { #define DIAG_JOINSTR(x,y) XSTRINGIFY(x ## y) #define DIAG_DO_PRAGMA(x) _Pragma (#x) -#if defined(__GNUC__) && ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402 +/* + * The current clang compilers also define __GNUC__ and __GNUC_MINOR__ + * thus we need to test the clang case before the GCC one + */ +#if defined(__clang__) +# if (__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 +#elif 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)) @@ -368,15 +443,20 @@ struct in6_addr { # 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 +/* Use for clang specific warnings */ +#ifdef __clang__ +# define DIAG_OFF_CLANG(x) DIAG_OFF(x) +# define DIAG_ON_CLANG(x) DIAG_ON(x) +#else +# define DIAG_OFF_CLANG(x) +# define DIAG_ON_CLANG(x) +#endif + /* * For dealing with APIs which are only deprecated in OSX (like the OpenSSL API) */ @@ -392,6 +472,11 @@ struct in6_addr { * end of Apple deprecation workaround macros */ +/* + * Function attributes, for various compilers. + */ +#include "funcattrs.h" + #ifndef min #define min(a,b) ((a)>(b)?(b):(a)) #endif @@ -399,4 +484,10 @@ struct in6_addr { #define max(a,b) ((b)>(a)?(b):(a)) #endif +#ifdef __ATTRIBUTE___FALLTHROUGH_OK +# define ND_FALL_THROUGH __attribute__ ((fallthrough)) +#else +# define ND_FALL_THROUGH +#endif /* __ATTRIBUTE___FALLTHROUGH_OK */ + #endif /* netdissect_stdinc_h */