xref: /dflybsd-src/contrib/libpcap/portability.h (revision 3f75611e55cda2794a40d4231ecca0f75812a7dd)
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