1/* Common declarations for the tar program. 2 3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, 4 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. 5 6 This program is free software; you can redistribute it and/or modify it 7 under the terms of the GNU General Public License as published by the 8 Free Software Foundation; either version 2, or (at your option) any later 9 version. 10 11 This program is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 14 Public License for more details. 15 16 You should have received a copy of the GNU General Public License along 17 with this program; if not, write to the Free Software Foundation, Inc., 18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19 20/* Declare the GNU tar archive format. */ 21#include "tar.h" 22 23#include <TargetConditionals.h> 24#if defined(__has_include) && __has_include(<quarantine.h>) 25#define HAVE_QUARANTINE 1 26#else 27#define HAVE_QUARANTINE 0 28#endif 29 30#if HAVE_QUARANTINE 31#include <quarantine.h> 32#endif 33 34/* The checksum field is filled with this while the checksum is computed. */ 35#define CHKBLANKS " " /* 8 blanks, no null */ 36 37/* Some constants from POSIX are given names. */ 38#define NAME_FIELD_SIZE 100 39#define PREFIX_FIELD_SIZE 155 40#define UNAME_FIELD_SIZE 32 41#define GNAME_FIELD_SIZE 32 42 43 44 45/* Some various global definitions. */ 46 47/* Name of file to use for interacting with user. */ 48 49/* GLOBAL is defined to empty in tar.c only, and left alone in other *.c 50 modules. Here, we merely set it to "extern" if it is not already set. 51 GNU tar does depend on the system loader to preset all GLOBAL variables to 52 neutral (or zero) values, explicit initialization is usually not done. */ 53#ifndef GLOBAL 54# define GLOBAL extern 55#endif 56 57#define TAREXIT_SUCCESS PAXEXIT_SUCCESS 58#define TAREXIT_DIFFERS PAXEXIT_DIFFERS 59#define TAREXIT_FAILURE PAXEXIT_FAILURE 60 61 62#include "arith.h" 63#include <backupfile.h> 64#include <exclude.h> 65#include <full-write.h> 66#include <modechange.h> 67#include <quote.h> 68#include <safe-read.h> 69#include <stat-time.h> 70#include <timespec.h> 71#define obstack_chunk_alloc xmalloc 72#define obstack_chunk_free free 73#include <obstack.h> 74 75#include <paxlib.h> 76 77/* Log base 2 of common values. */ 78#define LG_8 3 79#define LG_64 6 80#define LG_256 8 81 82/* Information gleaned from the command line. */ 83 84/* Name of this program. */ 85GLOBAL const char *program_name; 86 87/* Main command option. */ 88 89enum subcommand 90{ 91 UNKNOWN_SUBCOMMAND, /* none of the following */ 92 APPEND_SUBCOMMAND, /* -r */ 93 CAT_SUBCOMMAND, /* -A */ 94 CREATE_SUBCOMMAND, /* -c */ 95 DELETE_SUBCOMMAND, /* -D */ 96 DIFF_SUBCOMMAND, /* -d */ 97 EXTRACT_SUBCOMMAND, /* -x */ 98 LIST_SUBCOMMAND, /* -t */ 99 UPDATE_SUBCOMMAND /* -u */ 100}; 101 102GLOBAL enum subcommand subcommand_option; 103 104/* Selected format for output archive. */ 105GLOBAL enum archive_format archive_format; 106 107/* Either NL or NUL, as decided by the --null option. */ 108GLOBAL char filename_terminator; 109 110/* Size of each record, once in blocks, once in bytes. Those two variables 111 are always related, the second being BLOCKSIZE times the first. They do 112 not have _option in their name, even if their values is derived from 113 option decoding, as these are especially important in tar. */ 114GLOBAL int blocking_factor; 115GLOBAL size_t record_size; 116 117GLOBAL bool absolute_names_option; 118 119/* Display file times in UTC */ 120GLOBAL bool utc_option; 121 122/* This variable tells how to interpret newer_mtime_option, below. If zero, 123 files get archived if their mtime is not less than newer_mtime_option. 124 If nonzero, files get archived if *either* their ctime or mtime is not less 125 than newer_mtime_option. */ 126GLOBAL int after_date_option; 127 128enum atime_preserve 129{ 130 no_atime_preserve, 131 replace_atime_preserve, 132 system_atime_preserve 133}; 134GLOBAL enum atime_preserve atime_preserve_option; 135 136GLOBAL bool backup_option; 137 138/* Type of backups being made. */ 139GLOBAL enum backup_type backup_type; 140 141GLOBAL bool block_number_option; 142 143GLOBAL unsigned checkpoint_option; 144 145enum checkpoint_style 146 { 147 checkpoint_text, 148 checkpoint_dot 149 }; 150 151GLOBAL enum checkpoint_style checkpoint_style; 152 153/* Specified name of compression program, or "gzip" as implied by -z. */ 154GLOBAL const char *use_compress_program_option; 155 156GLOBAL bool dereference_option; 157 158/* Print a message if not all links are dumped */ 159GLOBAL int check_links_option; 160 161/* Patterns that match file names to be excluded. */ 162GLOBAL struct exclude *excluded; 163 164enum exclusion_tag_type 165 { 166 exclusion_tag_none, 167 /* Exclude the directory contents, but preserve the directory 168 itself and the exclusion tag file */ 169 exclusion_tag_contents, 170 /* Exclude everything below the directory, preserving the directory 171 itself */ 172 exclusion_tag_under, 173 /* Exclude entire directory */ 174 exclusion_tag_all, 175 }; 176 177/* Specified value to be put into tar file in place of stat () results, or 178 just -1 if such an override should not take place. */ 179GLOBAL gid_t group_option; 180 181GLOBAL bool ignore_failed_read_option; 182 183GLOBAL bool ignore_zeros_option; 184 185GLOBAL bool incremental_option; 186 187/* Specified name of script to run at end of each tape change. */ 188GLOBAL const char *info_script_option; 189 190GLOBAL bool interactive_option; 191 192/* If nonzero, extract only Nth occurrence of each named file */ 193GLOBAL uintmax_t occurrence_option; 194 195enum old_files 196{ 197 DEFAULT_OLD_FILES, /* default */ 198 NO_OVERWRITE_DIR_OLD_FILES, /* --no-overwrite-dir */ 199 OVERWRITE_OLD_FILES, /* --overwrite */ 200 UNLINK_FIRST_OLD_FILES, /* --unlink-first */ 201 KEEP_OLD_FILES, /* --keep-old-files */ 202 KEEP_NEWER_FILES /* --keep-newer-files */ 203}; 204GLOBAL enum old_files old_files_option; 205 206/* Specified file name for incremental list. */ 207GLOBAL const char *listed_incremental_option; 208 209/* Specified mode change string. */ 210GLOBAL struct mode_change *mode_option; 211 212/* Initial umask, if needed for mode change string. */ 213GLOBAL mode_t initial_umask; 214 215GLOBAL bool multi_volume_option; 216 217/* Specified threshold date and time. Files having an older time stamp 218 do not get archived (also see after_date_option above). */ 219GLOBAL struct timespec newer_mtime_option; 220 221/* If true, override actual mtime (see below) */ 222GLOBAL bool set_mtime_option; 223/* Value to be put in mtime header field instead of the actual mtime */ 224GLOBAL struct timespec mtime_option; 225 226/* Return true if newer_mtime_option is initialized. */ 227#define NEWER_OPTION_INITIALIZED(opt) (0 <= (opt).tv_nsec) 228 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) 233 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) 237 238/* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */ 239GLOBAL int recursion_option; 240 241GLOBAL bool numeric_owner_option; 242 243GLOBAL bool one_file_system_option; 244 245/* Specified value to be put into tar file in place of stat () results, or 246 just -1 if such an override should not take place. */ 247GLOBAL uid_t owner_option; 248 249GLOBAL bool recursive_unlink_option; 250 251GLOBAL bool read_full_records_option; 252 253GLOBAL bool remove_files_option; 254 255/* Specified rmt command. */ 256GLOBAL const char *rmt_command_option; 257 258/* Specified remote shell command. */ 259GLOBAL const char *rsh_command_option; 260 261GLOBAL bool same_order_option; 262 263/* If positive, preserve ownership when extracting. */ 264GLOBAL int same_owner_option; 265 266/* If positive, preserve permissions when extracting. */ 267GLOBAL int same_permissions_option; 268 269/* When set, strip the given number of file name components from the file name 270 before extracting */ 271GLOBAL size_t strip_name_components; 272 273GLOBAL bool show_omitted_dirs_option; 274 275GLOBAL bool sparse_option; 276GLOBAL unsigned tar_sparse_major; 277GLOBAL unsigned tar_sparse_minor; 278 279GLOBAL bool starting_file_option; 280 281/* Specified maximum byte length of each tape volume (multiple of 1024). */ 282GLOBAL tarlong tape_length_option; 283 284GLOBAL bool to_stdout_option; 285 286GLOBAL bool totals_option; 287 288GLOBAL bool touch_option; 289 290GLOBAL char *to_command_option; 291GLOBAL bool ignore_command_error_option; 292 293/* Restrict some potentially harmful tar options */ 294GLOBAL bool restrict_option; 295 296/* Return true if the extracted files are not being written to disk */ 297#define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option) 298 299/* Count how many times the option has been set, multiple setting yields 300 more verbose behavior. Value 0 means no verbosity, 1 means file name 301 only, 2 means file name and all attributes. More than 2 is just like 2. */ 302GLOBAL int verbose_option; 303 304GLOBAL bool verify_option; 305 306/* Specified name of file containing the volume number. */ 307GLOBAL const char *volno_file_option; 308 309/* Specified value or pattern. */ 310GLOBAL const char *volume_label_option; 311 312/* Other global variables. */ 313 314/* File descriptor for archive file. */ 315GLOBAL int archive; 316#if HAVE_QUARANTINE 317GLOBAL qtn_file_t archive_qtn_file; 318#endif 319 320/* Nonzero when outputting to /dev/null. */ 321GLOBAL bool dev_null_output; 322 323/* Timestamps: */ 324GLOBAL struct timespec start_time; /* when we started execution */ 325GLOBAL struct timespec volume_start_time; /* when the current volume was 326 opened*/ 327GLOBAL struct timespec last_stat_time; /* when the statistics was last 328 computed */ 329 330GLOBAL struct tar_stat_info current_stat_info; 331 332/* List of tape drive names, number of such tape drives, allocated number, 333 and current cursor in list. */ 334GLOBAL const char **archive_name_array; 335GLOBAL size_t archive_names; 336GLOBAL size_t allocated_archive_names; 337GLOBAL const char **archive_name_cursor; 338 339/* Output index file name. */ 340GLOBAL char const *index_file_name; 341 342/* Structure for keeping track of filenames and lists thereof. */ 343struct name 344 { 345 struct name *next; /* Link to the next element */ 346 int change_dir; /* Number of the directory to change to. 347 Set with the -C option. */ 348 uintmax_t found_count; /* number of times a matching file has 349 been found */ 350 int matching_flags; /* this name is a regexp, not literal */ 351 char const *dir_contents; /* for incremental_option */ 352 353 size_t length; /* cached strlen(name) */ 354 char name[1]; 355 }; 356 357/* Obnoxious test to see if dimwit is trying to dump the archive. */ 358GLOBAL dev_t ar_dev; 359GLOBAL ino_t ar_ino; 360 361GLOBAL bool seekable_archive; 362 363GLOBAL dev_t root_device; 364 365/* Unquote filenames */ 366GLOBAL bool unquote_option; 367 368GLOBAL bool test_label_option; /* Test archive volume label and exit */ 369 370/* Show file or archive names after transformation. 371 In particular, when creating archive in verbose mode, list member names 372 as stored in the archive */ 373GLOBAL bool show_transformed_names_option; 374 375/* Delay setting modification times and permissions of extracted directories 376 until the end of extraction. This variable helps correctly restore directory 377 timestamps from archives with an unusual member order. It is automatically 378 set for incremental archives. */ 379GLOBAL bool delay_directory_restore_option; 380 381/* Warn about implicit use of the wildcards in command line arguments. 382 (Default for tar prior to 1.15.91, but changed afterwards */ 383GLOBAL bool warn_regex_usage; 384 385/* Declarations for each module. */ 386 387/* FIXME: compare.c should not directly handle the following variable, 388 instead, this should be done in buffer.c only. */ 389 390enum access_mode 391{ 392 ACCESS_READ, 393 ACCESS_WRITE, 394 ACCESS_UPDATE 395}; 396extern enum access_mode access_mode; 397 398/* Module buffer.c. */ 399 400extern FILE *stdlis; 401extern bool write_archive_to_stdout; 402extern char *volume_label; 403extern char *continued_file_name; 404extern uintmax_t continued_file_size; 405extern uintmax_t continued_file_offset; 406 407size_t available_space_after (union block *pointer); 408off_t current_block_ordinal (void); 409void close_archive (void); 410void closeout_volume_number (void); 411void compute_duration (void); 412union block *find_next_block (void); 413void flush_read (void); 414void flush_write (void); 415void flush_archive (void); 416void init_volume_number (void); 417void open_archive (enum access_mode mode); 418void print_total_stats (void); 419void reset_eof (void); 420void set_next_block_after (union block *block); 421void clear_read_error_count (void); 422void xclose (int fd); 423void archive_write_error (ssize_t status) __attribute__ ((noreturn)); 424void archive_read_error (void); 425off_t seek_archive (off_t size); 426void set_start_time (void); 427 428void mv_begin (struct tar_stat_info *st); 429void mv_end (void); 430void mv_total_size (off_t size); 431void mv_size_left (off_t size); 432 433void buffer_write_global_xheader (void); 434 435/* Module create.c. */ 436 437enum dump_status 438 { 439 dump_status_ok, 440 dump_status_short, 441 dump_status_fail, 442 dump_status_not_implemented 443 }; 444 445void add_exclusion_tag (const char *name, enum exclusion_tag_type type, 446 bool (*)(const char*)); 447bool cachedir_file_p (const char *name); 448 449bool file_dumpable_p (struct tar_stat_info *st); 450void create_archive (void); 451void pad_archive (off_t size_left); 452void dump_file (const char *st, int top_level, dev_t parent_device); 453union block *start_header (struct tar_stat_info *st); 454void finish_header (struct tar_stat_info *st, union block *header, 455 off_t block_ordinal); 456void simple_finish_header (union block *header); 457union block * write_extended (bool global, struct tar_stat_info *st, 458 union block *old_header); 459union block *start_private_header (const char *name, size_t size); 460void write_eot (void); 461void check_links (void); 462 463#define GID_TO_CHARS(val, where) gid_to_chars (val, where, sizeof (where)) 464#define MAJOR_TO_CHARS(val, where) major_to_chars (val, where, sizeof (where)) 465#define MINOR_TO_CHARS(val, where) minor_to_chars (val, where, sizeof (where)) 466#define MODE_TO_CHARS(val, where) mode_to_chars (val, where, sizeof (where)) 467#define OFF_TO_CHARS(val, where) off_to_chars (val, where, sizeof (where)) 468#define SIZE_TO_CHARS(val, where) size_to_chars (val, where, sizeof (where)) 469#define TIME_TO_CHARS(val, where) time_to_chars (val, where, sizeof (where)) 470#define UID_TO_CHARS(val, where) uid_to_chars (val, where, sizeof (where)) 471#define UINTMAX_TO_CHARS(val, where) uintmax_to_chars (val, where, sizeof (where)) 472#define UNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf)) 473#define GNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf)) 474 475bool gid_to_chars (gid_t gid, char *buf, size_t size); 476bool major_to_chars (major_t m, char *buf, size_t size); 477bool minor_to_chars (minor_t m, char *buf, size_t size); 478bool mode_to_chars (mode_t m, char *buf, size_t size); 479bool off_to_chars (off_t off, char *buf, size_t size); 480bool size_to_chars (size_t v, char *buf, size_t size); 481bool time_to_chars (time_t t, char *buf, size_t size); 482bool uid_to_chars (uid_t uid, char *buf, size_t size); 483bool uintmax_to_chars (uintmax_t v, char *buf, size_t size); 484void string_to_chars (char const *s, char *buf, size_t size); 485 486/* Module diffarch.c. */ 487 488extern bool now_verifying; 489 490void diff_archive (void); 491void diff_init (void); 492void verify_volume (void); 493 494/* Module extract.c. */ 495 496void extr_init (void); 497void extract_archive (void); 498void extract_finish (void); 499bool rename_directory (char *src, char *dst); 500 501/* Module delete.c. */ 502 503void delete_archive_members (void); 504 505/* Module incremen.c. */ 506 507char *get_directory_contents (char *dir_name, dev_t device); 508const char *append_incremental_renames (const char *dump); 509void read_directory_file (void); 510void write_directory_file (void); 511void purge_directory (char const *directory_name); 512void list_dumpdir (char *buffer, size_t size); 513void update_parent_directory (const char *name); 514 515size_t dumpdir_size (const char *p); 516bool is_dumpdir (struct tar_stat_info *stat_info); 517 518/* Module list.c. */ 519 520enum read_header 521{ 522 HEADER_STILL_UNREAD, /* for when read_header has not been called */ 523 HEADER_SUCCESS, /* header successfully read and checksummed */ 524 HEADER_SUCCESS_EXTENDED, /* likewise, but we got an extended header */ 525 HEADER_ZERO_BLOCK, /* zero block where header expected */ 526 HEADER_END_OF_FILE, /* true end of file while header expected */ 527 HEADER_FAILURE /* ill-formed header, or bad checksum */ 528}; 529 530extern union block *current_header; 531extern enum archive_format current_format; 532extern size_t recent_long_name_blocks; 533extern size_t recent_long_link_blocks; 534 535void decode_header (union block *header, struct tar_stat_info *stat_info, 536 enum archive_format *format_pointer, int do_user_group); 537char const *tartime (struct timespec t, bool full_time); 538 539#define GID_FROM_HEADER(where) gid_from_header (where, sizeof (where)) 540#define MAJOR_FROM_HEADER(where) major_from_header (where, sizeof (where)) 541#define MINOR_FROM_HEADER(where) minor_from_header (where, sizeof (where)) 542#define MODE_FROM_HEADER(where) mode_from_header (where, sizeof (where)) 543#define OFF_FROM_HEADER(where) off_from_header (where, sizeof (where)) 544#define SIZE_FROM_HEADER(where) size_from_header (where, sizeof (where)) 545#define TIME_FROM_HEADER(where) time_from_header (where, sizeof (where)) 546#define UID_FROM_HEADER(where) uid_from_header (where, sizeof (where)) 547#define UINTMAX_FROM_HEADER(where) uintmax_from_header (where, sizeof (where)) 548 549gid_t gid_from_header (const char *buf, size_t size); 550major_t major_from_header (const char *buf, size_t size); 551minor_t minor_from_header (const char *buf, size_t size); 552mode_t mode_from_header (const char *buf, size_t size); 553off_t off_from_header (const char *buf, size_t size); 554size_t size_from_header (const char *buf, size_t size); 555time_t time_from_header (const char *buf, size_t size); 556uid_t uid_from_header (const char *buf, size_t size); 557uintmax_t uintmax_from_header (const char * buf, size_t size); 558 559void list_archive (void); 560void print_for_mkdir (char *dirname, int length, mode_t mode); 561void print_header (struct tar_stat_info *st, off_t block_ordinal); 562void read_and (void (*do_something) (void)); 563enum read_header read_header_primitive (bool raw_extended_headers, 564 struct tar_stat_info *info); 565enum read_header read_header (bool raw_extended_headers); 566enum read_header tar_checksum (union block *header, bool silent); 567void skip_file (off_t size); 568void skip_member (void); 569 570/* Module misc.c. */ 571 572void assign_string (char **dest, const char *src); 573char *quote_copy_string (const char *str); 574int unquote_string (char *str); 575 576void code_ns_fraction (int ns, char *p); 577char const *code_timespec (struct timespec ts, char *sbuf); 578enum { BILLION = 1000000000, LOG10_BILLION = 9 }; 579enum { TIMESPEC_STRSIZE_BOUND = 580 UINTMAX_STRSIZE_BOUND + LOG10_BILLION + sizeof "-." - 1 }; 581 582enum remove_option 583{ 584 ORDINARY_REMOVE_OPTION, 585 RECURSIVE_REMOVE_OPTION, 586 587 /* FIXME: The following value is never used. It seems to be intended 588 as a placeholder for a hypothetical option that should instruct tar 589 to recursively remove subdirectories in purge_directory(), 590 as opposed to the functionality of --recursive-unlink 591 (RECURSIVE_REMOVE_OPTION value), which removes them in 592 prepare_to_extract() phase. However, with the addition of more 593 meta-info to the incremental dumps, this should become unnecessary */ 594 WANT_DIRECTORY_REMOVE_OPTION 595}; 596int remove_any_file (const char *file_name, enum remove_option option); 597bool maybe_backup_file (const char *file_name, bool this_is_the_archive); 598void undo_last_backup (void); 599 600int deref_stat (bool deref, char const *name, struct stat *buf); 601 602int chdir_arg (char const *dir); 603void chdir_do (int dir); 604 605void close_diag (char const *name); 606void open_diag (char const *name); 607void read_diag_details (char const *name, off_t offset, size_t size); 608void readlink_diag (char const *name); 609void savedir_diag (char const *name); 610void seek_diag_details (char const *name, off_t offset); 611void stat_diag (char const *name); 612void write_error_details (char const *name, size_t status, size_t size); 613void write_fatal (char const *name) __attribute__ ((noreturn)); 614void write_fatal_details (char const *name, ssize_t status, size_t size) 615 __attribute__ ((noreturn)); 616 617pid_t xfork (void); 618void xpipe (int fd[2]); 619 620void *page_aligned_alloc (void **ptr, size_t size); 621int set_file_atime (int fd, char const *file, 622 struct timespec const timespec[2]); 623 624/* Module names.c. */ 625 626extern struct name *gnu_list_name; 627 628void gid_to_gname (gid_t gid, char **gname); 629int gname_to_gid (char const *gname, gid_t *pgid); 630void uid_to_uname (uid_t uid, char **uname); 631int uname_to_uid (char const *uname, uid_t *puid); 632 633void name_init (void); 634void name_add_name (const char *name, int matching_flags); 635void name_add_dir (const char *name); 636void name_term (void); 637const char *name_next (int change_dirs); 638void name_gather (void); 639struct name *addname (char const *string, int change_dir); 640bool name_match (const char *name); 641void names_notfound (void); 642void collect_and_sort_names (void); 643struct name *name_scan (const char *name); 644char *name_from_list (void); 645void blank_name_list (void); 646char *new_name (const char *dir_name, const char *name); 647size_t stripped_prefix_len (char const *file_name, size_t num); 648bool all_names_found (struct tar_stat_info *st); 649 650bool excluded_name (char const *name); 651 652void add_avoided_name (char const *name); 653bool is_avoided_name (char const *name); 654bool is_individual_file (char const *name); 655 656bool contains_dot_dot (char const *name); 657 658#define ISFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \ 659 (c)->found_count == occurrence_option) 660#define WASFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \ 661 (c)->found_count >= occurrence_option) 662 663/* Module tar.c. */ 664 665void usage (int); 666 667int confirm (const char *message_action, const char *name); 668void request_stdin (const char *option); 669 670void tar_stat_init (struct tar_stat_info *st); 671void tar_stat_destroy (struct tar_stat_info *st); 672void usage (int) __attribute__ ((noreturn)); 673int tar_timespec_cmp (struct timespec a, struct timespec b); 674const char *archive_format_string (enum archive_format fmt); 675const char *subcommand_string (enum subcommand c); 676 677/* Module update.c. */ 678 679extern char *output_start; 680 681void update_archive (void); 682 683/* Module xheader.c. */ 684 685void xheader_init (struct xheader *xhdr); 686void xheader_decode (struct tar_stat_info *stat); 687void xheader_decode_global (struct xheader *xhdr); 688void xheader_store (char const *keyword, struct tar_stat_info *st, 689 void const *data); 690void xheader_read (struct xheader *xhdr, union block *header, size_t size); 691void xheader_write (char type, char *name, struct xheader *xhdr); 692void xheader_write_global (struct xheader *xhdr); 693void xheader_finish (struct xheader *hdr); 694void xheader_destroy (struct xheader *hdr); 695char *xheader_xhdr_name (struct tar_stat_info *st); 696char *xheader_ghdr_name (void); 697void xheader_set_option (char *string); 698void xheader_string_begin (struct xheader *xhdr); 699void xheader_string_add (struct xheader *xhdr, char const *s); 700bool xheader_string_end (struct xheader *xhdr, char const *keyword); 701bool xheader_keyword_deleted_p (const char *kw); 702char *xheader_format_name (struct tar_stat_info *st, const char *fmt, 703 size_t n); 704 705/* Module system.c */ 706 707void sys_detect_dev_null_output (void); 708void sys_save_archive_dev_ino (void); 709void sys_drain_input_pipe (void); 710void sys_wait_for_child (pid_t); 711void sys_spawn_shell (void); 712bool sys_compare_uid (struct stat *a, struct stat *b); 713bool sys_compare_gid (struct stat *a, struct stat *b); 714bool sys_file_is_archive (struct tar_stat_info *p); 715bool sys_compare_links (struct stat *link_data, struct stat *stat_data); 716int sys_truncate (int fd); 717pid_t sys_child_open_for_compress (void); 718pid_t sys_child_open_for_uncompress (void); 719size_t sys_write_archive_buffer (void); 720bool sys_get_archive_stat (void); 721int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st); 722void sys_wait_command (void); 723int sys_exec_info_script (const char **archive_name, int volume_number); 724 725/* Module compare.c */ 726void report_difference (struct tar_stat_info *st, const char *message, ...); 727 728/* Module sparse.c */ 729bool sparse_member_p (struct tar_stat_info *st); 730bool sparse_fixup_header (struct tar_stat_info *st); 731enum dump_status sparse_dump_file (int, struct tar_stat_info *st); 732enum dump_status sparse_extract_file (int fd, struct tar_stat_info *st, 733 off_t *size); 734enum dump_status sparse_skip_file (struct tar_stat_info *st); 735bool sparse_diff_file (int, struct tar_stat_info *st); 736 737/* Module utf8.c */ 738bool string_ascii_p (const char *str); 739bool utf8_convert (bool to_utf, char const *input, char **output); 740 741/* Module transform.c */ 742typedef enum 743 { 744 xform_regfile, 745 xform_link, 746 xform_symlink 747 } xform_type; 748 749void set_transform_expr (const char *expr); 750bool transform_name (char **pinput); 751bool transform_member_name (char **pinput, xform_type type); 752bool transform_name_fp (char **pinput, char *(*fun)(char *, void *), void *); 753