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