1 /* 2 * Copyright (c) 1994, 1995, 1996 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the Computer Systems 16 * Engineering Group at Lawrence Berkeley Laboratory. 17 * 4. Neither the name of the University nor of the Laboratory may be used 18 * to endorse or promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #ifndef portability_h 35 #define portability_h 36 37 /* 38 * Helpers for portability between Windows and UN*X and between different 39 * flavors of UN*X. 40 */ 41 42 #include "pcap/funcattrs.h" 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 #ifndef HAVE_STRLCPY 49 /* 50 * Macro that does the same thing as strlcpy(). 51 */ 52 #if defined(_MSC_VER) || defined(__MINGW32__) 53 /* 54 * strncpy_s() is supported at least back to Visual 55 * Studio 2005. 56 */ 57 #define strlcpy(x, y, z) \ 58 strncpy_s((x), (z), (y), _TRUNCATE) 59 60 #else 61 #define strlcpy(x, y, z) \ 62 (strncpy((x), (y), (z)), \ 63 ((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \ 64 (void) strlen((y))) 65 #endif 66 #endif 67 68 #ifndef HAVE_STRLCAT 69 /* 70 * Macro that does the same thing as strlcat(). 71 */ 72 #if defined(_MSC_VER) || defined(__MINGW32__) 73 /* 74 * strncat_s() is supported at least back to Visual 75 * Studio 2005. 76 */ 77 #define strlcat(x, y, z) \ 78 strncat_s((x), (z), (y), _TRUNCATE) 79 #else 80 /* 81 * ANSI C says strncat() always null-terminates its first argument, 82 * so 1) we don't need to explicitly null-terminate the string 83 * ourselves and 2) we need to leave room for the null terminator. 84 */ 85 #define strlcat(x, y, z) \ 86 strncat((x), (y), (z) - strlen((x)) - 1) 87 #endif 88 #endif 89 90 #ifdef _MSC_VER 91 /* 92 * If <crtdbg.h> has been included, and _DEBUG is defined, and 93 * __STDC__ is zero, <crtdbg.h> will define strdup() to call 94 * _strdup_dbg(). So if it's already defined, don't redefine 95 * it. 96 */ 97 #ifndef strdup 98 #define strdup _strdup 99 #endif 100 #endif 101 102 /* 103 * On Windows, snprintf(), with that name and with C99 behavior - i.e., 104 * guaranteeing that the formatted string is null-terminated - didn't 105 * appear until Visual Studio 2015. Prior to that, the C runtime had 106 * only _snprintf(), which *doesn't* guarantee that the string is 107 * null-terminated if it is truncated due to the buffer being too 108 * small. We therefore can't just define snprintf to be _snprintf 109 * and define vsnprintf to be _vsnprintf, as we're relying on null- 110 * termination of strings in all cases. 111 * 112 * We also want to allow this to be built with versions of Visual Studio 113 * prior to VS 2015, so we can't rely on snprintf() being present. 114 * 115 * And we want to make sure that, if we support plugins in the future, 116 * a routine with C99 snprintf() behavior will be available to them. 117 * We also don't want it to collide with the C library snprintf() if 118 * there is one. 119 * 120 * So we make pcap_snprintf() and pcap_vsnprintf() available, either by 121 * #defining them to be snprintf or vsnprintf, respectively, or by 122 * defining our own versions and exporting them. 123 */ 124 #ifdef HAVE_SNPRINTF 125 #define pcap_snprintf snprintf 126 #else 127 extern int pcap_snprintf(char *, size_t, PCAP_FORMAT_STRING(const char *), ...) 128 PCAP_PRINTFLIKE(3, 4); 129 #endif 130 131 #ifdef HAVE_VSNPRINTF 132 #define pcap_vsnprintf vsnprintf 133 #else 134 extern int pcap_vsnprintf(char *, size_t, const char *, va_list ap); 135 #endif 136 137 #ifdef HAVE_STRTOK_R 138 #define pcap_strtok_r strtok_r 139 #else 140 #ifdef _WIN32 141 /* 142 * Microsoft gives it a different name. 143 */ 144 #define pcap_strtok_r strtok_s 145 #else 146 /* 147 * Define it ourselves. 148 */ 149 #define NEED_STRTOK_R 150 extern char *pcap_strtok_r(char *, const char *, char **); 151 #endif 152 #endif /* HAVE_STRTOK_R */ 153 154 #ifdef _WIN32 155 #if !defined(__cplusplus) 156 #define inline __inline 157 #endif 158 #endif /* _WIN32 */ 159 160 #ifdef __cplusplus 161 } 162 #endif 163 164 #endif 165