1 /* Common declarations for the tar program.
3 Copyright 1988, 1992-1994, 1996-1997, 1999-2010, 2012-2016 Free
4 Software Foundation, Inc.
6 This file is part of GNU tar.
8 GNU tar is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 GNU tar is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 /* Declare the GNU tar archive format. */
24 /* The checksum field is filled with this while the checksum is computed. */
25 #define CHKBLANKS " " /* 8 blanks, no null */
27 /* Some constants from POSIX are given names. */
28 #define NAME_FIELD_SIZE 100
29 #define PREFIX_FIELD_SIZE 155
30 #define UNAME_FIELD_SIZE 32
31 #define GNAME_FIELD_SIZE 32
35 /* Some various global definitions. */
37 /* Name of file to use for interacting with user. */
39 /* GLOBAL is defined to empty in tar.c only, and left alone in other *.c
40 modules. Here, we merely set it to "extern" if it is not already set.
41 GNU tar does depend on the system loader to preset all GLOBAL variables to
42 neutral (or zero) values, explicit initialization is usually not done. */
44 # define GLOBAL extern
47 #define TAREXIT_SUCCESS PAXEXIT_SUCCESS
48 #define TAREXIT_DIFFERS PAXEXIT_DIFFERS
49 #define TAREXIT_FAILURE PAXEXIT_FAILURE
53 #include <backupfile.h>
55 #include <full-write.h>
56 #include <modechange.h>
58 #include <safe-read.h>
59 #include <stat-time.h>
61 #define obstack_chunk_alloc xmalloc
62 #define obstack_chunk_free free
65 #include <xvasprintf.h>
69 /* Log base 2 of common values. */
74 _GL_INLINE_HEADER_BEGIN
76 # define COMMON_INLINE _GL_INLINE
79 /* Information gleaned from the command line. */
81 /* Main command option. */
85 UNKNOWN_SUBCOMMAND, /* none of the following */
86 APPEND_SUBCOMMAND, /* -r */
87 CAT_SUBCOMMAND, /* -A */
88 CREATE_SUBCOMMAND, /* -c */
89 DELETE_SUBCOMMAND, /* -D */
90 DIFF_SUBCOMMAND, /* -d */
91 EXTRACT_SUBCOMMAND, /* -x */
92 LIST_SUBCOMMAND, /* -t */
93 UPDATE_SUBCOMMAND, /* -u */
94 TEST_LABEL_SUBCOMMAND, /* --test-label */
97 GLOBAL enum subcommand subcommand_option;
99 /* Selected format for output archive. */
100 GLOBAL enum archive_format archive_format;
102 /* Size of each record, once in blocks, once in bytes. Those two variables
103 are always related, the second being BLOCKSIZE times the first. They do
104 not have _option in their name, even if their values is derived from
105 option decoding, as these are especially important in tar. */
106 GLOBAL int blocking_factor;
107 GLOBAL size_t record_size;
109 GLOBAL bool absolute_names_option;
111 /* Display file times in UTC */
112 GLOBAL bool utc_option;
113 /* Output file timestamps to the full resolution */
114 GLOBAL bool full_time_option;
116 /* This variable tells how to interpret newer_mtime_option, below. If zero,
117 files get archived if their mtime is not less than newer_mtime_option.
118 If nonzero, files get archived if *either* their ctime or mtime is not less
119 than newer_mtime_option. */
120 GLOBAL int after_date_option;
125 replace_atime_preserve,
126 system_atime_preserve
128 GLOBAL enum atime_preserve atime_preserve_option;
130 GLOBAL bool backup_option;
132 /* Type of backups being made. */
133 GLOBAL enum backup_type backup_type;
135 GLOBAL bool block_number_option;
137 GLOBAL unsigned checkpoint_option;
138 #define DEFAULT_CHECKPOINT 10
140 /* Specified name of compression program, or "gzip" as implied by -z. */
141 GLOBAL const char *use_compress_program_option;
143 GLOBAL bool dereference_option;
144 GLOBAL bool hard_dereference_option;
146 /* Patterns that match file names to be excluded. */
147 GLOBAL struct exclude *excluded;
149 enum exclusion_tag_type
152 /* Exclude the directory contents, but preserve the directory
153 itself and the exclusion tag file */
154 exclusion_tag_contents,
155 /* Exclude everything below the directory, preserving the directory
158 /* Exclude entire directory */
162 /* Specified value to be put into tar file in place of stat () results, or
163 just null and -1 if such an override should not take place. */
164 GLOBAL char const *group_name_option;
165 GLOBAL gid_t group_option;
167 GLOBAL bool ignore_failed_read_option;
169 GLOBAL bool ignore_zeros_option;
171 GLOBAL bool incremental_option;
173 /* Specified name of script to run at end of each tape change. */
174 GLOBAL const char *info_script_option;
176 GLOBAL bool interactive_option;
178 /* If nonzero, extract only Nth occurrence of each named file */
179 GLOBAL uintmax_t occurrence_option;
183 DEFAULT_OLD_FILES, /* default */
184 NO_OVERWRITE_DIR_OLD_FILES, /* --no-overwrite-dir */
185 OVERWRITE_OLD_FILES, /* --overwrite */
186 UNLINK_FIRST_OLD_FILES, /* --unlink-first */
187 KEEP_OLD_FILES, /* --keep-old-files */
188 SKIP_OLD_FILES, /* --skip-old-files */
189 KEEP_NEWER_FILES /* --keep-newer-files */
191 GLOBAL enum old_files old_files_option;
193 GLOBAL bool keep_directory_symlink_option;
195 /* Specified file name for incremental list. */
196 GLOBAL const char *listed_incremental_option;
197 /* Incremental dump level */
198 GLOBAL int incremental_level;
199 /* Check device numbers when doing incremental dumps. */
200 GLOBAL bool check_device_option;
202 /* Specified mode change string. */
203 GLOBAL struct mode_change *mode_option;
205 /* Initial umask, if needed for mode change string. */
206 GLOBAL mode_t initial_umask;
208 GLOBAL bool multi_volume_option;
210 /* Specified threshold date and time. Files having an older time stamp
211 do not get archived (also see after_date_option above). */
212 GLOBAL struct timespec newer_mtime_option;
214 enum set_mtime_option_mode
221 /* Override actual mtime if set to FORCE_MTIME or CLAMP_MTIME */
222 GLOBAL enum set_mtime_option_mode set_mtime_option;
223 /* Value to use when forcing or clamping the mtime header field. */
224 GLOBAL struct timespec mtime_option;
226 /* Return true if mtime_option or newer_mtime_option is initialized. */
227 #define TIME_OPTION_INITIALIZED(opt) (0 <= (opt).tv_nsec)
229 /* Return true if the struct stat ST's M time is less than
230 newer_mtime_option. */
231 #define OLDER_STAT_TIME(st, m) \
232 (timespec_cmp (get_stat_##m##time (&(st)), newer_mtime_option) < 0)
234 /* Likewise, for struct tar_stat_info ST. */
235 #define OLDER_TAR_STAT_TIME(st, m) \
236 (timespec_cmp ((st).m##time, newer_mtime_option) < 0)
238 /* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */
239 GLOBAL int recursion_option;
241 GLOBAL bool numeric_owner_option;
243 GLOBAL bool one_file_system_option;
245 /* Create a top-level directory for extracting based on the archive name. */
246 GLOBAL bool one_top_level_option;
247 GLOBAL char *one_top_level_dir;
249 /* Specified value to be put into tar file in place of stat () results, or
250 just null and -1 if such an override should not take place. */
251 GLOBAL char const *owner_name_option;
252 GLOBAL uid_t owner_option;
254 GLOBAL bool recursive_unlink_option;
256 GLOBAL bool read_full_records_option;
258 GLOBAL bool remove_files_option;
260 /* Specified remote shell command. */
261 GLOBAL const char *rsh_command_option;
263 GLOBAL bool same_order_option;
265 /* If positive, preserve ownership when extracting. */
266 GLOBAL int same_owner_option;
268 /* If positive, preserve permissions when extracting. */
269 GLOBAL int same_permissions_option;
271 /* If positive, save the SELinux context. */
272 GLOBAL int selinux_context_option;
274 /* If positive, save the ACLs. */
275 GLOBAL int acls_option;
277 /* If positive, save the user and root xattrs. */
278 GLOBAL int xattrs_option;
280 /* When set, strip the given number of file name components from the file name
282 GLOBAL size_t strip_name_components;
284 GLOBAL bool show_omitted_dirs_option;
286 GLOBAL bool sparse_option;
287 GLOBAL unsigned tar_sparse_major;
288 GLOBAL unsigned tar_sparse_minor;
290 enum hole_detection_method
292 HOLE_DETECTION_DEFAULT,
297 GLOBAL enum hole_detection_method hole_detection;
299 GLOBAL bool starting_file_option;
301 /* Specified maximum byte length of each tape volume (multiple of 1024). */
302 GLOBAL tarlong tape_length_option;
304 GLOBAL bool to_stdout_option;
306 GLOBAL bool totals_option;
308 GLOBAL bool touch_option;
310 GLOBAL char *to_command_option;
311 GLOBAL bool ignore_command_error_option;
313 /* Restrict some potentially harmful tar options */
314 GLOBAL bool restrict_option;
316 /* Return true if the extracted files are not being written to disk */
317 #define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option)
319 /* Count how many times the option has been set, multiple setting yields
320 more verbose behavior. Value 0 means no verbosity, 1 means file name
321 only, 2 means file name and all attributes. More than 2 is just like 2. */
322 GLOBAL int verbose_option;
324 GLOBAL bool verify_option;
326 /* Specified name of file containing the volume number. */
327 GLOBAL const char *volno_file_option;
329 /* Specified value or pattern. */
330 GLOBAL const char *volume_label_option;
332 /* Other global variables. */
334 /* File descriptor for archive file. */
337 /* Nonzero when outputting to /dev/null. */
338 GLOBAL bool dev_null_output;
341 GLOBAL struct timespec start_time; /* when we started execution */
342 GLOBAL struct timespec volume_start_time; /* when the current volume was
344 GLOBAL struct timespec last_stat_time; /* when the statistics was last
347 GLOBAL struct tar_stat_info current_stat_info;
349 /* List of tape drive names, number of such tape drives,
350 and current cursor in list. */
351 GLOBAL const char **archive_name_array;
352 GLOBAL size_t archive_names;
353 GLOBAL const char **archive_name_cursor;
355 /* Output index file name. */
356 GLOBAL char const *index_file_name;
358 /* Opaque structure for keeping directory meta-data */
361 /* Structure for keeping track of filenames and lists thereof. */
364 struct name *next; /* Link to the next element */
365 struct name *prev; /* Link to the previous element */
367 char *name; /* File name or globbing pattern */
368 size_t length; /* cached strlen (name) */
369 int matching_flags; /* wildcard flags if name is a pattern */
370 bool cmdline; /* true if this name was given in the
373 int change_dir; /* Number of the directory to change to.
374 Set with the -C option. */
375 uintmax_t found_count; /* number of times a matching file has
378 /* The following members are used for incremental dumps only,
379 if this struct name represents a directory;
381 struct directory *directory;/* directory meta-data and contents */
382 struct name *parent; /* pointer to the parent hierarchy */
383 struct name *child; /* pointer to the first child */
384 struct name *sibling; /* pointer to the next sibling */
385 char *caname; /* canonical name */
388 /* Obnoxious test to see if dimwit is trying to dump the archive. */
392 /* Flags for reading, searching, and fstatatting files. */
393 GLOBAL int open_read_flags;
394 GLOBAL int open_searchdir_flags;
395 GLOBAL int fstatat_flags;
397 GLOBAL int seek_option;
398 GLOBAL bool seekable_archive;
400 GLOBAL dev_t root_device;
402 /* Unquote filenames */
403 GLOBAL bool unquote_option;
405 GLOBAL int savedir_sort_order;
407 /* Show file or archive names after transformation.
408 In particular, when creating archive in verbose mode, list member names
409 as stored in the archive */
410 GLOBAL bool show_transformed_names_option;
412 /* Delay setting modification times and permissions of extracted directories
413 until the end of extraction. This variable helps correctly restore directory
414 timestamps from archives with an unusual member order. It is automatically
415 set for incremental archives. */
416 GLOBAL bool delay_directory_restore_option;
418 /* When set, tar will not refuse to create empty archives */
419 GLOBAL bool files_from_option;
421 /* Declarations for each module. */
423 /* FIXME: compare.c should not directly handle the following variable,
424 instead, this should be done in buffer.c only. */
432 extern enum access_mode access_mode;
434 /* Module buffer.c. */
437 extern bool write_archive_to_stdout;
438 extern char *volume_label;
439 extern size_t volume_label_count;
440 extern char *continued_file_name;
441 extern uintmax_t continued_file_size;
442 extern uintmax_t continued_file_offset;
443 extern off_t records_written;
445 char *drop_volume_label_suffix (const char *label);
447 size_t available_space_after (union block *pointer);
448 off_t current_block_ordinal (void);
449 void close_archive (void);
450 void closeout_volume_number (void);
451 double compute_duration (void);
452 union block *find_next_block (void);
453 void flush_read (void);
454 void flush_write (void);
455 void flush_archive (void);
456 void init_volume_number (void);
457 void open_archive (enum access_mode mode);
458 void print_total_stats (void);
459 void reset_eof (void);
460 void set_next_block_after (union block *block);
461 void clear_read_error_count (void);
462 void xclose (int fd);
463 void archive_write_error (ssize_t status) __attribute__ ((noreturn));
464 void archive_read_error (void);
465 off_t seek_archive (off_t size);
466 void set_start_time (void);
471 int format_total_stats (FILE *fp, char const *const *formats, int eor, int eol);
472 void print_total_stats (void);
474 void mv_begin_write (const char *file_name, off_t totsize, off_t sizeleft);
476 void mv_begin_read (struct tar_stat_info *st);
478 void mv_size_left (off_t size);
480 void buffer_write_global_xheader (void);
482 const char *first_decompress_program (int *pstate);
483 const char *next_decompress_program (int *pstate);
485 /* Module create.c. */
492 dump_status_not_implemented
495 void add_exclusion_tag (const char *name, enum exclusion_tag_type type,
496 bool (*predicate) (int));
497 bool cachedir_file_p (int fd);
498 char *get_directory_entries (struct tar_stat_info *st);
500 void create_archive (void);
501 void pad_archive (off_t size_left);
502 void dump_file (struct tar_stat_info *parent, char const *name,
503 char const *fullname);
504 union block *start_header (struct tar_stat_info *st);
505 void finish_header (struct tar_stat_info *st, union block *header,
506 off_t block_ordinal);
507 void simple_finish_header (union block *header);
508 union block * write_extended (bool global, struct tar_stat_info *st,
509 union block *old_header);
510 union block *start_private_header (const char *name, size_t size, time_t t);
511 void write_eot (void);
512 void check_links (void);
513 int subfile_open (struct tar_stat_info const *dir, char const *file, int flags);
514 void restore_parent_fd (struct tar_stat_info const *st);
515 void exclusion_tag_warning (const char *dirname, const char *tagname,
516 const char *message);
517 enum exclusion_tag_type check_exclusion_tags (struct tar_stat_info const *st,
518 const char **tag_file_name);
520 #define OFF_TO_CHARS(val, where) off_to_chars (val, where, sizeof (where))
521 #define TIME_TO_CHARS(val, where) time_to_chars (val, where, sizeof (where))
523 bool off_to_chars (off_t off, char *buf, size_t size);
524 bool time_to_chars (time_t t, char *buf, size_t size);
526 /* Module diffarch.c. */
528 extern bool now_verifying;
530 void diff_archive (void);
531 void diff_init (void);
532 void verify_volume (void);
534 /* Module extract.c. */
536 void extr_init (void);
537 void extract_archive (void);
538 void extract_finish (void);
539 bool rename_directory (char *src, char *dst);
541 void remove_delayed_set_stat (const char *fname);
543 /* Module delete.c. */
545 void delete_archive_members (void);
547 /* Module incremen.c. */
549 struct directory *scan_directory (struct tar_stat_info *st);
550 const char *directory_contents (struct directory *dir);
551 const char *safe_directory_contents (struct directory *dir);
553 void rebase_directory (struct directory *dir,
554 const char *samp, size_t slen,
555 const char *repl, size_t rlen);
557 void append_incremental_renames (struct directory *dir);
558 void show_snapshot_field_ranges (void);
559 void read_directory_file (void);
560 void write_directory_file (void);
561 void purge_directory (char const *directory_name);
562 void list_dumpdir (char *buffer, size_t size);
563 void update_parent_directory (struct tar_stat_info *st);
565 size_t dumpdir_size (const char *p);
566 bool is_dumpdir (struct tar_stat_info *stat_info);
567 void clear_directory_table (void);
573 HEADER_STILL_UNREAD, /* for when read_header has not been called */
574 HEADER_SUCCESS, /* header successfully read and checksummed */
575 HEADER_SUCCESS_EXTENDED, /* likewise, but we got an extended header */
576 HEADER_ZERO_BLOCK, /* zero block where header expected */
577 HEADER_END_OF_FILE, /* true end of file while header expected */
578 HEADER_FAILURE /* ill-formed header, or bad checksum */
581 /* Operation mode for read_header: */
583 enum read_header_mode
585 read_header_auto, /* process extended headers automatically */
586 read_header_x_raw, /* return raw extended headers (return
587 HEADER_SUCCESS_EXTENDED) */
588 read_header_x_global /* when POSIX global extended header is read,
590 HEADER_SUCCESS_EXTENDED */
592 extern union block *current_header;
593 extern enum archive_format current_format;
594 extern size_t recent_long_name_blocks;
595 extern size_t recent_long_link_blocks;
597 void decode_header (union block *header, struct tar_stat_info *stat_info,
598 enum archive_format *format_pointer, int do_user_group);
599 void transform_stat_info (int typeflag, struct tar_stat_info *stat_info);
600 char const *tartime (struct timespec t, bool full_time);
602 #define OFF_FROM_HEADER(where) off_from_header (where, sizeof (where))
603 #define UINTMAX_FROM_HEADER(where) uintmax_from_header (where, sizeof (where))
605 off_t off_from_header (const char *buf, size_t size);
606 uintmax_t uintmax_from_header (const char *buf, size_t size);
608 void list_archive (void);
609 void test_archive_label (void);
610 void print_for_mkdir (char *dirname, int length, mode_t mode);
611 void print_header (struct tar_stat_info *st, union block *blk,
612 off_t block_ordinal);
613 void read_and (void (*do_something) (void));
614 enum read_header read_header (union block **return_block,
615 struct tar_stat_info *info,
616 enum read_header_mode m);
617 enum read_header tar_checksum (union block *header, bool silent);
618 void skip_file (off_t size);
619 void skip_member (void);
623 #define min(a, b) ((a) < (b) ? (a) : (b))
624 #define max(a, b) ((a) < (b) ? (b) : (a))
625 void assign_string (char **dest, const char *src);
626 int unquote_string (char *str);
627 char *zap_slashes (char *name);
628 char *normalize_filename (int cdidx, const char *name);
629 void normalize_filename_x (char *name);
630 void replace_prefix (char **pname, const char *samp, size_t slen,
631 const char *repl, size_t rlen);
632 char *tar_savedir (const char *name, int must_exist);
634 typedef struct namebuf *namebuf_t;
635 namebuf_t namebuf_create (const char *dir);
636 void namebuf_free (namebuf_t buf);
637 char *namebuf_name (namebuf_t buf, const char *name);
639 const char *tar_dirname (void);
641 /* Represent N using a signed integer I such that (uintmax_t) I == N.
642 With a good optimizing compiler, this is equivalent to (intmax_t) i
643 and requires zero machine instructions. */
644 #if ! (UINTMAX_MAX / 2 <= INTMAX_MAX)
645 # error "represent_uintmax returns intmax_t to represent uintmax_t"
647 COMMON_INLINE intmax_t
648 represent_uintmax (uintmax_t n)
654 /* Avoid signed integer overflow on picky platforms. */
655 intmax_t nd = n - INTMAX_MIN;
656 return nd + INTMAX_MIN;
660 enum { SYSINT_BUFSIZE =
661 max (UINTMAX_STRSIZE_BOUND, INT_BUFSIZE_BOUND (intmax_t)) };
662 char *sysinttostr (uintmax_t, intmax_t, uintmax_t, char buf[SYSINT_BUFSIZE]);
663 intmax_t strtosysint (char const *, char **, intmax_t, uintmax_t);
664 void code_ns_fraction (int ns, char *p);
665 char const *code_timespec (struct timespec ts, char *sbuf);
666 enum { BILLION = 1000000000, LOG10_BILLION = 9 };
667 enum { TIMESPEC_STRSIZE_BOUND =
668 UINTMAX_STRSIZE_BOUND + LOG10_BILLION + sizeof "-." - 1 };
669 struct timespec decode_timespec (char const *, char **, bool);
671 /* Return true if T does not represent an out-of-range or invalid value. */
673 valid_timespec (struct timespec t)
675 return 0 <= t.tv_nsec;
678 bool must_be_dot_or_slash (char const *);
682 ORDINARY_REMOVE_OPTION,
683 RECURSIVE_REMOVE_OPTION,
685 /* FIXME: The following value is never used. It seems to be intended
686 as a placeholder for a hypothetical option that should instruct tar
687 to recursively remove subdirectories in purge_directory(),
688 as opposed to the functionality of --recursive-unlink
689 (RECURSIVE_REMOVE_OPTION value), which removes them in
690 prepare_to_extract() phase. However, with the addition of more
691 meta-info to the incremental dumps, this should become unnecessary */
692 WANT_DIRECTORY_REMOVE_OPTION
694 int remove_any_file (const char *file_name, enum remove_option option);
695 bool maybe_backup_file (const char *file_name, bool this_is_the_archive);
696 void undo_last_backup (void);
698 int deref_stat (char const *name, struct stat *buf);
700 size_t blocking_read (int fd, void *buf, size_t count);
701 size_t blocking_write (int fd, void const *buf, size_t count);
703 extern int chdir_current;
705 int chdir_arg (char const *dir);
706 void chdir_do (int dir);
707 int chdir_count (void);
709 void close_diag (char const *name);
710 void open_diag (char const *name);
711 void read_diag_details (char const *name, off_t offset, size_t size);
712 void readlink_diag (char const *name);
713 void savedir_diag (char const *name);
714 void seek_diag_details (char const *name, off_t offset);
715 void stat_diag (char const *name);
716 void file_removed_diag (const char *name, bool top_level,
717 void (*diagfn) (char const *name));
718 void write_error_details (char const *name, size_t status, size_t size);
719 void write_fatal (char const *name) __attribute__ ((noreturn));
720 void write_fatal_details (char const *name, ssize_t status, size_t size)
721 __attribute__ ((noreturn));
724 void xpipe (int fd[2]);
726 void *page_aligned_alloc (void **ptr, size_t size);
727 int set_file_atime (int fd, int parentfd, char const *file,
728 struct timespec atime);
730 /* Module names.c. */
732 extern size_t name_count;
733 extern struct name *gnu_list_name;
735 void gid_to_gname (gid_t gid, char **gname);
736 int gname_to_gid (char const *gname, gid_t *pgid);
737 void uid_to_uname (uid_t uid, char **uname);
738 int uname_to_uid (char const *uname, uid_t *puid);
740 void name_init (void);
741 void name_add_name (const char *name);
742 void name_term (void);
743 const char *name_next (int change_dirs);
744 void name_gather (void);
745 struct name *addname (char const *string, int change_dir,
746 bool cmdline, struct name *parent);
747 void remname (struct name *name);
748 bool name_match (const char *name);
749 void names_notfound (void);
750 void label_notfound (void);
751 void collect_and_sort_names (void);
752 struct name *name_scan (const char *name);
753 struct name const *name_from_list (void);
754 void blank_name_list (void);
755 char *make_file_name (const char *dir_name, const char *name);
756 size_t stripped_prefix_len (char const *file_name, size_t num);
757 bool all_names_found (struct tar_stat_info *st);
759 void add_avoided_name (char const *name);
760 bool is_avoided_name (char const *name);
762 bool contains_dot_dot (char const *name);
764 #define ISFOUND(c) (occurrence_option == 0 \
765 ? (c)->found_count != 0 \
766 : (c)->found_count == occurrence_option)
767 #define WASFOUND(c) (occurrence_option == 0 \
768 ? (c)->found_count != 0 \
769 : (c)->found_count >= occurrence_option)
775 int confirm (const char *message_action, const char *name);
777 void tar_stat_init (struct tar_stat_info *st);
778 bool tar_stat_close (struct tar_stat_info *st);
779 void tar_stat_destroy (struct tar_stat_info *st);
780 void usage (int) __attribute__ ((noreturn));
781 int tar_timespec_cmp (struct timespec a, struct timespec b);
782 const char *archive_format_string (enum archive_format fmt);
783 const char *subcommand_string (enum subcommand c);
784 void set_exit_status (int val);
786 void request_stdin (const char *option);
788 /* Where an option comes from: */
791 OPTS_ENVIRON, /* Environment variable TAR_OPTIONS */
792 OPTS_COMMAND_LINE, /* Command line */
793 OPTS_FILE /* File supplied by --files-from */
796 /* Option location */
799 enum option_source source; /* Option origin */
800 char const *name; /* File or variable name */
801 size_t line; /* Number of input line if source is OPTS_FILE */
802 struct option_locus *prev; /* Previous occurrence of the option of same
806 void more_options (int argc, char **argv, struct option_locus *loc);
808 /* Module update.c. */
810 extern char *output_start;
812 void update_archive (void);
814 /* Module attrs.c. */
817 /* Module xheader.c. */
819 void xheader_decode (struct tar_stat_info *stat);
820 void xheader_decode_global (struct xheader *xhdr);
821 void xheader_store (char const *keyword, struct tar_stat_info *st,
823 void xheader_read (struct xheader *xhdr, union block *header, off_t size);
824 void xheader_write (char type, char *name, time_t t, struct xheader *xhdr);
825 void xheader_write_global (struct xheader *xhdr);
826 void xheader_finish (struct xheader *hdr);
827 void xheader_destroy (struct xheader *hdr);
828 char *xheader_xhdr_name (struct tar_stat_info *st);
829 char *xheader_ghdr_name (void);
830 void xheader_set_option (char *string);
831 void xheader_string_begin (struct xheader *xhdr);
832 void xheader_string_add (struct xheader *xhdr, char const *s);
833 bool xheader_string_end (struct xheader *xhdr, char const *keyword);
834 bool xheader_keyword_deleted_p (const char *kw);
835 char *xheader_format_name (struct tar_stat_info *st, const char *fmt,
837 void xheader_xattr_init (struct tar_stat_info *st);
838 void xheader_xattr_free (struct xattr_array *vals, size_t sz);
839 void xheader_xattr_copy (const struct tar_stat_info *st,
840 struct xattr_array **vals, size_t *sz);
841 void xheader_xattr_add (struct tar_stat_info *st,
842 const char *key, const char *val, size_t len);
844 /* Module system.c */
846 void sys_detect_dev_null_output (void);
847 void sys_save_archive_dev_ino (void);
848 void sys_wait_for_child (pid_t, bool);
849 void sys_spawn_shell (void);
850 bool sys_compare_uid (struct stat *a, struct stat *b);
851 bool sys_compare_gid (struct stat *a, struct stat *b);
852 bool sys_file_is_archive (struct tar_stat_info *p);
853 bool sys_compare_links (struct stat *link_data, struct stat *stat_data);
854 int sys_truncate (int fd);
855 pid_t sys_child_open_for_compress (void);
856 pid_t sys_child_open_for_uncompress (void);
857 size_t sys_write_archive_buffer (void);
858 bool sys_get_archive_stat (void);
859 int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st);
860 void sys_wait_command (void);
861 int sys_exec_info_script (const char **archive_name, int volume_number);
862 void sys_exec_checkpoint_script (const char *script_name,
863 const char *archive_name,
864 int checkpoint_number);
866 /* Module compare.c */
867 void report_difference (struct tar_stat_info *st, const char *message, ...)
868 __attribute__ ((format (printf, 2, 3)));
870 /* Module sparse.c */
871 bool sparse_member_p (struct tar_stat_info *st);
872 bool sparse_fixup_header (struct tar_stat_info *st);
873 enum dump_status sparse_dump_file (int, struct tar_stat_info *st);
874 enum dump_status sparse_extract_file (int fd, struct tar_stat_info *st,
876 enum dump_status sparse_skip_file (struct tar_stat_info *st);
877 bool sparse_diff_file (int, struct tar_stat_info *st);
880 bool string_ascii_p (const char *str);
881 bool utf8_convert (bool to_utf, char const *input, char **output);
883 /* Module transform.c */
884 #define XFORM_REGFILE 0x01
885 #define XFORM_LINK 0x02
886 #define XFORM_SYMLINK 0x04
887 #define XFORM_ALL (XFORM_REGFILE|XFORM_LINK|XFORM_SYMLINK)
889 void set_transform_expr (const char *expr);
890 bool transform_name (char **pinput, int type);
891 bool transform_name_fp (char **pinput, int type,
892 char *(*fun)(char *, void *), void *);
893 bool transform_program_p (void);
895 /* Module suffix.c */
896 void set_compression_program_by_suffix (const char *name, const char *defprog);
897 char *strip_compression_suffix (const char *name);
899 /* Module checkpoint.c */
900 void checkpoint_compile_action (const char *str);
901 void checkpoint_finish_compile (void);
902 void checkpoint_run (bool do_write);
903 void checkpoint_finish (void);
904 void checkpoint_flush_actions (void);
906 /* Module warning.c */
907 #define WARN_ALONE_ZERO_BLOCK 0x00000001
908 #define WARN_BAD_DUMPDIR 0x00000002
909 #define WARN_CACHEDIR 0x00000004
910 #define WARN_CONTIGUOUS_CAST 0x00000008
911 #define WARN_FILE_CHANGED 0x00000010
912 #define WARN_FILE_IGNORED 0x00000020
913 #define WARN_FILE_REMOVED 0x00000040
914 #define WARN_FILE_SHRANK 0x00000080
915 #define WARN_FILE_UNCHANGED 0x00000100
916 #define WARN_FILENAME_WITH_NULS 0x00000200
917 #define WARN_IGNORE_ARCHIVE 0x00000400
918 #define WARN_IGNORE_NEWER 0x00000800
919 #define WARN_NEW_DIRECTORY 0x00001000
920 #define WARN_RENAME_DIRECTORY 0x00002000
921 #define WARN_SYMLINK_CAST 0x00004000
922 #define WARN_TIMESTAMP 0x00008000
923 #define WARN_UNKNOWN_CAST 0x00010000
924 #define WARN_UNKNOWN_KEYWORD 0x00020000
925 #define WARN_XDEV 0x00040000
926 #define WARN_DECOMPRESS_PROGRAM 0x00080000
927 #define WARN_EXISTING_FILE 0x00100000
928 #define WARN_XATTR_WRITE 0x00200000
929 #define WARN_RECORD_SIZE 0x00400000
931 /* These warnings are enabled by default in verbose mode: */
932 #define WARN_VERBOSE_WARNINGS (WARN_RENAME_DIRECTORY|WARN_NEW_DIRECTORY|\
933 WARN_DECOMPRESS_PROGRAM|WARN_EXISTING_FILE|\
935 #define WARN_ALL (~WARN_VERBOSE_WARNINGS)
937 void set_warning_option (const char *arg);
939 extern int warning_option;
941 #define WARNOPT(opt,args) \
944 if (warning_option & opt) WARN (args); \
948 /* Module unlink.c */
950 void queue_deferred_unlink (const char *name, bool is_dir);
951 void finish_deferred_unlinks (void);
954 extern void (*fatal_exit_hook) (void);
956 /* Module exclist.c */
957 #define EXCL_DEFAULT 0x00
958 #define EXCL_RECURSIVE 0x01
959 #define EXCL_NON_RECURSIVE 0x02
961 void excfile_add (const char *name, int flags);
962 void info_attach_exclist (struct tar_stat_info *dir);
963 void info_free_exclist (struct tar_stat_info *dir);
964 bool excluded_name (char const *name, struct tar_stat_info *st);
965 void exclude_vcs_ignores (void);
968 void owner_map_read (char const *name);
969 int owner_map_translate (uid_t uid, uid_t *new_uid, char const **new_name);
970 void group_map_read (char const *file);
971 int group_map_translate (gid_t gid, gid_t *new_gid, char const **new_name);
974 _GL_INLINE_HEADER_END