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