xref: /freebsd/contrib/libarchive/tar/bsdtar_platform.h (revision bd66c1b43e33540205dbc1187c2f2a15c58b57ba)
1caf54c4fSMartin Matuska /*-
2*bd66c1b4SMartin Matuska  * SPDX-License-Identifier: BSD-2-Clause
3*bd66c1b4SMartin Matuska  *
4caf54c4fSMartin Matuska  * Copyright (c) 2003-2007 Tim Kientzle
5caf54c4fSMartin Matuska  * All rights reserved.
6caf54c4fSMartin Matuska  */
7caf54c4fSMartin Matuska 
8caf54c4fSMartin Matuska /*
9caf54c4fSMartin Matuska  * This header is the first thing included in any of the bsdtar
10caf54c4fSMartin Matuska  * source files.  As far as possible, platform-specific issues should
11caf54c4fSMartin Matuska  * be dealt with here and not within individual source files.
12caf54c4fSMartin Matuska  */
13caf54c4fSMartin Matuska 
14caf54c4fSMartin Matuska #ifndef BSDTAR_PLATFORM_H_INCLUDED
15caf54c4fSMartin Matuska #define	BSDTAR_PLATFORM_H_INCLUDED
16caf54c4fSMartin Matuska 
17caf54c4fSMartin Matuska #if defined(PLATFORM_CONFIG_H)
18caf54c4fSMartin Matuska /* Use hand-built config.h in environments that need it. */
19caf54c4fSMartin Matuska #include PLATFORM_CONFIG_H
20caf54c4fSMartin Matuska #else
21caf54c4fSMartin Matuska /* Not having a config.h of some sort is a serious problem. */
22caf54c4fSMartin Matuska #include "config.h"
23caf54c4fSMartin Matuska #endif
24caf54c4fSMartin Matuska 
25cdf63a70SMartin Matuska #if defined(_WIN32) && !defined(__CYGWIN__)
26cdf63a70SMartin Matuska #include "bsdtar_windows.h"
27cdf63a70SMartin Matuska #endif
28cdf63a70SMartin Matuska 
29caf54c4fSMartin Matuska #ifdef HAVE_LIBARCHIVE
30caf54c4fSMartin Matuska /* If we're using the platform libarchive, include system headers. */
31caf54c4fSMartin Matuska #include <archive.h>
32caf54c4fSMartin Matuska #include <archive_entry.h>
33caf54c4fSMartin Matuska #else
34caf54c4fSMartin Matuska /* Otherwise, include user headers. */
35caf54c4fSMartin Matuska #include "archive.h"
36caf54c4fSMartin Matuska #include "archive_entry.h"
37caf54c4fSMartin Matuska #endif
38caf54c4fSMartin Matuska 
39caf54c4fSMartin Matuska #ifdef HAVE_LIBACL
40caf54c4fSMartin Matuska #include <acl/libacl.h>
41caf54c4fSMartin Matuska #endif
42caf54c4fSMartin Matuska 
43caf54c4fSMartin Matuska /*
446c95142eSMartin Matuska  * Include "dirent.h" (or its equivalent on several different platforms).
45caf54c4fSMartin Matuska  *
46caf54c4fSMartin Matuska  * This is slightly modified from the GNU autoconf recipe.
476c95142eSMartin Matuska  * In particular, FreeBSD includes d_namlen in its dirent structure,
48caf54c4fSMartin Matuska  * so my configure script includes an explicit test for the d_namlen
49caf54c4fSMartin Matuska  * field.
50caf54c4fSMartin Matuska  */
51caf54c4fSMartin Matuska #if HAVE_DIRENT_H
52caf54c4fSMartin Matuska # include <dirent.h>
53caf54c4fSMartin Matuska # if HAVE_DIRENT_D_NAMLEN
54caf54c4fSMartin Matuska #  define DIRENT_NAMLEN(dirent) (dirent)->d_namlen
55caf54c4fSMartin Matuska # else
56caf54c4fSMartin Matuska #  define DIRENT_NAMLEN(dirent) strlen((dirent)->d_name)
57caf54c4fSMartin Matuska # endif
58caf54c4fSMartin Matuska #else
59caf54c4fSMartin Matuska # define dirent direct
60caf54c4fSMartin Matuska # define DIRENT_NAMLEN(dirent) (dirent)->d_namlen
61caf54c4fSMartin Matuska # if HAVE_SYS_NDIR_H
62caf54c4fSMartin Matuska #  include <sys/ndir.h>
63caf54c4fSMartin Matuska # endif
64caf54c4fSMartin Matuska # if HAVE_SYS_DIR_H
65caf54c4fSMartin Matuska #  include <sys/dir.h>
66caf54c4fSMartin Matuska # endif
67caf54c4fSMartin Matuska # if HAVE_NDIR_H
68caf54c4fSMartin Matuska #  include <ndir.h>
69caf54c4fSMartin Matuska # endif
70caf54c4fSMartin Matuska #endif
71caf54c4fSMartin Matuska 
72caf54c4fSMartin Matuska #if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
73caf54c4fSMartin Matuska #define	ARCHIVE_STAT_CTIME_NANOS(st)	(st)->st_ctimespec.tv_nsec
74caf54c4fSMartin Matuska #define	ARCHIVE_STAT_MTIME_NANOS(st)	(st)->st_mtimespec.tv_nsec
75caf54c4fSMartin Matuska #elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
76caf54c4fSMartin Matuska #define	ARCHIVE_STAT_CTIME_NANOS(st)	(st)->st_ctim.tv_nsec
77caf54c4fSMartin Matuska #define	ARCHIVE_STAT_MTIME_NANOS(st)	(st)->st_mtim.tv_nsec
78caf54c4fSMartin Matuska #elif HAVE_STRUCT_STAT_ST_MTIME_N
79caf54c4fSMartin Matuska #define	ARCHIVE_STAT_CTIME_NANOS(st)	(st)->st_ctime_n
80caf54c4fSMartin Matuska #define	ARCHIVE_STAT_MTIME_NANOS(st)	(st)->st_mtime_n
81caf54c4fSMartin Matuska #elif HAVE_STRUCT_STAT_ST_UMTIME
82caf54c4fSMartin Matuska #define	ARCHIVE_STAT_CTIME_NANOS(st)	(st)->st_uctime * 1000
83caf54c4fSMartin Matuska #define	ARCHIVE_STAT_MTIME_NANOS(st)	(st)->st_umtime * 1000
84caf54c4fSMartin Matuska #elif HAVE_STRUCT_STAT_ST_MTIME_USEC
85caf54c4fSMartin Matuska #define	ARCHIVE_STAT_CTIME_NANOS(st)	(st)->st_ctime_usec * 1000
86caf54c4fSMartin Matuska #define	ARCHIVE_STAT_MTIME_NANOS(st)	(st)->st_mtime_usec * 1000
87caf54c4fSMartin Matuska #else
88caf54c4fSMartin Matuska #define	ARCHIVE_STAT_CTIME_NANOS(st)	(0)
89caf54c4fSMartin Matuska #define	ARCHIVE_STAT_MTIME_NANOS(st)	(0)
90caf54c4fSMartin Matuska #endif
91caf54c4fSMartin Matuska 
92caf54c4fSMartin Matuska /* How to mark functions that don't return. */
93caf54c4fSMartin Matuska /* This facilitates use of some newer static code analysis tools. */
94b9128a37SMartin Matuska #undef __LA_NORETURN
95caf54c4fSMartin Matuska #if defined(__GNUC__) && (__GNUC__ > 2 || \
96caf54c4fSMartin Matuska                           (__GNUC__ == 2 && __GNUC_MINOR__ >= 5))
97b9128a37SMartin Matuska #define __LA_NORETURN       __attribute__((__noreturn__))
98b9128a37SMartin Matuska #elif defined(_MSC_VER)
99b9128a37SMartin Matuska #define __LA_NORETURN __declspec(noreturn)
100caf54c4fSMartin Matuska #else
101b9128a37SMartin Matuska #define __LA_NORETURN
102caf54c4fSMartin Matuska #endif
103caf54c4fSMartin Matuska 
104caf54c4fSMartin Matuska #endif /* !BSDTAR_PLATFORM_H_INCLUDED */
105