xref: /freebsd/contrib/libpcap/portability.h (revision 4928135658a9d0eaee37003df6137ab363fcb0b4)
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 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 #ifndef HAVE_STRLCPY
47  /*
48   * Macro that does the same thing as strlcpy().
49   */
50  #ifdef _MSC_VER
51   /*
52    * strncpy_s() is supported at least back to Visual
53    * Studio 2005.
54    */
55   #define strlcpy(x, y, z) \
56 	strncpy_s((x), (z), (y), _TRUNCATE)
57 
58  #else
59   #define strlcpy(x, y, z) \
60 	(strncpy((x), (y), (z)), \
61 	 ((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \
62 	 (void) strlen((y)))
63  #endif
64 #endif
65 
66 /*
67  * For flagging arguments as format strings in MSVC.
68  */
69 #if _MSC_VER >= 1400
70  #include <sal.h>
71  #if _MSC_VER > 1400
72   #define FORMAT_STRING(p) _Printf_format_string_ p
73  #else
74   #define FORMAT_STRING(p) __format_string p
75  #endif
76 #else
77  #define FORMAT_STRING(p) p
78 #endif
79 
80 #ifdef _MSC_VER
81   #define strdup	_strdup
82   #define sscanf	sscanf_s
83   #define setbuf(x, y) \
84 	setvbuf((x), (y), _IONBF, 0)
85   #define fopen(x, y) \
86 	fopen_safe((x), (y))
87   FILE *fopen_safe(const char *filename, const char* mode);
88 #endif
89 
90 #if defined(_MSC_VER) || defined(__MINGW32__)
91   #define strlcat(x, y, z) \
92 	strncat_s((x), (z), (y), _TRUNCATE)
93 #endif
94 
95 #ifdef _MSC_VER
96   /*
97    * MSVC.
98    */
99   #if _MSC_VER >= 1900
100     /*
101      * VS 2015 or newer; we have snprintf() function.
102      */
103     #define HAVE_SNPRINTF
104   #endif
105 #endif
106 
107 /*
108  * On Windows, snprintf(), with that name and with C99 behavior - i.e.,
109  * guaranteeing that the formatted string is null-terminated - didn't
110  * appear until Visual Studio 2015.  Prior to that, the C runtime had
111  * only _snprintf(), which *doesn't* guarantee that the string is
112  * null-terminated if it is truncated due to the buffer being too
113  * small.  We therefore can't just define snprintf to be _snprintf
114  * and define vsnprintf to be _vsnprintf, as we're relying on null-
115  * termination of strings in all cases.
116  *
117  * We also want to allow this to be built with versions of Visual Studio
118  * prior to VS 2015, so we can't rely on snprintf() being present.
119  *
120  * And we want to make sure that, if we support plugins in the future,
121  * a routine with C99 snprintf() behavior will be available to them.
122  * We also don't want it to collide with the C library snprintf() if
123  * there is one.
124  *
125  * So we make pcap_snprintf() and pcap_vsnprintf() available, either by
126  * #defining them to be snprintf or vsnprintf, respectively, or by
127  * defining our own versions and exporting them.
128  */
129 #ifdef HAVE_SNPRINTF
130 #define pcap_snprintf snprintf
131 #else
132 extern int pcap_snprintf(char *, size_t, FORMAT_STRING(const char *), ...)
133 #ifdef __ATTRIBUTE___FORMAT_OK
134     __attribute__((format (printf, 3, 4)))
135 #endif /* __ATTRIBUTE___FORMAT_OK */
136     ;
137 #endif
138 
139 #ifdef HAVE_VSNPRINTF
140 #define pcap_vsnprintf vsnprintf
141 #else
142 extern int pcap_vsnprintf(char *, size_t, const char *, va_list ap);
143 #endif
144 
145 #ifdef HAVE_STRTOK_R
146   #define pcap_strtok_r	strtok_r
147 #else
148   #ifdef _MSC_VER
149     /*
150      * Microsoft gives it a different name.
151      */
152     #define pcap_strtok_r	strtok_s
153   #else
154     /*
155      * Define it ourselves.
156      */
157     #define NEED_STRTOK_R
158     extern int pcap_strtok_r(char *, const char *, char **);
159   #endif
160 #endif /* HAVE_STRTOK_R */
161 
162 #ifdef _WIN32
163   /*
164    * These may be defined by <inttypes.h>.
165    *
166    * XXX - for MSVC, we always want the _MSC_EXTENSIONS versions.
167    * What about other compilers?  If, as the MinGW Web site says MinGW
168    * does, the other compilers just use Microsoft's run-time library,
169    * then they should probably use the _MSC_EXTENSIONS even if the
170    * compiler doesn't define _MSC_EXTENSIONS.
171    *
172    * XXX - we currently aren't using any of these, but this allows
173    * their use in the future.
174    */
175   #ifndef PRId64
176     #ifdef _MSC_EXTENSIONS
177       #define PRId64	"I64d"
178     #else
179       #define PRId64	"lld"
180     #endif
181   #endif /* PRId64 */
182 
183   #ifndef PRIo64
184     #ifdef _MSC_EXTENSIONS
185       #define PRIo64	"I64o"
186     #else
187       #define PRIo64	"llo"
188     #endif
189   #endif /* PRIo64 */
190 
191   #ifndef PRIx64
192     #ifdef _MSC_EXTENSIONS
193       #define PRIx64	"I64x"
194     #else
195       #define PRIx64	"llx"
196     #endif
197   #endif
198 
199   #ifndef PRIu64
200     #ifdef _MSC_EXTENSIONS
201       #define PRIu64	"I64u"
202     #else
203       #define PRIu64	"llu"
204     #endif
205   #endif
206 
207   #if !defined(__cplusplus)
208     #define inline __inline
209   #endif
210 #endif /* _WIN32 */
211 
212 #ifdef __cplusplus
213 }
214 #endif
215 
216 #endif
217