1*8b26181fSAndroid Build Coastguard Worker /* 2*8b26181fSAndroid Build Coastguard Worker * Copyright (c) 1994, 1995, 1996 3*8b26181fSAndroid Build Coastguard Worker * The Regents of the University of California. All rights reserved. 4*8b26181fSAndroid Build Coastguard Worker * 5*8b26181fSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*8b26181fSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*8b26181fSAndroid Build Coastguard Worker * are met: 8*8b26181fSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 9*8b26181fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*8b26181fSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 11*8b26181fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 12*8b26181fSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 13*8b26181fSAndroid Build Coastguard Worker * 3. All advertising materials mentioning features or use of this software 14*8b26181fSAndroid Build Coastguard Worker * must display the following acknowledgement: 15*8b26181fSAndroid Build Coastguard Worker * This product includes software developed by the Computer Systems 16*8b26181fSAndroid Build Coastguard Worker * Engineering Group at Lawrence Berkeley Laboratory. 17*8b26181fSAndroid Build Coastguard Worker * 4. Neither the name of the University nor of the Laboratory may be used 18*8b26181fSAndroid Build Coastguard Worker * to endorse or promote products derived from this software without 19*8b26181fSAndroid Build Coastguard Worker * specific prior written permission. 20*8b26181fSAndroid Build Coastguard Worker * 21*8b26181fSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22*8b26181fSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23*8b26181fSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24*8b26181fSAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25*8b26181fSAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26*8b26181fSAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27*8b26181fSAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28*8b26181fSAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29*8b26181fSAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30*8b26181fSAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*8b26181fSAndroid Build Coastguard Worker * SUCH DAMAGE. 32*8b26181fSAndroid Build Coastguard Worker */ 33*8b26181fSAndroid Build Coastguard Worker 34*8b26181fSAndroid Build Coastguard Worker #ifndef portability_h 35*8b26181fSAndroid Build Coastguard Worker #define portability_h 36*8b26181fSAndroid Build Coastguard Worker 37*8b26181fSAndroid Build Coastguard Worker /* 38*8b26181fSAndroid Build Coastguard Worker * Helpers for portability between Windows and UN*X and between different 39*8b26181fSAndroid Build Coastguard Worker * flavors of UN*X. 40*8b26181fSAndroid Build Coastguard Worker */ 41*8b26181fSAndroid Build Coastguard Worker #include <stdarg.h> /* we declare varargs functions on some platforms */ 42*8b26181fSAndroid Build Coastguard Worker 43*8b26181fSAndroid Build Coastguard Worker #include "pcap/funcattrs.h" 44*8b26181fSAndroid Build Coastguard Worker 45*8b26181fSAndroid Build Coastguard Worker #ifdef __cplusplus 46*8b26181fSAndroid Build Coastguard Worker extern "C" { 47*8b26181fSAndroid Build Coastguard Worker #endif 48*8b26181fSAndroid Build Coastguard Worker 49*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_STRLCAT 50*8b26181fSAndroid Build Coastguard Worker #define pcap_strlcat strlcat 51*8b26181fSAndroid Build Coastguard Worker #else 52*8b26181fSAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW32__) 53*8b26181fSAndroid Build Coastguard Worker /* 54*8b26181fSAndroid Build Coastguard Worker * strncat_s() is supported at least back to Visual 55*8b26181fSAndroid Build Coastguard Worker * Studio 2005; we require Visual Studio 2015 or later. 56*8b26181fSAndroid Build Coastguard Worker */ 57*8b26181fSAndroid Build Coastguard Worker #define pcap_strlcat(x, y, z) \ 58*8b26181fSAndroid Build Coastguard Worker strncat_s((x), (z), (y), _TRUNCATE) 59*8b26181fSAndroid Build Coastguard Worker #else 60*8b26181fSAndroid Build Coastguard Worker /* 61*8b26181fSAndroid Build Coastguard Worker * Define it ourselves. 62*8b26181fSAndroid Build Coastguard Worker */ 63*8b26181fSAndroid Build Coastguard Worker extern size_t pcap_strlcat(char * restrict dst, const char * restrict src, size_t dstsize); 64*8b26181fSAndroid Build Coastguard Worker #endif 65*8b26181fSAndroid Build Coastguard Worker #endif 66*8b26181fSAndroid Build Coastguard Worker 67*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_STRLCPY 68*8b26181fSAndroid Build Coastguard Worker #define pcap_strlcpy strlcpy 69*8b26181fSAndroid Build Coastguard Worker #else 70*8b26181fSAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW32__) 71*8b26181fSAndroid Build Coastguard Worker /* 72*8b26181fSAndroid Build Coastguard Worker * strncpy_s() is supported at least back to Visual 73*8b26181fSAndroid Build Coastguard Worker * Studio 2005; we require Visual Studio 2015 or later. 74*8b26181fSAndroid Build Coastguard Worker */ 75*8b26181fSAndroid Build Coastguard Worker #define pcap_strlcpy(x, y, z) \ 76*8b26181fSAndroid Build Coastguard Worker strncpy_s((x), (z), (y), _TRUNCATE) 77*8b26181fSAndroid Build Coastguard Worker #else 78*8b26181fSAndroid Build Coastguard Worker /* 79*8b26181fSAndroid Build Coastguard Worker * Define it ourselves. 80*8b26181fSAndroid Build Coastguard Worker */ 81*8b26181fSAndroid Build Coastguard Worker extern size_t pcap_strlcpy(char * restrict dst, const char * restrict src, size_t dstsize); 82*8b26181fSAndroid Build Coastguard Worker #endif 83*8b26181fSAndroid Build Coastguard Worker #endif 84*8b26181fSAndroid Build Coastguard Worker 85*8b26181fSAndroid Build Coastguard Worker #ifdef _MSC_VER 86*8b26181fSAndroid Build Coastguard Worker /* 87*8b26181fSAndroid Build Coastguard Worker * If <crtdbg.h> has been included, and _DEBUG is defined, and 88*8b26181fSAndroid Build Coastguard Worker * __STDC__ is zero, <crtdbg.h> will define strdup() to call 89*8b26181fSAndroid Build Coastguard Worker * _strdup_dbg(). So if it's already defined, don't redefine 90*8b26181fSAndroid Build Coastguard Worker * it. 91*8b26181fSAndroid Build Coastguard Worker */ 92*8b26181fSAndroid Build Coastguard Worker #ifndef strdup 93*8b26181fSAndroid Build Coastguard Worker #define strdup _strdup 94*8b26181fSAndroid Build Coastguard Worker #endif 95*8b26181fSAndroid Build Coastguard Worker #endif 96*8b26181fSAndroid Build Coastguard Worker 97*8b26181fSAndroid Build Coastguard Worker /* 98*8b26181fSAndroid Build Coastguard Worker * We want asprintf(), for some cases where we use it to construct 99*8b26181fSAndroid Build Coastguard Worker * dynamically-allocated variable-length strings; it's present on 100*8b26181fSAndroid Build Coastguard Worker * some, but not all, platforms. 101*8b26181fSAndroid Build Coastguard Worker */ 102*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_ASPRINTF 103*8b26181fSAndroid Build Coastguard Worker #define pcap_asprintf asprintf 104*8b26181fSAndroid Build Coastguard Worker #else 105*8b26181fSAndroid Build Coastguard Worker extern int pcap_asprintf(char **, PCAP_FORMAT_STRING(const char *), ...) 106*8b26181fSAndroid Build Coastguard Worker PCAP_PRINTFLIKE(2, 3); 107*8b26181fSAndroid Build Coastguard Worker #endif 108*8b26181fSAndroid Build Coastguard Worker 109*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_VASPRINTF 110*8b26181fSAndroid Build Coastguard Worker #define pcap_vasprintf vasprintf 111*8b26181fSAndroid Build Coastguard Worker #else 112*8b26181fSAndroid Build Coastguard Worker extern int pcap_vasprintf(char **, const char *, va_list ap); 113*8b26181fSAndroid Build Coastguard Worker #endif 114*8b26181fSAndroid Build Coastguard Worker 115*8b26181fSAndroid Build Coastguard Worker /* For Solaris before 11. */ 116*8b26181fSAndroid Build Coastguard Worker #ifndef timeradd 117*8b26181fSAndroid Build Coastguard Worker #define timeradd(a, b, result) \ 118*8b26181fSAndroid Build Coastguard Worker do { \ 119*8b26181fSAndroid Build Coastguard Worker (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ 120*8b26181fSAndroid Build Coastguard Worker (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ 121*8b26181fSAndroid Build Coastguard Worker if ((result)->tv_usec >= 1000000) { \ 122*8b26181fSAndroid Build Coastguard Worker ++(result)->tv_sec; \ 123*8b26181fSAndroid Build Coastguard Worker (result)->tv_usec -= 1000000; \ 124*8b26181fSAndroid Build Coastguard Worker } \ 125*8b26181fSAndroid Build Coastguard Worker } while (0) 126*8b26181fSAndroid Build Coastguard Worker #endif /* timeradd */ 127*8b26181fSAndroid Build Coastguard Worker #ifndef timersub 128*8b26181fSAndroid Build Coastguard Worker #define timersub(a, b, result) \ 129*8b26181fSAndroid Build Coastguard Worker do { \ 130*8b26181fSAndroid Build Coastguard Worker (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ 131*8b26181fSAndroid Build Coastguard Worker (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ 132*8b26181fSAndroid Build Coastguard Worker if ((result)->tv_usec < 0) { \ 133*8b26181fSAndroid Build Coastguard Worker --(result)->tv_sec; \ 134*8b26181fSAndroid Build Coastguard Worker (result)->tv_usec += 1000000; \ 135*8b26181fSAndroid Build Coastguard Worker } \ 136*8b26181fSAndroid Build Coastguard Worker } while (0) 137*8b26181fSAndroid Build Coastguard Worker #endif /* timersub */ 138*8b26181fSAndroid Build Coastguard Worker 139*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_STRTOK_R 140*8b26181fSAndroid Build Coastguard Worker #define pcap_strtok_r strtok_r 141*8b26181fSAndroid Build Coastguard Worker #else 142*8b26181fSAndroid Build Coastguard Worker #ifdef _WIN32 143*8b26181fSAndroid Build Coastguard Worker /* 144*8b26181fSAndroid Build Coastguard Worker * Microsoft gives it a different name. 145*8b26181fSAndroid Build Coastguard Worker */ 146*8b26181fSAndroid Build Coastguard Worker #define pcap_strtok_r strtok_s 147*8b26181fSAndroid Build Coastguard Worker #else 148*8b26181fSAndroid Build Coastguard Worker /* 149*8b26181fSAndroid Build Coastguard Worker * Define it ourselves. 150*8b26181fSAndroid Build Coastguard Worker */ 151*8b26181fSAndroid Build Coastguard Worker extern char *pcap_strtok_r(char *, const char *, char **); 152*8b26181fSAndroid Build Coastguard Worker #endif 153*8b26181fSAndroid Build Coastguard Worker #endif /* HAVE_STRTOK_R */ 154*8b26181fSAndroid Build Coastguard Worker 155*8b26181fSAndroid Build Coastguard Worker #ifdef _WIN32 156*8b26181fSAndroid Build Coastguard Worker #if !defined(__cplusplus) 157*8b26181fSAndroid Build Coastguard Worker #define inline __inline 158*8b26181fSAndroid Build Coastguard Worker #endif 159*8b26181fSAndroid Build Coastguard Worker #endif /* _WIN32 */ 160*8b26181fSAndroid Build Coastguard Worker 161*8b26181fSAndroid Build Coastguard Worker #ifdef __cplusplus 162*8b26181fSAndroid Build Coastguard Worker } 163*8b26181fSAndroid Build Coastguard Worker #endif 164*8b26181fSAndroid Build Coastguard Worker 165*8b26181fSAndroid Build Coastguard Worker #endif 166