bsdtar.h revision 1.1.1.5 1 /*-
2 * Copyright (c) 2003-2007 Tim Kientzle
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26 #ifndef BSDTAR_H_INCLUDED
27 #define BSDTAR_H_INCLUDED
28
29 #include "bsdtar_platform.h"
30 #include <stdio.h>
31
32 #define DEFAULT_BYTES_PER_BLOCK (20*512)
33 #define ENV_READER_OPTIONS "TAR_READER_OPTIONS"
34 #define ENV_WRITER_OPTIONS "TAR_WRITER_OPTIONS"
35 #define IGNORE_WRONG_MODULE_NAME "__ignore_wrong_module_name__,"
36
37 struct creation_set;
38 /*
39 * The internal state for the "bsdtar" program.
40 *
41 * Keeping all of the state in a structure like this simplifies memory
42 * leak testing (at exit, anything left on the heap is suspect). A
43 * pointer to this structure is passed to most bsdtar internal
44 * functions.
45 */
46 struct bsdtar {
47 /* Options */
48 const char *filename; /* -f filename */
49 char *pending_chdir; /* -C dir */
50 const char *names_from_file; /* -T file */
51 int bytes_per_block; /* -b block_size */
52 int bytes_in_last_block; /* See -b handling. */
53 int verbose; /* -v */
54 unsigned int flags; /* Bitfield of boolean options */
55 int extract_flags; /* Flags for extract operation */
56 int readdisk_flags; /* Flags for read disk operation */
57 int strip_components; /* Remove this many leading dirs */
58 int gid; /* --gid */
59 const char *gname; /* --gname */
60 int uid; /* --uid */
61 const char *uname; /* --uname */
62 const char *passphrase; /* --passphrase */
63 char mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */
64 char symlink_mode; /* H or L, per BSD conventions */
65 const char *option_options; /* --options */
66 char day_first; /* show day before month in -tv output */
67 struct creation_set *cset;
68
69 /* Option parser state */
70 int getopt_state;
71 char *getopt_word;
72
73 /* If >= 0, then close this when done. */
74 int fd;
75
76 /* Miscellaneous state information */
77 int argc;
78 char **argv;
79 const char *argument;
80 size_t gs_width; /* For 'list_item' in read.c */
81 size_t u_width; /* for 'list_item' in read.c */
82 uid_t user_uid; /* UID running this program */
83 int return_value; /* Value returned by main() */
84 char warned_lead_slash; /* Already displayed warning */
85 char next_line_is_dir; /* Used for -C parsing in -cT */
86
87 /*
88 * Data for various subsystems. Full definitions are located in
89 * the file where they are used.
90 */
91 struct archive *diskreader; /* for write.c */
92 struct archive_entry_linkresolver *resolver; /* for write.c */
93 struct archive_dir *archive_dir; /* for write.c */
94 struct name_cache *gname_cache; /* for write.c */
95 char *buff; /* for write.c */
96 size_t buff_size; /* for write.c */
97 int first_fs; /* for write.c */
98 struct archive *matching; /* for matching.c */
99 struct security *security; /* for read.c */
100 struct name_cache *uname_cache; /* for write.c */
101 struct siginfo_data *siginfo; /* for siginfo.c */
102 struct substitution *substitution; /* for subst.c */
103 char *ppbuff; /* for util.c */
104 };
105
106 /* Options for flags bitfield */
107 #define OPTFLAG_AUTO_COMPRESS (0x00000001) /* -a */
108 #define OPTFLAG_ABSOLUTE_PATHS (0x00000002) /* -P */
109 #define OPTFLAG_CHROOT (0x00000004) /* --chroot */
110 #define OPTFLAG_FAST_READ (0x00000008) /* --fast-read */
111 #define OPTFLAG_IGNORE_ZEROS (0x00000010) /* --ignore-zeros */
112 #define OPTFLAG_INTERACTIVE (0x00000020) /* -w */
113 #define OPTFLAG_NO_OWNER (0x00000040) /* -o */
114 #define OPTFLAG_NO_SUBDIRS (0x00000080) /* -n */
115 #define OPTFLAG_NULL (0x00000100) /* --null */
116 #define OPTFLAG_NUMERIC_OWNER (0x00000200) /* --numeric-owner */
117 #define OPTFLAG_O (0x00000400) /* -o */
118 #define OPTFLAG_STDOUT (0x00000800) /* -O */
119 #define OPTFLAG_TOTALS (0x00001000) /* --totals */
120 #define OPTFLAG_UNLINK_FIRST (0x00002000) /* -U */
121 #define OPTFLAG_WARN_LINKS (0x00004000) /* --check-links */
122 #define OPTFLAG_NO_XATTRS (0x00008000) /* --no-xattrs */
123 #define OPTFLAG_XATTRS (0x00010000) /* --xattrs */
124 #define OPTFLAG_NO_ACLS (0x00020000) /* --no-acls */
125 #define OPTFLAG_ACLS (0x00040000) /* --acls */
126 #define OPTFLAG_NO_FFLAGS (0x00080000) /* --no-fflags */
127 #define OPTFLAG_FFLAGS (0x00100000) /* --fflags */
128 #define OPTFLAG_NO_MAC_METADATA (0x00200000) /* --no-mac-metadata */
129 #define OPTFLAG_MAC_METADATA (0x00400000) /* --mac-metadata */
130 #define OPTFLAG_NO_READ_SPARSE (0x00800000) /* --no-read-sparse */
131 #define OPTFLAG_READ_SPARSE (0x01000000) /* --read-sparse */
132
133 /* Fake short equivalents for long options that otherwise lack them. */
134 enum {
135 OPTION_ACLS = 1,
136 OPTION_B64ENCODE,
137 OPTION_CHECK_LINKS,
138 OPTION_CHROOT,
139 OPTION_CLEAR_NOCHANGE_FFLAGS,
140 OPTION_EXCLUDE,
141 OPTION_EXCLUDE_VCS,
142 OPTION_FFLAGS,
143 OPTION_FORMAT,
144 OPTION_GID,
145 OPTION_GNAME,
146 OPTION_GROUP,
147 OPTION_GRZIP,
148 OPTION_HELP,
149 OPTION_HFS_COMPRESSION,
150 OPTION_IGNORE_ZEROS,
151 OPTION_INCLUDE,
152 OPTION_KEEP_NEWER_FILES,
153 OPTION_LRZIP,
154 OPTION_LZ4,
155 OPTION_LZIP,
156 OPTION_LZMA,
157 OPTION_LZOP,
158 OPTION_MAC_METADATA,
159 OPTION_NEWER_CTIME,
160 OPTION_NEWER_CTIME_THAN,
161 OPTION_NEWER_MTIME,
162 OPTION_NEWER_MTIME_THAN,
163 OPTION_NODUMP,
164 OPTION_NOPRESERVE_HFS_COMPRESSION,
165 OPTION_NO_ACLS,
166 OPTION_NO_FFLAGS,
167 OPTION_NO_MAC_METADATA,
168 OPTION_NO_READ_SPARSE,
169 OPTION_NO_SAFE_WRITES,
170 OPTION_NO_SAME_OWNER,
171 OPTION_NO_SAME_PERMISSIONS,
172 OPTION_NO_XATTRS,
173 OPTION_NULL,
174 OPTION_NUMERIC_OWNER,
175 OPTION_OLDER_CTIME,
176 OPTION_OLDER_CTIME_THAN,
177 OPTION_OLDER_MTIME,
178 OPTION_OLDER_MTIME_THAN,
179 OPTION_ONE_FILE_SYSTEM,
180 OPTION_OPTIONS,
181 OPTION_OWNER,
182 OPTION_PASSPHRASE,
183 OPTION_POSIX,
184 OPTION_READ_SPARSE,
185 OPTION_SAFE_WRITES,
186 OPTION_SAME_OWNER,
187 OPTION_STRIP_COMPONENTS,
188 OPTION_TOTALS,
189 OPTION_UID,
190 OPTION_UNAME,
191 OPTION_USE_COMPRESS_PROGRAM,
192 OPTION_UUENCODE,
193 OPTION_VERSION,
194 OPTION_XATTRS,
195 OPTION_ZSTD,
196 };
197
198 int bsdtar_getopt(struct bsdtar *);
199 void do_chdir(struct bsdtar *);
200 int edit_pathname(struct bsdtar *, struct archive_entry *);
201 int need_report(void);
202 int pathcmp(const char *a, const char *b);
203 void safe_fprintf(FILE *, const char *fmt, ...) __LA_PRINTF(2, 3);
204 void set_chdir(struct bsdtar *, const char *newdir);
205 const char *tar_i64toa(int64_t);
206 void tar_mode_c(struct bsdtar *bsdtar);
207 void tar_mode_r(struct bsdtar *bsdtar);
208 void tar_mode_t(struct bsdtar *bsdtar);
209 void tar_mode_u(struct bsdtar *bsdtar);
210 void tar_mode_x(struct bsdtar *bsdtar);
211 __LA_NORETURN void usage(void);
212 int yes(const char *fmt, ...) __LA_PRINTF(1, 2);
213
214 #if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H)
215 void add_substitution(struct bsdtar *, const char *);
216 int apply_substitution(struct bsdtar *, const char *, char **, int, int);
217 void cleanup_substitution(struct bsdtar *);
218 #endif
219
220 void cset_add_filter(struct creation_set *, const char *);
221 void cset_add_filter_program(struct creation_set *, const char *);
222 int cset_auto_compress(struct creation_set *, const char *);
223 void cset_free(struct creation_set *);
224 const char * cset_get_format(struct creation_set *);
225 struct creation_set *cset_new(void);
226 int cset_read_support_filter_program(struct creation_set *,
227 struct archive *);
228 void cset_set_format(struct creation_set *, const char *);
229 int cset_write_add_filters(struct creation_set *,
230 struct archive *, const void **);
231
232 const char * passphrase_callback(struct archive *, void *);
233 void passphrase_free(char *);
234 void list_item_verbose(struct bsdtar *, FILE *,
235 struct archive_entry *);
236
237 #endif
238