Home | History | Annotate | Download | only in libpcap
      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