1/*- 2 * Copyright (c) 2003-2007 Tim Kientzle 3 * 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 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26/* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ 27 28/* 29 * This header is the first thing included in any of the libarchive 30 * source files. As far as possible, platform-specific issues should 31 * be dealt with here and not within individual source files. I'm 32 * actively trying to minimize #if blocks within the main source, 33 * since they obfuscate the code. 34 */ 35 36#ifndef ARCHIVE_PLATFORM_H_INCLUDED 37#define ARCHIVE_PLATFORM_H_INCLUDED 38 39/* archive.h and archive_entry.h require this. */ 40#define __LIBARCHIVE_BUILD 1 41 42#if defined(PLATFORM_CONFIG_H) 43/* Use hand-built config.h in environments that need it. */ 44#include PLATFORM_CONFIG_H 45#elif defined(HAVE_CONFIG_H) 46/* Most POSIX platforms use the 'configure' script to build config.h */ 47#include "config.h" 48#else 49/* Warn if the library hasn't been (automatically or manually) configured. */ 50#error Oops: No config.h and no pre-built configuration in archive_platform.h. 51#endif 52 53/* On macOS check for some symbols based on the deployment target version. */ 54#if defined(__APPLE__) 55# undef HAVE_FUTIMENS 56# undef HAVE_UTIMENSAT 57# include <AvailabilityMacros.h> 58# if MAC_OS_X_VERSION_MIN_REQUIRED >= 101300 59# define HAVE_FUTIMENS 1 60# define HAVE_UTIMENSAT 1 61# endif 62#endif 63 64/* It should be possible to get rid of this by extending the feature-test 65 * macros to cover Windows API functions, probably along with non-trivial 66 * refactoring of code to find structures that sit more cleanly on top of 67 * either Windows or Posix APIs. */ 68#if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) 69#include "archive_windows.h" 70/* The C library on Windows specifies a calling convention for callback 71 * functions and exports; when we interact with them (capture pointers, 72 * call and pass function pointers) we need to match their calling 73 * convention. 74 * This only matters when libarchive is built with /Gr, /Gz or /Gv 75 * (which change the default calling convention.) */ 76#define __LA_LIBC_CC __cdecl 77#else 78#define la_stat(path,stref) stat(path,stref) 79#define __LA_LIBC_CC 80#endif 81 82/* 83 * The config files define a lot of feature macros. The following 84 * uses those macros to select/define replacements and include key 85 * headers as required. 86 */ 87 88/* Try to get standard C99-style integer type definitions. */ 89#if HAVE_INTTYPES_H 90#include <inttypes.h> 91#endif 92#if HAVE_STDINT_H 93#include <stdint.h> 94#endif 95 96/* Borland warns about its own constants! */ 97#if defined(__BORLANDC__) 98# if HAVE_DECL_UINT64_MAX 99# undef UINT64_MAX 100# undef HAVE_DECL_UINT64_MAX 101# endif 102# if HAVE_DECL_UINT64_MIN 103# undef UINT64_MIN 104# undef HAVE_DECL_UINT64_MIN 105# endif 106# if HAVE_DECL_INT64_MAX 107# undef INT64_MAX 108# undef HAVE_DECL_INT64_MAX 109# endif 110# if HAVE_DECL_INT64_MIN 111# undef INT64_MIN 112# undef HAVE_DECL_INT64_MIN 113# endif 114#endif 115 116/* Some platforms lack the standard *_MAX definitions. */ 117#if !HAVE_DECL_SIZE_MAX 118#define SIZE_MAX (~(size_t)0) 119#endif 120#if !HAVE_DECL_SSIZE_MAX 121#define SSIZE_MAX ((ssize_t)(SIZE_MAX >> 1)) 122#endif 123#if !HAVE_DECL_UINT32_MAX 124#define UINT32_MAX (~(uint32_t)0) 125#endif 126#if !HAVE_DECL_INT32_MAX 127#define INT32_MAX ((int32_t)(UINT32_MAX >> 1)) 128#endif 129#if !HAVE_DECL_INT32_MIN 130#define INT32_MIN ((int32_t)(~INT32_MAX)) 131#endif 132#if !HAVE_DECL_UINT64_MAX 133#define UINT64_MAX (~(uint64_t)0) 134#endif 135#if !HAVE_DECL_INT64_MAX 136#define INT64_MAX ((int64_t)(UINT64_MAX >> 1)) 137#endif 138#if !HAVE_DECL_INT64_MIN 139#define INT64_MIN ((int64_t)(~INT64_MAX)) 140#endif 141#if !HAVE_DECL_UINTMAX_MAX 142#define UINTMAX_MAX (~(uintmax_t)0) 143#endif 144#if !HAVE_DECL_INTMAX_MAX 145#define INTMAX_MAX ((intmax_t)(UINTMAX_MAX >> 1)) 146#endif 147#if !HAVE_DECL_INTMAX_MIN 148#define INTMAX_MIN ((intmax_t)(~INTMAX_MAX)) 149#endif 150 151/* Some platforms lack the standard PRIxN/PRIdN definitions. */ 152#if !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32) 153#ifndef PRIx32 154#if SIZEOF_INT == 4 155#define PRIx32 "x" 156#elif SIZEOF_LONG == 4 157#define PRIx32 "lx" 158#else 159#error No suitable 32-bit unsigned integer type found for this platform 160#endif 161#endif // PRIx32 162#ifndef PRId32 163#if SIZEOF_INT == 4 164#define PRId32 "d" 165#elif SIZEOF_LONG == 4 166#define PRId32 "ld" 167#else 168#error No suitable 32-bit signed integer type found for this platform 169#endif 170#endif // PRId32 171#endif // !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32) 172 173/* 174 * If we can't restore metadata using a file descriptor, then 175 * for compatibility's sake, close files before trying to restore metadata. 176 */ 177#if defined(HAVE_FCHMOD) || defined(HAVE_FUTIMES) || defined(HAVE_ACL_SET_FD) || defined(HAVE_ACL_SET_FD_NP) || defined(HAVE_FCHOWN) 178#define CAN_RESTORE_METADATA_FD 179#endif 180 181/* 182 * glibc 2.24 deprecates readdir_r 183 * bionic c deprecates readdir_r too 184 */ 185#if defined(HAVE_READDIR_R) && (!defined(__GLIBC__) || !defined(__GLIBC_MINOR__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24)) && (!defined(__ANDROID__)) 186#define USE_READDIR_R 1 187#else 188#undef USE_READDIR_R 189#endif 190 191/* Set up defaults for internal error codes. */ 192#ifndef ARCHIVE_ERRNO_FILE_FORMAT 193#if HAVE_EFTYPE 194#define ARCHIVE_ERRNO_FILE_FORMAT EFTYPE 195#else 196#if HAVE_EILSEQ 197#define ARCHIVE_ERRNO_FILE_FORMAT EILSEQ 198#else 199#define ARCHIVE_ERRNO_FILE_FORMAT EINVAL 200#endif 201#endif 202#endif 203 204#ifndef ARCHIVE_ERRNO_PROGRAMMER 205#define ARCHIVE_ERRNO_PROGRAMMER EINVAL 206#endif 207 208#ifndef ARCHIVE_ERRNO_MISC 209#define ARCHIVE_ERRNO_MISC (-1) 210#endif 211 212#if defined(__GNUC__) && (__GNUC__ >= 7) 213#define __LA_FALLTHROUGH __attribute__((fallthrough)) 214#else 215#define __LA_FALLTHROUGH 216#endif 217 218#endif /* !ARCHIVE_PLATFORM_H_INCLUDED */ 219