197a9217aSAntonio Huete Jimenez /* 297a9217aSAntonio Huete Jimenez * Copyright (c) 1994, 1995, 1996 397a9217aSAntonio Huete Jimenez * The Regents of the University of California. All rights reserved. 497a9217aSAntonio Huete Jimenez * 597a9217aSAntonio Huete Jimenez * Redistribution and use in source and binary forms, with or without 697a9217aSAntonio Huete Jimenez * modification, are permitted provided that the following conditions 797a9217aSAntonio Huete Jimenez * are met: 897a9217aSAntonio Huete Jimenez * 1. Redistributions of source code must retain the above copyright 997a9217aSAntonio Huete Jimenez * notice, this list of conditions and the following disclaimer. 1097a9217aSAntonio Huete Jimenez * 2. Redistributions in binary form must reproduce the above copyright 1197a9217aSAntonio Huete Jimenez * notice, this list of conditions and the following disclaimer in the 1297a9217aSAntonio Huete Jimenez * documentation and/or other materials provided with the distribution. 1397a9217aSAntonio Huete Jimenez * 3. All advertising materials mentioning features or use of this software 1497a9217aSAntonio Huete Jimenez * must display the following acknowledgement: 1597a9217aSAntonio Huete Jimenez * This product includes software developed by the Computer Systems 1697a9217aSAntonio Huete Jimenez * Engineering Group at Lawrence Berkeley Laboratory. 1797a9217aSAntonio Huete Jimenez * 4. Neither the name of the University nor of the Laboratory may be used 1897a9217aSAntonio Huete Jimenez * to endorse or promote products derived from this software without 1997a9217aSAntonio Huete Jimenez * specific prior written permission. 2097a9217aSAntonio Huete Jimenez * 2197a9217aSAntonio Huete Jimenez * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2297a9217aSAntonio Huete Jimenez * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2397a9217aSAntonio Huete Jimenez * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2497a9217aSAntonio Huete Jimenez * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2597a9217aSAntonio Huete Jimenez * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2697a9217aSAntonio Huete Jimenez * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2797a9217aSAntonio Huete Jimenez * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2897a9217aSAntonio Huete Jimenez * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2997a9217aSAntonio Huete Jimenez * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3097a9217aSAntonio Huete Jimenez * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3197a9217aSAntonio Huete Jimenez * SUCH DAMAGE. 3297a9217aSAntonio Huete Jimenez */ 3397a9217aSAntonio Huete Jimenez 3497a9217aSAntonio Huete Jimenez #ifndef portability_h 3597a9217aSAntonio Huete Jimenez #define portability_h 3697a9217aSAntonio Huete Jimenez 3797a9217aSAntonio Huete Jimenez /* 3897a9217aSAntonio Huete Jimenez * Helpers for portability between Windows and UN*X and between different 3997a9217aSAntonio Huete Jimenez * flavors of UN*X. 4097a9217aSAntonio Huete Jimenez */ 413a289941SAaron LI #include <stdarg.h> /* we declare varargs functions on some platforms */ 423a289941SAaron LI 43*3f75611eSAntonio Huete Jimenez /* Take the OS definitions early for timeradd and others so that the guards 44*3f75611eSAntonio Huete Jimenez * below have an effect. 45*3f75611eSAntonio Huete Jimenez */ 46*3f75611eSAntonio Huete Jimenez #ifndef _WIN32 47*3f75611eSAntonio Huete Jimenez #include <sys/time.h> 48*3f75611eSAntonio Huete Jimenez #endif 49*3f75611eSAntonio Huete Jimenez 503a289941SAaron LI #include "pcap/funcattrs.h" 5197a9217aSAntonio Huete Jimenez 5297a9217aSAntonio Huete Jimenez #ifdef __cplusplus 5397a9217aSAntonio Huete Jimenez extern "C" { 5497a9217aSAntonio Huete Jimenez #endif 5597a9217aSAntonio Huete Jimenez 563a289941SAaron LI #ifdef HAVE_STRLCAT 573a289941SAaron LI #define pcap_strlcat strlcat 583a289941SAaron LI #else 593a289941SAaron LI #if defined(_MSC_VER) || defined(__MINGW32__) 6097a9217aSAntonio Huete Jimenez /* 613a289941SAaron LI * strncat_s() is supported at least back to Visual 62ea16f64eSAntonio Huete Jimenez * Studio 2005; we require Visual Studio 2015 or later. 6397a9217aSAntonio Huete Jimenez */ 643a289941SAaron LI #define pcap_strlcat(x, y, z) \ 653a289941SAaron LI strncat_s((x), (z), (y), _TRUNCATE) 663a289941SAaron LI #else 673a289941SAaron LI /* 683a289941SAaron LI * Define it ourselves. 693a289941SAaron LI */ 703a289941SAaron LI extern size_t pcap_strlcat(char * restrict dst, const char * restrict src, size_t dstsize); 713a289941SAaron LI #endif 723a289941SAaron LI #endif 733a289941SAaron LI 743a289941SAaron LI #ifdef HAVE_STRLCPY 753a289941SAaron LI #define pcap_strlcpy strlcpy 763a289941SAaron LI #else 773a289941SAaron LI #if defined(_MSC_VER) || defined(__MINGW32__) 7897a9217aSAntonio Huete Jimenez /* 7997a9217aSAntonio Huete Jimenez * strncpy_s() is supported at least back to Visual 80ea16f64eSAntonio Huete Jimenez * Studio 2005; we require Visual Studio 2015 or later. 8197a9217aSAntonio Huete Jimenez */ 823a289941SAaron LI #define pcap_strlcpy(x, y, z) \ 8397a9217aSAntonio Huete Jimenez strncpy_s((x), (z), (y), _TRUNCATE) 8497a9217aSAntonio Huete Jimenez #else 8597a9217aSAntonio Huete Jimenez /* 863a289941SAaron LI * Define it ourselves. 8797a9217aSAntonio Huete Jimenez */ 883a289941SAaron LI extern size_t pcap_strlcpy(char * restrict dst, const char * restrict src, size_t dstsize); 8997a9217aSAntonio Huete Jimenez #endif 9097a9217aSAntonio Huete Jimenez #endif 9197a9217aSAntonio Huete Jimenez 9297a9217aSAntonio Huete Jimenez #ifdef _MSC_VER 933a289941SAaron LI /* 943a289941SAaron LI * If <crtdbg.h> has been included, and _DEBUG is defined, and 953a289941SAaron LI * __STDC__ is zero, <crtdbg.h> will define strdup() to call 963a289941SAaron LI * _strdup_dbg(). So if it's already defined, don't redefine 973a289941SAaron LI * it. 983a289941SAaron LI */ 993a289941SAaron LI #ifndef strdup 10097a9217aSAntonio Huete Jimenez #define strdup _strdup 10197a9217aSAntonio Huete Jimenez #endif 10297a9217aSAntonio Huete Jimenez #endif 10397a9217aSAntonio Huete Jimenez 10497a9217aSAntonio Huete Jimenez /* 105ea16f64eSAntonio Huete Jimenez * We want asprintf(), for some cases where we use it to construct 106ea16f64eSAntonio Huete Jimenez * dynamically-allocated variable-length strings; it's present on 107ea16f64eSAntonio Huete Jimenez * some, but not all, platforms. 1083a289941SAaron LI */ 1093a289941SAaron LI #ifdef HAVE_ASPRINTF 1103a289941SAaron LI #define pcap_asprintf asprintf 1113a289941SAaron LI #else 1123a289941SAaron LI extern int pcap_asprintf(char **, PCAP_FORMAT_STRING(const char *), ...) 1133a289941SAaron LI PCAP_PRINTFLIKE(2, 3); 1143a289941SAaron LI #endif 1153a289941SAaron LI 1163a289941SAaron LI #ifdef HAVE_VASPRINTF 1173a289941SAaron LI #define pcap_vasprintf vasprintf 1183a289941SAaron LI #else 1193a289941SAaron LI extern int pcap_vasprintf(char **, const char *, va_list ap); 1203a289941SAaron LI #endif 1213a289941SAaron LI 122ea16f64eSAntonio Huete Jimenez /* For Solaris before 11. */ 123ea16f64eSAntonio Huete Jimenez #ifndef timeradd 124ea16f64eSAntonio Huete Jimenez #define timeradd(a, b, result) \ 125ea16f64eSAntonio Huete Jimenez do { \ 126ea16f64eSAntonio Huete Jimenez (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ 127ea16f64eSAntonio Huete Jimenez (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ 128ea16f64eSAntonio Huete Jimenez if ((result)->tv_usec >= 1000000) { \ 129ea16f64eSAntonio Huete Jimenez ++(result)->tv_sec; \ 130ea16f64eSAntonio Huete Jimenez (result)->tv_usec -= 1000000; \ 131ea16f64eSAntonio Huete Jimenez } \ 132ea16f64eSAntonio Huete Jimenez } while (0) 133ea16f64eSAntonio Huete Jimenez #endif /* timeradd */ 134ea16f64eSAntonio Huete Jimenez #ifndef timersub 135ea16f64eSAntonio Huete Jimenez #define timersub(a, b, result) \ 136ea16f64eSAntonio Huete Jimenez do { \ 137ea16f64eSAntonio Huete Jimenez (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ 138ea16f64eSAntonio Huete Jimenez (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ 139ea16f64eSAntonio Huete Jimenez if ((result)->tv_usec < 0) { \ 140ea16f64eSAntonio Huete Jimenez --(result)->tv_sec; \ 141ea16f64eSAntonio Huete Jimenez (result)->tv_usec += 1000000; \ 142ea16f64eSAntonio Huete Jimenez } \ 143ea16f64eSAntonio Huete Jimenez } while (0) 144ea16f64eSAntonio Huete Jimenez #endif /* timersub */ 145ea16f64eSAntonio Huete Jimenez 14697a9217aSAntonio Huete Jimenez #ifdef HAVE_STRTOK_R 14797a9217aSAntonio Huete Jimenez #define pcap_strtok_r strtok_r 14897a9217aSAntonio Huete Jimenez #else 1493a289941SAaron LI #ifdef _WIN32 15097a9217aSAntonio Huete Jimenez /* 15197a9217aSAntonio Huete Jimenez * Microsoft gives it a different name. 15297a9217aSAntonio Huete Jimenez */ 15397a9217aSAntonio Huete Jimenez #define pcap_strtok_r strtok_s 15497a9217aSAntonio Huete Jimenez #else 15597a9217aSAntonio Huete Jimenez /* 15697a9217aSAntonio Huete Jimenez * Define it ourselves. 15797a9217aSAntonio Huete Jimenez */ 1583a289941SAaron LI extern char *pcap_strtok_r(char *, const char *, char **); 15997a9217aSAntonio Huete Jimenez #endif 16097a9217aSAntonio Huete Jimenez #endif /* HAVE_STRTOK_R */ 16197a9217aSAntonio Huete Jimenez 16297a9217aSAntonio Huete Jimenez #ifdef _WIN32 16397a9217aSAntonio Huete Jimenez #if !defined(__cplusplus) 16497a9217aSAntonio Huete Jimenez #define inline __inline 16597a9217aSAntonio Huete Jimenez #endif 16697a9217aSAntonio Huete Jimenez #endif /* _WIN32 */ 16797a9217aSAntonio Huete Jimenez 16897a9217aSAntonio Huete Jimenez #ifdef __cplusplus 16997a9217aSAntonio Huete Jimenez } 17097a9217aSAntonio Huete Jimenez #endif 17197a9217aSAntonio Huete Jimenez 17297a9217aSAntonio Huete Jimenez #endif 173