1caf54c4fSMartin Matuska /*- 2bd66c1b4SMartin Matuska * SPDX-License-Identifier: BSD-2-Clause 3bd66c1b4SMartin Matuska * 4caf54c4fSMartin Matuska * Copyright (c) 2003-2007 Tim Kientzle 5caf54c4fSMartin Matuska * All rights reserved. 6caf54c4fSMartin Matuska */ 7caf54c4fSMartin Matuska 8f9762417SMartin Matuska #ifndef BSDTAR_H_INCLUDED 9f9762417SMartin Matuska #define BSDTAR_H_INCLUDED 10f9762417SMartin Matuska 11caf54c4fSMartin Matuska #include "bsdtar_platform.h" 12caf54c4fSMartin Matuska #include <stdio.h> 13caf54c4fSMartin Matuska 14caf54c4fSMartin Matuska #define DEFAULT_BYTES_PER_BLOCK (20*512) 15acc60b03SMartin Matuska #define ENV_READER_OPTIONS "TAR_READER_OPTIONS" 16acc60b03SMartin Matuska #define ENV_WRITER_OPTIONS "TAR_WRITER_OPTIONS" 17acc60b03SMartin Matuska #define IGNORE_WRONG_MODULE_NAME "__ignore_wrong_module_name__," 18caf54c4fSMartin Matuska 19acc60b03SMartin Matuska struct creation_set; 20caf54c4fSMartin Matuska /* 21caf54c4fSMartin Matuska * The internal state for the "bsdtar" program. 22caf54c4fSMartin Matuska * 23caf54c4fSMartin Matuska * Keeping all of the state in a structure like this simplifies memory 24caf54c4fSMartin Matuska * leak testing (at exit, anything left on the heap is suspect). A 25caf54c4fSMartin Matuska * pointer to this structure is passed to most bsdtar internal 26caf54c4fSMartin Matuska * functions. 27caf54c4fSMartin Matuska */ 28caf54c4fSMartin Matuska struct bsdtar { 29caf54c4fSMartin Matuska /* Options */ 30caf54c4fSMartin Matuska const char *filename; /* -f filename */ 31caf54c4fSMartin Matuska char *pending_chdir; /* -C dir */ 32caf54c4fSMartin Matuska const char *names_from_file; /* -T file */ 33caf54c4fSMartin Matuska int bytes_per_block; /* -b block_size */ 346c95142eSMartin Matuska int bytes_in_last_block; /* See -b handling. */ 35caf54c4fSMartin Matuska int verbose; /* -v */ 3664287048SMartin Matuska unsigned int flags; /* Bitfield of boolean options */ 37caf54c4fSMartin Matuska int extract_flags; /* Flags for extract operation */ 38fd082e96SMartin Matuska int readdisk_flags; /* Flags for read disk operation */ 39caf54c4fSMartin Matuska int strip_components; /* Remove this many leading dirs */ 40caf54c4fSMartin Matuska int gid; /* --gid */ 41caf54c4fSMartin Matuska const char *gname; /* --gname */ 42caf54c4fSMartin Matuska int uid; /* --uid */ 43caf54c4fSMartin Matuska const char *uname; /* --uname */ 44cdf63a70SMartin Matuska const char *passphrase; /* --passphrase */ 45*2e113ef8SMartin Matuska int mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */ 46caf54c4fSMartin Matuska char symlink_mode; /* H or L, per BSD conventions */ 47caf54c4fSMartin Matuska const char *option_options; /* --options */ 48caf54c4fSMartin Matuska char day_first; /* show day before month in -tv output */ 49*2e113ef8SMartin Matuska char has_mtime; /* --mtime exists (0 or 1) */ 50*2e113ef8SMartin Matuska char clamp_mtime; /* --clamp-mtime (0 or 1)*/ 51*2e113ef8SMartin Matuska time_t mtime; /* --mtime */ 52acc60b03SMartin Matuska struct creation_set *cset; 536c95142eSMartin Matuska 546c95142eSMartin Matuska /* Option parser state */ 556c95142eSMartin Matuska int getopt_state; 566c95142eSMartin Matuska char *getopt_word; 57caf54c4fSMartin Matuska 58caf54c4fSMartin Matuska /* If >= 0, then close this when done. */ 59caf54c4fSMartin Matuska int fd; 60caf54c4fSMartin Matuska 61caf54c4fSMartin Matuska /* Miscellaneous state information */ 62caf54c4fSMartin Matuska int argc; 63caf54c4fSMartin Matuska char **argv; 646c95142eSMartin Matuska const char *argument; 65caf54c4fSMartin Matuska size_t gs_width; /* For 'list_item' in read.c */ 66caf54c4fSMartin Matuska size_t u_width; /* for 'list_item' in read.c */ 67caf54c4fSMartin Matuska uid_t user_uid; /* UID running this program */ 68caf54c4fSMartin Matuska int return_value; /* Value returned by main() */ 69caf54c4fSMartin Matuska char warned_lead_slash; /* Already displayed warning */ 70caf54c4fSMartin Matuska char next_line_is_dir; /* Used for -C parsing in -cT */ 71caf54c4fSMartin Matuska 72caf54c4fSMartin Matuska /* 73caf54c4fSMartin Matuska * Data for various subsystems. Full definitions are located in 74caf54c4fSMartin Matuska * the file where they are used. 75caf54c4fSMartin Matuska */ 76caf54c4fSMartin Matuska struct archive *diskreader; /* for write.c */ 77caf54c4fSMartin Matuska struct archive_entry_linkresolver *resolver; /* for write.c */ 78caf54c4fSMartin Matuska struct archive_dir *archive_dir; /* for write.c */ 79caf54c4fSMartin Matuska struct name_cache *gname_cache; /* for write.c */ 80caf54c4fSMartin Matuska char *buff; /* for write.c */ 816c95142eSMartin Matuska size_t buff_size; /* for write.c */ 82fd082e96SMartin Matuska int first_fs; /* for write.c */ 83fd082e96SMartin Matuska struct archive *matching; /* for matching.c */ 84caf54c4fSMartin Matuska struct security *security; /* for read.c */ 85caf54c4fSMartin Matuska struct name_cache *uname_cache; /* for write.c */ 86caf54c4fSMartin Matuska struct siginfo_data *siginfo; /* for siginfo.c */ 87caf54c4fSMartin Matuska struct substitution *substitution; /* for subst.c */ 88cdf63a70SMartin Matuska char *ppbuff; /* for util.c */ 89caf54c4fSMartin Matuska }; 90caf54c4fSMartin Matuska 9164287048SMartin Matuska /* Options for flags bitfield */ 9264287048SMartin Matuska #define OPTFLAG_AUTO_COMPRESS (0x00000001) /* -a */ 9364287048SMartin Matuska #define OPTFLAG_ABSOLUTE_PATHS (0x00000002) /* -P */ 9464287048SMartin Matuska #define OPTFLAG_CHROOT (0x00000004) /* --chroot */ 9564287048SMartin Matuska #define OPTFLAG_FAST_READ (0x00000008) /* --fast-read */ 9664287048SMartin Matuska #define OPTFLAG_IGNORE_ZEROS (0x00000010) /* --ignore-zeros */ 9764287048SMartin Matuska #define OPTFLAG_INTERACTIVE (0x00000020) /* -w */ 9864287048SMartin Matuska #define OPTFLAG_NO_OWNER (0x00000040) /* -o */ 9964287048SMartin Matuska #define OPTFLAG_NO_SUBDIRS (0x00000080) /* -n */ 10064287048SMartin Matuska #define OPTFLAG_NULL (0x00000100) /* --null */ 10164287048SMartin Matuska #define OPTFLAG_NUMERIC_OWNER (0x00000200) /* --numeric-owner */ 10264287048SMartin Matuska #define OPTFLAG_O (0x00000400) /* -o */ 10364287048SMartin Matuska #define OPTFLAG_STDOUT (0x00000800) /* -O */ 10464287048SMartin Matuska #define OPTFLAG_TOTALS (0x00001000) /* --totals */ 10564287048SMartin Matuska #define OPTFLAG_UNLINK_FIRST (0x00002000) /* -U */ 10664287048SMartin Matuska #define OPTFLAG_WARN_LINKS (0x00004000) /* --check-links */ 10764287048SMartin Matuska #define OPTFLAG_NO_XATTRS (0x00008000) /* --no-xattrs */ 10864287048SMartin Matuska #define OPTFLAG_XATTRS (0x00010000) /* --xattrs */ 10964287048SMartin Matuska #define OPTFLAG_NO_ACLS (0x00020000) /* --no-acls */ 11064287048SMartin Matuska #define OPTFLAG_ACLS (0x00040000) /* --acls */ 11164287048SMartin Matuska #define OPTFLAG_NO_FFLAGS (0x00080000) /* --no-fflags */ 11264287048SMartin Matuska #define OPTFLAG_FFLAGS (0x00100000) /* --fflags */ 11364287048SMartin Matuska #define OPTFLAG_NO_MAC_METADATA (0x00200000) /* --no-mac-metadata */ 11464287048SMartin Matuska #define OPTFLAG_MAC_METADATA (0x00400000) /* --mac-metadata */ 115833a452eSMartin Matuska #define OPTFLAG_NO_READ_SPARSE (0x00800000) /* --no-read-sparse */ 116833a452eSMartin Matuska #define OPTFLAG_READ_SPARSE (0x01000000) /* --read-sparse */ 11764287048SMartin Matuska 118caf54c4fSMartin Matuska /* Fake short equivalents for long options that otherwise lack them. */ 119caf54c4fSMartin Matuska enum { 120*2e113ef8SMartin Matuska OPTION_ACLS = 256, 12164287048SMartin Matuska OPTION_B64ENCODE, 122acc60b03SMartin Matuska OPTION_CHECK_LINKS, 123caf54c4fSMartin Matuska OPTION_CHROOT, 124cdf63a70SMartin Matuska OPTION_CLEAR_NOCHANGE_FFLAGS, 125caf54c4fSMartin Matuska OPTION_EXCLUDE, 12652c2bb75SMartin Matuska OPTION_EXCLUDE_VCS, 12764287048SMartin Matuska OPTION_FFLAGS, 128caf54c4fSMartin Matuska OPTION_FORMAT, 129caf54c4fSMartin Matuska OPTION_GID, 130caf54c4fSMartin Matuska OPTION_GNAME, 131b9128a37SMartin Matuska OPTION_GROUP, 132acc60b03SMartin Matuska OPTION_GRZIP, 133caf54c4fSMartin Matuska OPTION_HELP, 134acc60b03SMartin Matuska OPTION_HFS_COMPRESSION, 135cdf63a70SMartin Matuska OPTION_IGNORE_ZEROS, 136caf54c4fSMartin Matuska OPTION_INCLUDE, 137caf54c4fSMartin Matuska OPTION_KEEP_NEWER_FILES, 138acc60b03SMartin Matuska OPTION_LRZIP, 139cdf63a70SMartin Matuska OPTION_LZ4, 1406c95142eSMartin Matuska OPTION_LZIP, 141caf54c4fSMartin Matuska OPTION_LZMA, 142acc60b03SMartin Matuska OPTION_LZOP, 14364287048SMartin Matuska OPTION_MAC_METADATA, 144caf54c4fSMartin Matuska OPTION_NEWER_CTIME, 145caf54c4fSMartin Matuska OPTION_NEWER_CTIME_THAN, 146caf54c4fSMartin Matuska OPTION_NEWER_MTIME, 147caf54c4fSMartin Matuska OPTION_NEWER_MTIME_THAN, 148caf54c4fSMartin Matuska OPTION_NODUMP, 149acc60b03SMartin Matuska OPTION_NOPRESERVE_HFS_COMPRESSION, 15064287048SMartin Matuska OPTION_NO_ACLS, 15164287048SMartin Matuska OPTION_NO_FFLAGS, 15264287048SMartin Matuska OPTION_NO_MAC_METADATA, 153833a452eSMartin Matuska OPTION_NO_READ_SPARSE, 154f9762417SMartin Matuska OPTION_NO_SAFE_WRITES, 155caf54c4fSMartin Matuska OPTION_NO_SAME_OWNER, 156caf54c4fSMartin Matuska OPTION_NO_SAME_PERMISSIONS, 15764287048SMartin Matuska OPTION_NO_XATTRS, 158caf54c4fSMartin Matuska OPTION_NULL, 159caf54c4fSMartin Matuska OPTION_NUMERIC_OWNER, 160acc60b03SMartin Matuska OPTION_OLDER_CTIME, 161acc60b03SMartin Matuska OPTION_OLDER_CTIME_THAN, 162acc60b03SMartin Matuska OPTION_OLDER_MTIME, 163acc60b03SMartin Matuska OPTION_OLDER_MTIME_THAN, 164caf54c4fSMartin Matuska OPTION_ONE_FILE_SYSTEM, 165caf54c4fSMartin Matuska OPTION_OPTIONS, 166b9128a37SMartin Matuska OPTION_OWNER, 167cdf63a70SMartin Matuska OPTION_PASSPHRASE, 168caf54c4fSMartin Matuska OPTION_POSIX, 169833a452eSMartin Matuska OPTION_READ_SPARSE, 170f9762417SMartin Matuska OPTION_SAFE_WRITES, 171caf54c4fSMartin Matuska OPTION_SAME_OWNER, 172caf54c4fSMartin Matuska OPTION_STRIP_COMPONENTS, 173caf54c4fSMartin Matuska OPTION_TOTALS, 174caf54c4fSMartin Matuska OPTION_UID, 175caf54c4fSMartin Matuska OPTION_UNAME, 176caf54c4fSMartin Matuska OPTION_USE_COMPRESS_PROGRAM, 177acc60b03SMartin Matuska OPTION_UUENCODE, 17864287048SMartin Matuska OPTION_VERSION, 1795c831a5bSMartin Matuska OPTION_XATTRS, 1805c831a5bSMartin Matuska OPTION_ZSTD, 181*2e113ef8SMartin Matuska OPTION_MTIME, 182*2e113ef8SMartin Matuska OPTION_CLAMP_MTIME, 183caf54c4fSMartin Matuska }; 184caf54c4fSMartin Matuska 185caf54c4fSMartin Matuska int bsdtar_getopt(struct bsdtar *); 186caf54c4fSMartin Matuska void do_chdir(struct bsdtar *); 187caf54c4fSMartin Matuska int edit_pathname(struct bsdtar *, struct archive_entry *); 188*2e113ef8SMartin Matuska void edit_mtime(struct bsdtar *, struct archive_entry *); 189caf54c4fSMartin Matuska int need_report(void); 190caf54c4fSMartin Matuska int pathcmp(const char *a, const char *b); 191*2e113ef8SMartin Matuska void safe_fprintf(FILE * restrict, const char * restrict fmt, ...) __LA_PRINTF(2, 3); 192caf54c4fSMartin Matuska void set_chdir(struct bsdtar *, const char *newdir); 193caf54c4fSMartin Matuska const char *tar_i64toa(int64_t); 194caf54c4fSMartin Matuska void tar_mode_c(struct bsdtar *bsdtar); 195caf54c4fSMartin Matuska void tar_mode_r(struct bsdtar *bsdtar); 196caf54c4fSMartin Matuska void tar_mode_t(struct bsdtar *bsdtar); 197caf54c4fSMartin Matuska void tar_mode_u(struct bsdtar *bsdtar); 198caf54c4fSMartin Matuska void tar_mode_x(struct bsdtar *bsdtar); 199b9128a37SMartin Matuska __LA_NORETURN void usage(void); 20064287048SMartin Matuska int yes(const char *fmt, ...) __LA_PRINTF(1, 2); 201caf54c4fSMartin Matuska 202b9128a37SMartin Matuska #if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) 203caf54c4fSMartin Matuska void add_substitution(struct bsdtar *, const char *); 2046c95142eSMartin Matuska int apply_substitution(struct bsdtar *, const char *, char **, int, int); 205caf54c4fSMartin Matuska void cleanup_substitution(struct bsdtar *); 206caf54c4fSMartin Matuska #endif 207acc60b03SMartin Matuska 208acc60b03SMartin Matuska void cset_add_filter(struct creation_set *, const char *); 209acc60b03SMartin Matuska void cset_add_filter_program(struct creation_set *, const char *); 210acc60b03SMartin Matuska int cset_auto_compress(struct creation_set *, const char *); 211acc60b03SMartin Matuska void cset_free(struct creation_set *); 212acc60b03SMartin Matuska const char * cset_get_format(struct creation_set *); 213acc60b03SMartin Matuska struct creation_set *cset_new(void); 214acc60b03SMartin Matuska int cset_read_support_filter_program(struct creation_set *, 215acc60b03SMartin Matuska struct archive *); 216acc60b03SMartin Matuska void cset_set_format(struct creation_set *, const char *); 217acc60b03SMartin Matuska int cset_write_add_filters(struct creation_set *, 218acc60b03SMartin Matuska struct archive *, const void **); 219acc60b03SMartin Matuska 220cdf63a70SMartin Matuska const char * passphrase_callback(struct archive *, void *); 221cdf63a70SMartin Matuska void passphrase_free(char *); 222cdf63a70SMartin Matuska void list_item_verbose(struct bsdtar *, FILE *, 223cdf63a70SMartin Matuska struct archive_entry *); 224f9762417SMartin Matuska 225f9762417SMartin Matuska #endif 226