1*543adbedSBen Gras /*- 2*543adbedSBen Gras * Copyright (c) 2003-2007 Tim Kientzle 3*543adbedSBen Gras * All rights reserved. 4*543adbedSBen Gras * 5*543adbedSBen Gras * Redistribution and use in source and binary forms, with or without 6*543adbedSBen Gras * modification, are permitted provided that the following conditions 7*543adbedSBen Gras * are met: 8*543adbedSBen Gras * 1. Redistributions of source code must retain the above copyright 9*543adbedSBen Gras * notice, this list of conditions and the following disclaimer. 10*543adbedSBen Gras * 2. Redistributions in binary form must reproduce the above copyright 11*543adbedSBen Gras * notice, this list of conditions and the following disclaimer in the 12*543adbedSBen Gras * documentation and/or other materials provided with the distribution. 13*543adbedSBen Gras * 14*543adbedSBen Gras * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15*543adbedSBen Gras * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16*543adbedSBen Gras * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17*543adbedSBen Gras * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18*543adbedSBen Gras * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19*543adbedSBen Gras * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20*543adbedSBen Gras * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21*543adbedSBen Gras * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*543adbedSBen Gras * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23*543adbedSBen Gras * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*543adbedSBen Gras * 25*543adbedSBen Gras * $FreeBSD: src/usr.bin/tar/bsdtar.h,v 1.37 2008/12/06 07:37:14 kientzle Exp $ 26*543adbedSBen Gras */ 27*543adbedSBen Gras 28*543adbedSBen Gras #include "bsdtar_platform.h" 29*543adbedSBen Gras #include <stdio.h> 30*543adbedSBen Gras 31*543adbedSBen Gras #include "matching.h" 32*543adbedSBen Gras 33*543adbedSBen Gras #define DEFAULT_BYTES_PER_BLOCK (20*512) 34*543adbedSBen Gras 35*543adbedSBen Gras /* 36*543adbedSBen Gras * The internal state for the "bsdtar" program. 37*543adbedSBen Gras * 38*543adbedSBen Gras * Keeping all of the state in a structure like this simplifies memory 39*543adbedSBen Gras * leak testing (at exit, anything left on the heap is suspect). A 40*543adbedSBen Gras * pointer to this structure is passed to most bsdtar internal 41*543adbedSBen Gras * functions. 42*543adbedSBen Gras */ 43*543adbedSBen Gras struct bsdtar { 44*543adbedSBen Gras /* Options */ 45*543adbedSBen Gras const char *filename; /* -f filename */ 46*543adbedSBen Gras const char *create_format; /* -F format */ 47*543adbedSBen Gras char *pending_chdir; /* -C dir */ 48*543adbedSBen Gras const char *names_from_file; /* -T file */ 49*543adbedSBen Gras time_t newer_ctime_sec; /* --newer/--newer-than */ 50*543adbedSBen Gras long newer_ctime_nsec; /* --newer/--newer-than */ 51*543adbedSBen Gras time_t newer_mtime_sec; /* --newer-mtime */ 52*543adbedSBen Gras long newer_mtime_nsec; /* --newer-mtime-than */ 53*543adbedSBen Gras int bytes_per_block; /* -b block_size */ 54*543adbedSBen Gras int verbose; /* -v */ 55*543adbedSBen Gras int extract_flags; /* Flags for extract operation */ 56*543adbedSBen Gras int strip_components; /* Remove this many leading dirs */ 57*543adbedSBen Gras char mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */ 58*543adbedSBen Gras char symlink_mode; /* H or L, per BSD conventions */ 59*543adbedSBen Gras char create_compression; /* j, y, or z */ 60*543adbedSBen Gras const char *compress_program; 61*543adbedSBen Gras char option_absolute_paths; /* -P */ 62*543adbedSBen Gras char option_chroot; /* --chroot */ 63*543adbedSBen Gras char option_dont_traverse_mounts; /* --one-file-system */ 64*543adbedSBen Gras char option_fast_read; /* --fast-read */ 65*543adbedSBen Gras const char *option_options; /* --options */ 66*543adbedSBen Gras char option_honor_nodump; /* --nodump */ 67*543adbedSBen Gras char option_interactive; /* -w */ 68*543adbedSBen Gras char option_no_owner; /* -o */ 69*543adbedSBen Gras char option_no_subdirs; /* -n */ 70*543adbedSBen Gras char option_null; /* --null */ 71*543adbedSBen Gras char option_numeric_owner; /* --numeric-owner */ 72*543adbedSBen Gras char option_stdout; /* -O */ 73*543adbedSBen Gras char option_totals; /* --totals */ 74*543adbedSBen Gras char option_unlink_first; /* -U */ 75*543adbedSBen Gras char option_warn_links; /* --check-links */ 76*543adbedSBen Gras char day_first; /* show day before month in -tv output */ 77*543adbedSBen Gras 78*543adbedSBen Gras /* If >= 0, then close this when done. */ 79*543adbedSBen Gras int fd; 80*543adbedSBen Gras 81*543adbedSBen Gras /* Miscellaneous state information */ 82*543adbedSBen Gras int argc; 83*543adbedSBen Gras char **argv; 84*543adbedSBen Gras const char *optarg; 85*543adbedSBen Gras size_t gs_width; /* For 'list_item' in read.c */ 86*543adbedSBen Gras size_t u_width; /* for 'list_item' in read.c */ 87*543adbedSBen Gras uid_t user_uid; /* UID running this program */ 88*543adbedSBen Gras int return_value; /* Value returned by main() */ 89*543adbedSBen Gras char warned_lead_slash; /* Already displayed warning */ 90*543adbedSBen Gras char next_line_is_dir; /* Used for -C parsing in -cT */ 91*543adbedSBen Gras 92*543adbedSBen Gras /* 93*543adbedSBen Gras * Data for various subsystems. Full definitions are located in 94*543adbedSBen Gras * the file where they are used. 95*543adbedSBen Gras */ 96*543adbedSBen Gras struct archive *diskreader; /* for write.c */ 97*543adbedSBen Gras struct archive_entry_linkresolver *resolver; /* for write.c */ 98*543adbedSBen Gras struct archive_dir *archive_dir; /* for write.c */ 99*543adbedSBen Gras struct name_cache *gname_cache; /* for write.c */ 100*543adbedSBen Gras char *buff; /* for write.c */ 101*543adbedSBen Gras struct lafe_matching *matching; /* for matching.c */ 102*543adbedSBen Gras struct security *security; /* for read.c */ 103*543adbedSBen Gras struct name_cache *uname_cache; /* for write.c */ 104*543adbedSBen Gras struct siginfo_data *siginfo; /* for siginfo.c */ 105*543adbedSBen Gras struct substitution *substitution; /* for subst.c */ 106*543adbedSBen Gras }; 107*543adbedSBen Gras 108*543adbedSBen Gras /* Fake short equivalents for long options that otherwise lack them. */ 109*543adbedSBen Gras enum { 110*543adbedSBen Gras OPTION_CHECK_LINKS = 1, 111*543adbedSBen Gras OPTION_CHROOT, 112*543adbedSBen Gras OPTION_EXCLUDE, 113*543adbedSBen Gras OPTION_FORMAT, 114*543adbedSBen Gras OPTION_OPTIONS, 115*543adbedSBen Gras OPTION_HELP, 116*543adbedSBen Gras OPTION_INCLUDE, 117*543adbedSBen Gras OPTION_KEEP_NEWER_FILES, 118*543adbedSBen Gras OPTION_LZMA, 119*543adbedSBen Gras OPTION_NEWER_CTIME, 120*543adbedSBen Gras OPTION_NEWER_CTIME_THAN, 121*543adbedSBen Gras OPTION_NEWER_MTIME, 122*543adbedSBen Gras OPTION_NEWER_MTIME_THAN, 123*543adbedSBen Gras OPTION_NODUMP, 124*543adbedSBen Gras OPTION_NO_SAME_OWNER, 125*543adbedSBen Gras OPTION_NO_SAME_PERMISSIONS, 126*543adbedSBen Gras OPTION_NULL, 127*543adbedSBen Gras OPTION_NUMERIC_OWNER, 128*543adbedSBen Gras OPTION_ONE_FILE_SYSTEM, 129*543adbedSBen Gras OPTION_POSIX, 130*543adbedSBen Gras OPTION_SAME_OWNER, 131*543adbedSBen Gras OPTION_STRIP_COMPONENTS, 132*543adbedSBen Gras OPTION_TOTALS, 133*543adbedSBen Gras OPTION_USE_COMPRESS_PROGRAM, 134*543adbedSBen Gras OPTION_VERSION 135*543adbedSBen Gras }; 136*543adbedSBen Gras 137*543adbedSBen Gras 138*543adbedSBen Gras int bsdtar_getopt(struct bsdtar *); 139*543adbedSBen Gras void do_chdir(struct bsdtar *); 140*543adbedSBen Gras int edit_pathname(struct bsdtar *, struct archive_entry *); 141*543adbedSBen Gras int need_report(void); 142*543adbedSBen Gras int pathcmp(const char *a, const char *b); 143*543adbedSBen Gras void safe_fprintf(FILE *, const char *fmt, ...); 144*543adbedSBen Gras void set_chdir(struct bsdtar *, const char *newdir); 145*543adbedSBen Gras const char *tar_i64toa(int64_t); 146*543adbedSBen Gras void tar_mode_c(struct bsdtar *bsdtar); 147*543adbedSBen Gras void tar_mode_r(struct bsdtar *bsdtar); 148*543adbedSBen Gras void tar_mode_t(struct bsdtar *bsdtar); 149*543adbedSBen Gras void tar_mode_u(struct bsdtar *bsdtar); 150*543adbedSBen Gras void tar_mode_x(struct bsdtar *bsdtar); 151*543adbedSBen Gras void usage(void); 152*543adbedSBen Gras int yes(const char *fmt, ...); 153*543adbedSBen Gras 154*543adbedSBen Gras #if HAVE_REGEX_H 155*543adbedSBen Gras void add_substitution(struct bsdtar *, const char *); 156*543adbedSBen Gras int apply_substitution(struct bsdtar *, const char *, char **, int); 157*543adbedSBen Gras void cleanup_substitution(struct bsdtar *); 158*543adbedSBen Gras #endif 159