1caf54c4fSMartin Matuska /*- 2caf54c4fSMartin Matuska * Copyright (c) 2003-2007 Tim Kientzle 3caf54c4fSMartin Matuska * All rights reserved. 4caf54c4fSMartin Matuska * 5caf54c4fSMartin Matuska * Redistribution and use in source and binary forms, with or without 6caf54c4fSMartin Matuska * modification, are permitted provided that the following conditions 7caf54c4fSMartin Matuska * are met: 8caf54c4fSMartin Matuska * 1. Redistributions of source code must retain the above copyright 9caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer. 10caf54c4fSMartin Matuska * 2. Redistributions in binary form must reproduce the above copyright 11caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer in the 12caf54c4fSMartin Matuska * documentation and/or other materials provided with the distribution. 13caf54c4fSMartin Matuska * 14caf54c4fSMartin Matuska * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15caf54c4fSMartin Matuska * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16caf54c4fSMartin Matuska * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17caf54c4fSMartin Matuska * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18caf54c4fSMartin Matuska * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19caf54c4fSMartin Matuska * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20caf54c4fSMartin Matuska * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21caf54c4fSMartin Matuska * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22caf54c4fSMartin Matuska * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23caf54c4fSMartin Matuska * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24caf54c4fSMartin Matuska */ 25caf54c4fSMartin Matuska 26caf54c4fSMartin Matuska /* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ 27caf54c4fSMartin Matuska 28caf54c4fSMartin Matuska /* 29caf54c4fSMartin Matuska * This header is the first thing included in any of the libarchive 30caf54c4fSMartin Matuska * source files. As far as possible, platform-specific issues should 31caf54c4fSMartin Matuska * be dealt with here and not within individual source files. I'm 32caf54c4fSMartin Matuska * actively trying to minimize #if blocks within the main source, 33caf54c4fSMartin Matuska * since they obfuscate the code. 34caf54c4fSMartin Matuska */ 35caf54c4fSMartin Matuska 36caf54c4fSMartin Matuska #ifndef ARCHIVE_PLATFORM_H_INCLUDED 37caf54c4fSMartin Matuska #define ARCHIVE_PLATFORM_H_INCLUDED 38caf54c4fSMartin Matuska 39caf54c4fSMartin Matuska /* archive.h and archive_entry.h require this. */ 40caf54c4fSMartin Matuska #define __LIBARCHIVE_BUILD 1 41caf54c4fSMartin Matuska 42caf54c4fSMartin Matuska #if defined(PLATFORM_CONFIG_H) 43caf54c4fSMartin Matuska /* Use hand-built config.h in environments that need it. */ 44caf54c4fSMartin Matuska #include PLATFORM_CONFIG_H 45caf54c4fSMartin Matuska #elif defined(HAVE_CONFIG_H) 46caf54c4fSMartin Matuska /* Most POSIX platforms use the 'configure' script to build config.h */ 47caf54c4fSMartin Matuska #include "config.h" 48caf54c4fSMartin Matuska #else 49caf54c4fSMartin Matuska /* Warn if the library hasn't been (automatically or manually) configured. */ 50caf54c4fSMartin Matuska #error Oops: No config.h and no pre-built configuration in archive_platform.h. 51caf54c4fSMartin Matuska #endif 52caf54c4fSMartin Matuska 535c831a5bSMartin Matuska /* On macOS check for some symbols based on the deployment target version. */ 545c831a5bSMartin Matuska #if defined(__APPLE__) 555c831a5bSMartin Matuska # undef HAVE_FUTIMENS 565c831a5bSMartin Matuska # undef HAVE_UTIMENSAT 575c831a5bSMartin Matuska # include <AvailabilityMacros.h> 585c831a5bSMartin Matuska # if MAC_OS_X_VERSION_MIN_REQUIRED >= 101300 595c831a5bSMartin Matuska # define HAVE_FUTIMENS 1 605c831a5bSMartin Matuska # define HAVE_UTIMENSAT 1 615c831a5bSMartin Matuska # endif 625c831a5bSMartin Matuska #endif 635c831a5bSMartin Matuska 64caf54c4fSMartin Matuska /* It should be possible to get rid of this by extending the feature-test 65caf54c4fSMartin Matuska * macros to cover Windows API functions, probably along with non-trivial 66caf54c4fSMartin Matuska * refactoring of code to find structures that sit more cleanly on top of 67caf54c4fSMartin Matuska * either Windows or Posix APIs. */ 68caf54c4fSMartin Matuska #if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) 69caf54c4fSMartin Matuska #include "archive_windows.h" 70833a452eSMartin Matuska /* The C library on Windows specifies a calling convention for callback 71833a452eSMartin Matuska * functions and exports; when we interact with them (capture pointers, 72833a452eSMartin Matuska * call and pass function pointers) we need to match their calling 73833a452eSMartin Matuska * convention. 74833a452eSMartin Matuska * This only matters when libarchive is built with /Gr, /Gz or /Gv 75833a452eSMartin Matuska * (which change the default calling convention.) */ 76833a452eSMartin Matuska #define __LA_LIBC_CC __cdecl 7752c2bb75SMartin Matuska #else 7852c2bb75SMartin Matuska #define la_stat(path,stref) stat(path,stref) 79833a452eSMartin Matuska #define __LA_LIBC_CC 80caf54c4fSMartin Matuska #endif 81caf54c4fSMartin Matuska 82caf54c4fSMartin Matuska /* 83caf54c4fSMartin Matuska * The config files define a lot of feature macros. The following 84caf54c4fSMartin Matuska * uses those macros to select/define replacements and include key 85caf54c4fSMartin Matuska * headers as required. 86caf54c4fSMartin Matuska */ 87caf54c4fSMartin Matuska 88caf54c4fSMartin Matuska /* Try to get standard C99-style integer type definitions. */ 89caf54c4fSMartin Matuska #if HAVE_INTTYPES_H 90caf54c4fSMartin Matuska #include <inttypes.h> 91caf54c4fSMartin Matuska #endif 92caf54c4fSMartin Matuska #if HAVE_STDINT_H 93caf54c4fSMartin Matuska #include <stdint.h> 94caf54c4fSMartin Matuska #endif 95caf54c4fSMartin Matuska 96caf54c4fSMartin Matuska /* Borland warns about its own constants! */ 97caf54c4fSMartin Matuska #if defined(__BORLANDC__) 98caf54c4fSMartin Matuska # if HAVE_DECL_UINT64_MAX 99caf54c4fSMartin Matuska # undef UINT64_MAX 100caf54c4fSMartin Matuska # undef HAVE_DECL_UINT64_MAX 101caf54c4fSMartin Matuska # endif 102caf54c4fSMartin Matuska # if HAVE_DECL_UINT64_MIN 103caf54c4fSMartin Matuska # undef UINT64_MIN 104caf54c4fSMartin Matuska # undef HAVE_DECL_UINT64_MIN 105caf54c4fSMartin Matuska # endif 106caf54c4fSMartin Matuska # if HAVE_DECL_INT64_MAX 107caf54c4fSMartin Matuska # undef INT64_MAX 108caf54c4fSMartin Matuska # undef HAVE_DECL_INT64_MAX 109caf54c4fSMartin Matuska # endif 110caf54c4fSMartin Matuska # if HAVE_DECL_INT64_MIN 111caf54c4fSMartin Matuska # undef INT64_MIN 112caf54c4fSMartin Matuska # undef HAVE_DECL_INT64_MIN 113caf54c4fSMartin Matuska # endif 114caf54c4fSMartin Matuska #endif 115caf54c4fSMartin Matuska 116caf54c4fSMartin Matuska /* Some platforms lack the standard *_MAX definitions. */ 117caf54c4fSMartin Matuska #if !HAVE_DECL_SIZE_MAX 118caf54c4fSMartin Matuska #define SIZE_MAX (~(size_t)0) 119caf54c4fSMartin Matuska #endif 120caf54c4fSMartin Matuska #if !HAVE_DECL_SSIZE_MAX 121caf54c4fSMartin Matuska #define SSIZE_MAX ((ssize_t)(SIZE_MAX >> 1)) 122caf54c4fSMartin Matuska #endif 123caf54c4fSMartin Matuska #if !HAVE_DECL_UINT32_MAX 124caf54c4fSMartin Matuska #define UINT32_MAX (~(uint32_t)0) 125caf54c4fSMartin Matuska #endif 126cdf63a70SMartin Matuska #if !HAVE_DECL_INT32_MAX 127cdf63a70SMartin Matuska #define INT32_MAX ((int32_t)(UINT32_MAX >> 1)) 128cdf63a70SMartin Matuska #endif 129cdf63a70SMartin Matuska #if !HAVE_DECL_INT32_MIN 130cdf63a70SMartin Matuska #define INT32_MIN ((int32_t)(~INT32_MAX)) 131cdf63a70SMartin Matuska #endif 132caf54c4fSMartin Matuska #if !HAVE_DECL_UINT64_MAX 133caf54c4fSMartin Matuska #define UINT64_MAX (~(uint64_t)0) 134caf54c4fSMartin Matuska #endif 135caf54c4fSMartin Matuska #if !HAVE_DECL_INT64_MAX 136caf54c4fSMartin Matuska #define INT64_MAX ((int64_t)(UINT64_MAX >> 1)) 137caf54c4fSMartin Matuska #endif 138caf54c4fSMartin Matuska #if !HAVE_DECL_INT64_MIN 139caf54c4fSMartin Matuska #define INT64_MIN ((int64_t)(~INT64_MAX)) 140caf54c4fSMartin Matuska #endif 141cdf63a70SMartin Matuska #if !HAVE_DECL_UINTMAX_MAX 142cdf63a70SMartin Matuska #define UINTMAX_MAX (~(uintmax_t)0) 143cdf63a70SMartin Matuska #endif 144cdf63a70SMartin Matuska #if !HAVE_DECL_INTMAX_MAX 145cdf63a70SMartin Matuska #define INTMAX_MAX ((intmax_t)(UINTMAX_MAX >> 1)) 146cdf63a70SMartin Matuska #endif 147cdf63a70SMartin Matuska #if !HAVE_DECL_INTMAX_MIN 148cdf63a70SMartin Matuska #define INTMAX_MIN ((intmax_t)(~INTMAX_MAX)) 149cdf63a70SMartin Matuska #endif 150caf54c4fSMartin Matuska 151833a452eSMartin Matuska /* Some platforms lack the standard PRIxN/PRIdN definitions. */ 152833a452eSMartin Matuska #if !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32) 153833a452eSMartin Matuska #ifndef PRIx32 154833a452eSMartin Matuska #if SIZEOF_INT == 4 155833a452eSMartin Matuska #define PRIx32 "x" 156833a452eSMartin Matuska #elif SIZEOF_LONG == 4 157833a452eSMartin Matuska #define PRIx32 "lx" 158833a452eSMartin Matuska #else 159833a452eSMartin Matuska #error No suitable 32-bit unsigned integer type found for this platform 160833a452eSMartin Matuska #endif 161833a452eSMartin Matuska #endif // PRIx32 162833a452eSMartin Matuska #ifndef PRId32 163833a452eSMartin Matuska #if SIZEOF_INT == 4 164833a452eSMartin Matuska #define PRId32 "d" 165833a452eSMartin Matuska #elif SIZEOF_LONG == 4 166833a452eSMartin Matuska #define PRId32 "ld" 167833a452eSMartin Matuska #else 168833a452eSMartin Matuska #error No suitable 32-bit signed integer type found for this platform 169833a452eSMartin Matuska #endif 170833a452eSMartin Matuska #endif // PRId32 171833a452eSMartin Matuska #endif // !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32) 172833a452eSMartin Matuska 173caf54c4fSMartin Matuska /* 174caf54c4fSMartin Matuska * If we can't restore metadata using a file descriptor, then 175caf54c4fSMartin Matuska * for compatibility's sake, close files before trying to restore metadata. 176caf54c4fSMartin Matuska */ 177caf54c4fSMartin Matuska #if defined(HAVE_FCHMOD) || defined(HAVE_FUTIMES) || defined(HAVE_ACL_SET_FD) || defined(HAVE_ACL_SET_FD_NP) || defined(HAVE_FCHOWN) 178caf54c4fSMartin Matuska #define CAN_RESTORE_METADATA_FD 179caf54c4fSMartin Matuska #endif 180caf54c4fSMartin Matuska 18124113d8cSMartin Matuska /* 18224113d8cSMartin Matuska * glibc 2.24 deprecates readdir_r 183bd5e624aSMartin Matuska * bionic c deprecates readdir_r too 18424113d8cSMartin Matuska */ 185bd5e624aSMartin Matuska #if defined(HAVE_READDIR_R) && (!defined(__GLIBC__) || !defined(__GLIBC_MINOR__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24)) && (!defined(__ANDROID__)) 18624113d8cSMartin Matuska #define USE_READDIR_R 1 18724113d8cSMartin Matuska #else 18824113d8cSMartin Matuska #undef USE_READDIR_R 18924113d8cSMartin Matuska #endif 19024113d8cSMartin Matuska 191caf54c4fSMartin Matuska /* Set up defaults for internal error codes. */ 192caf54c4fSMartin Matuska #ifndef ARCHIVE_ERRNO_FILE_FORMAT 193caf54c4fSMartin Matuska #if HAVE_EFTYPE 194caf54c4fSMartin Matuska #define ARCHIVE_ERRNO_FILE_FORMAT EFTYPE 195caf54c4fSMartin Matuska #else 196caf54c4fSMartin Matuska #if HAVE_EILSEQ 197caf54c4fSMartin Matuska #define ARCHIVE_ERRNO_FILE_FORMAT EILSEQ 198caf54c4fSMartin Matuska #else 199caf54c4fSMartin Matuska #define ARCHIVE_ERRNO_FILE_FORMAT EINVAL 200caf54c4fSMartin Matuska #endif 201caf54c4fSMartin Matuska #endif 202caf54c4fSMartin Matuska #endif 203caf54c4fSMartin Matuska 204caf54c4fSMartin Matuska #ifndef ARCHIVE_ERRNO_PROGRAMMER 205caf54c4fSMartin Matuska #define ARCHIVE_ERRNO_PROGRAMMER EINVAL 206caf54c4fSMartin Matuska #endif 207caf54c4fSMartin Matuska 208caf54c4fSMartin Matuska #ifndef ARCHIVE_ERRNO_MISC 209caf54c4fSMartin Matuska #define ARCHIVE_ERRNO_MISC (-1) 210caf54c4fSMartin Matuska #endif 211caf54c4fSMartin Matuska 212a2a3407cSMartin Matuska #if defined(__GNUC__) && (__GNUC__ >= 7) 213a2a3407cSMartin Matuska #define __LA_FALLTHROUGH __attribute__((fallthrough)) 214a2a3407cSMartin Matuska #else 215a2a3407cSMartin Matuska #define __LA_FALLTHROUGH 216a2a3407cSMartin Matuska #endif 217a2a3407cSMartin Matuska 218caf54c4fSMartin Matuska #endif /* !ARCHIVE_PLATFORM_H_INCLUDED */ 219