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