(root)/
tar-1.35/
src/
common.h
       1  /* Common declarations for the tar program.
       2  
       3     Copyright 1988-2023 Free Software Foundation, Inc.
       4  
       5     This file is part of GNU tar.
       6  
       7     GNU tar is free software; you can redistribute it and/or modify
       8     it under the terms of the GNU General Public License as published by
       9     the Free Software Foundation; either version 3 of the License, or
      10     (at your option) any later version.
      11  
      12     GNU tar is distributed in the hope that it will be useful,
      13     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15     GNU General Public License for more details.
      16  
      17     You should have received a copy of the GNU General Public License
      18     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
      19  
      20  /* Declare the GNU tar archive format.  */
      21  #include "tar.h"
      22  
      23  /* The checksum field is filled with this while the checksum is computed.  */
      24  #define CHKBLANKS	"        "	/* 8 blanks, no null */
      25  
      26  /* Some constants from POSIX are given names.  */
      27  #define NAME_FIELD_SIZE   100
      28  #define PREFIX_FIELD_SIZE 155
      29  #define UNAME_FIELD_SIZE   32
      30  #define GNAME_FIELD_SIZE   32
      31  
      32  
      33  
      34  /* Some various global definitions.  */
      35  
      36  /* Name of file to use for interacting with user.  */
      37  
      38  /* GLOBAL is defined to empty in tar.c only, and left alone in other *.c
      39     modules.  Here, we merely set it to "extern" if it is not already set.
      40     GNU tar does depend on the system loader to preset all GLOBAL variables to
      41     neutral (or zero) values, explicit initialization is usually not done.  */
      42  #ifndef GLOBAL
      43  # define GLOBAL extern
      44  #endif
      45  
      46  #define TAREXIT_SUCCESS PAXEXIT_SUCCESS
      47  #define TAREXIT_DIFFERS PAXEXIT_DIFFERS
      48  #define TAREXIT_FAILURE PAXEXIT_FAILURE
      49  
      50  
      51  #include "arith.h"
      52  #include <attribute.h>
      53  #include <backupfile.h>
      54  #include <exclude.h>
      55  #include <full-write.h>
      56  #include <idx.h>
      57  #include <inttostr.h>
      58  #include <modechange.h>
      59  #include <quote.h>
      60  #include <safe-read.h>
      61  #include <full-read.h>
      62  #include <stat-time.h>
      63  #include <timespec.h>
      64  #define obstack_chunk_alloc xmalloc
      65  #define obstack_chunk_free free
      66  #include <obstack.h>
      67  #include <progname.h>
      68  #include <xvasprintf.h>
      69  
      70  #include <paxlib.h>
      71  
      72  /* Log base 2 of common values.  */
      73  #define LG_8 3
      74  #define LG_64 6
      75  #define LG_256 8
      76  
      77  _GL_INLINE_HEADER_BEGIN
      78  #ifndef COMMON_INLINE
      79  # define COMMON_INLINE _GL_INLINE
      80  #endif
      81  
      82  /* Information gleaned from the command line.  */
      83  
      84  /* Main command option.  */
      85  
      86  enum subcommand
      87  {
      88    UNKNOWN_SUBCOMMAND,		/* none of the following */
      89    APPEND_SUBCOMMAND,		/* -r */
      90    CAT_SUBCOMMAND,		/* -A */
      91    CREATE_SUBCOMMAND,		/* -c */
      92    DELETE_SUBCOMMAND,		/* -D */
      93    DIFF_SUBCOMMAND,		/* -d */
      94    EXTRACT_SUBCOMMAND,		/* -x */
      95    LIST_SUBCOMMAND,		/* -t */
      96    UPDATE_SUBCOMMAND,		/* -u */
      97    TEST_LABEL_SUBCOMMAND,        /* --test-label */
      98  };
      99  
     100  GLOBAL enum subcommand subcommand_option;
     101  
     102  /* Selected format for output archive.  */
     103  GLOBAL enum archive_format archive_format;
     104  
     105  /* Size of each record, once in blocks, once in bytes.  Those two variables
     106     are always related, the second being BLOCKSIZE times the first.  They do
     107     not have _option in their name, even if their values is derived from
     108     option decoding, as these are especially important in tar.  */
     109  GLOBAL int blocking_factor;
     110  GLOBAL size_t record_size;
     111  
     112  GLOBAL bool absolute_names_option;
     113  
     114  /* Display file times in UTC */
     115  GLOBAL bool utc_option;
     116  /* Output file timestamps to the full resolution */
     117  GLOBAL bool full_time_option;
     118  
     119  /* This variable tells how to interpret newer_mtime_option, below.  If zero,
     120     files get archived if their mtime is not less than newer_mtime_option.
     121     If nonzero, files get archived if *either* their ctime or mtime is not less
     122     than newer_mtime_option.  */
     123  GLOBAL int after_date_option;
     124  
     125  enum atime_preserve
     126  {
     127    no_atime_preserve,
     128    replace_atime_preserve,
     129    system_atime_preserve
     130  };
     131  GLOBAL enum atime_preserve atime_preserve_option;
     132  
     133  GLOBAL bool backup_option;
     134  
     135  /* Type of backups being made.  */
     136  GLOBAL enum backup_type backup_type;
     137  
     138  GLOBAL bool block_number_option;
     139  
     140  GLOBAL unsigned checkpoint_option;
     141  #define DEFAULT_CHECKPOINT 10
     142  
     143  /* Specified name of compression program, or "gzip" as implied by -z.  */
     144  GLOBAL const char *use_compress_program_option;
     145  
     146  GLOBAL bool dereference_option;
     147  GLOBAL bool hard_dereference_option;
     148  
     149  /* Patterns that match file names to be excluded.  */
     150  GLOBAL struct exclude *excluded;
     151  
     152  enum exclusion_tag_type
     153    {
     154      exclusion_tag_none,
     155       /* Exclude the directory contents, but preserve the directory
     156  	itself and the exclusion tag file */
     157      exclusion_tag_contents,
     158      /* Exclude everything below the directory, preserving the directory
     159         itself */
     160      exclusion_tag_under,
     161      /* Exclude entire directory  */
     162      exclusion_tag_all,
     163    };
     164  
     165  /* Specified value to be put into tar file in place of stat () results, or
     166     just null and -1 if such an override should not take place.  */
     167  GLOBAL char const *group_name_option;
     168  GLOBAL gid_t group_option;
     169  
     170  GLOBAL bool ignore_failed_read_option;
     171  
     172  GLOBAL bool ignore_zeros_option;
     173  
     174  GLOBAL bool incremental_option;
     175  
     176  /* Specified name of script to run at end of each tape change.  */
     177  GLOBAL const char *info_script_option;
     178  
     179  GLOBAL bool interactive_option;
     180  
     181  /* If nonzero, extract only Nth occurrence of each named file */
     182  GLOBAL uintmax_t occurrence_option;
     183  
     184  enum old_files
     185  {
     186    DEFAULT_OLD_FILES,          /* default */
     187    NO_OVERWRITE_DIR_OLD_FILES, /* --no-overwrite-dir */
     188    OVERWRITE_OLD_FILES,        /* --overwrite */
     189    UNLINK_FIRST_OLD_FILES,     /* --unlink-first */
     190    KEEP_OLD_FILES,             /* --keep-old-files */
     191    SKIP_OLD_FILES,             /* --skip-old-files */
     192    KEEP_NEWER_FILES	      /* --keep-newer-files */
     193  };
     194  GLOBAL enum old_files old_files_option;
     195  
     196  GLOBAL bool keep_directory_symlink_option;
     197  
     198  /* Specified file name for incremental list.  */
     199  GLOBAL const char *listed_incremental_option;
     200  /* Incremental dump level */
     201  GLOBAL int incremental_level;
     202  /* Check device numbers when doing incremental dumps. */
     203  GLOBAL bool check_device_option;
     204  
     205  /* Specified mode change string.  */
     206  GLOBAL struct mode_change *mode_option;
     207  
     208  /* Initial umask, if needed for mode change string.  */
     209  GLOBAL mode_t initial_umask;
     210  
     211  GLOBAL bool multi_volume_option;
     212  
     213  /* Specified threshold date and time.  Files having an older time stamp
     214     do not get archived (also see after_date_option above).  */
     215  GLOBAL struct timespec newer_mtime_option;
     216  
     217  enum set_mtime_option_mode
     218  {
     219    USE_FILE_MTIME,
     220    FORCE_MTIME,
     221    CLAMP_MTIME,
     222  };
     223  
     224  /* Override actual mtime if set to FORCE_MTIME or CLAMP_MTIME */
     225  GLOBAL enum set_mtime_option_mode set_mtime_option;
     226  /* Value to use when forcing or clamping the mtime header field. */
     227  GLOBAL struct timespec mtime_option;
     228  
     229  /* Return true if mtime_option or newer_mtime_option is initialized.  */
     230  #define TIME_OPTION_INITIALIZED(opt) (0 <= (opt).tv_nsec)
     231  
     232  /* Return true if the struct stat ST's M time is less than
     233     newer_mtime_option.  */
     234  #define OLDER_STAT_TIME(st, m) \
     235    (timespec_cmp (get_stat_##m##time (&(st)), newer_mtime_option) < 0)
     236  
     237  /* Likewise, for struct tar_stat_info ST.  */
     238  #define OLDER_TAR_STAT_TIME(st, m) \
     239    (timespec_cmp ((st).m##time, newer_mtime_option) < 0)
     240  
     241  /* Zero if there is no recursion, otherwise FNM_LEADING_DIR.  */
     242  GLOBAL int recursion_option;
     243  
     244  GLOBAL bool numeric_owner_option;
     245  
     246  GLOBAL bool one_file_system_option;
     247  
     248  /* Create a top-level directory for extracting based on the archive name.  */
     249  GLOBAL bool one_top_level_option;
     250  GLOBAL char *one_top_level_dir;
     251  
     252  /* Specified value to be put into tar file in place of stat () results, or
     253     just null and -1 if such an override should not take place.  */
     254  GLOBAL char const *owner_name_option;
     255  GLOBAL uid_t owner_option;
     256  
     257  GLOBAL bool recursive_unlink_option;
     258  
     259  GLOBAL bool read_full_records_option;
     260  
     261  GLOBAL bool remove_files_option;
     262  
     263  /* Specified remote shell command.  */
     264  GLOBAL const char *rsh_command_option;
     265  
     266  GLOBAL bool same_order_option;
     267  
     268  /* If positive, preserve ownership when extracting.  */
     269  GLOBAL int same_owner_option;
     270  
     271  /* If positive, preserve permissions when extracting.  */
     272  GLOBAL int same_permissions_option;
     273  
     274  /* If positive, save the SELinux context.  */
     275  GLOBAL int selinux_context_option;
     276  
     277  /* If positive, save the ACLs.  */
     278  GLOBAL int acls_option;
     279  
     280  /* If positive, save the user and root xattrs.  */
     281  GLOBAL int xattrs_option;
     282  
     283  /* When set, strip the given number of file name components from the file name
     284     before extracting */
     285  GLOBAL size_t strip_name_components;
     286  
     287  GLOBAL bool show_omitted_dirs_option;
     288  
     289  GLOBAL bool sparse_option;
     290  GLOBAL unsigned tar_sparse_major;
     291  GLOBAL unsigned tar_sparse_minor;
     292  
     293  enum hole_detection_method
     294    {
     295      HOLE_DETECTION_DEFAULT,
     296      HOLE_DETECTION_RAW,
     297      HOLE_DETECTION_SEEK
     298    };
     299  
     300  GLOBAL enum hole_detection_method hole_detection;
     301  
     302  /* The first entry in names.c:namelist specifies the member name to
     303     start extracting from. Set by add_starting_file() upon seeing the
     304     -K option.
     305  */
     306  GLOBAL bool starting_file_option;
     307  
     308  /* Specified maximum byte length of each tape volume (multiple of 1024).  */
     309  GLOBAL tarlong tape_length_option;
     310  
     311  GLOBAL bool to_stdout_option;
     312  
     313  GLOBAL bool totals_option;
     314  
     315  GLOBAL bool touch_option;
     316  
     317  GLOBAL char *to_command_option;
     318  GLOBAL bool ignore_command_error_option;
     319  
     320  /* Restrict some potentially harmful tar options */
     321  GLOBAL bool restrict_option;
     322  
     323  /* Return true if the extracted files are not being written to disk */
     324  #define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option)
     325  
     326  /* Count how many times the option has been set, multiple setting yields
     327     more verbose behavior.  Value 0 means no verbosity, 1 means file name
     328     only, 2 means file name and all attributes.  More than 2 is just like 2.  */
     329  GLOBAL int verbose_option;
     330  
     331  GLOBAL bool verify_option;
     332  
     333  /* Specified name of file containing the volume number.  */
     334  GLOBAL const char *volno_file_option;
     335  
     336  /* Specified value or pattern.  */
     337  GLOBAL const char *volume_label_option;
     338  
     339  /* Other global variables.  */
     340  
     341  /* Force POSIX-compliance */
     342  GLOBAL bool posixly_correct;
     343  
     344  /* File descriptor for archive file.  */
     345  GLOBAL int archive;
     346  
     347  /* Nonzero when outputting to /dev/null.  */
     348  GLOBAL bool dev_null_output;
     349  
     350  /* Timestamps: */
     351  GLOBAL struct timespec start_time;        /* when we started execution */
     352  GLOBAL struct timespec volume_start_time; /* when the current volume was
     353  					     opened*/
     354  GLOBAL struct timespec last_stat_time;    /* when the statistics was last
     355  					     computed */
     356  
     357  GLOBAL struct tar_stat_info current_stat_info;
     358  
     359  /* List of tape drive names, number of such tape drives,
     360     and current cursor in list.  */
     361  GLOBAL const char **archive_name_array;
     362  GLOBAL size_t archive_names;
     363  GLOBAL const char **archive_name_cursor;
     364  
     365  /* Output index file name.  */
     366  GLOBAL char const *index_file_name;
     367  
     368  /* Opaque structure for keeping directory meta-data */
     369  struct directory;
     370  
     371  /* Structure for keeping track of filenames and lists thereof.  */
     372  struct name
     373    {
     374      struct name *next;          /* Link to the next element */
     375      struct name *prev;          /* Link to the previous element */
     376  
     377      char *name;                 /* File name or globbing pattern */
     378      size_t length;		/* cached strlen (name) */
     379      int matching_flags;         /* wildcard flags if name is a pattern */
     380      bool is_wildcard;           /* true if this is a wildcard pattern */
     381      bool cmdline;               /* true if this name was given in the
     382  				   command line */
     383  
     384      int change_dir;		/* Number of the directory to change to.
     385  				   Set with the -C option. */
     386      uintmax_t found_count;	/* number of times a matching file has
     387  				   been found */
     388  
     389      /* The following members are used for incremental dumps only,
     390         if this struct name represents a directory;
     391         see incremen.c */
     392      struct directory *directory;/* directory meta-data and contents */
     393      struct name *parent;        /* pointer to the parent hierarchy */
     394      struct name *child;         /* pointer to the first child */
     395      struct name *sibling;       /* pointer to the next sibling */
     396      char *caname;               /* canonical name */
     397    };
     398  
     399  /* Status of archive file, or all zeros if remote.  */
     400  GLOBAL struct stat archive_stat;
     401  
     402  /* Flags for reading, searching, and fstatatting files.  */
     403  GLOBAL int open_read_flags;
     404  GLOBAL int open_searchdir_flags;
     405  GLOBAL int fstatat_flags;
     406  
     407  GLOBAL int seek_option;
     408  
     409  /* true if archive if lseek should be used on the archive, 0 if it
     410     should not be used.  */
     411  GLOBAL bool seekable_archive;
     412  
     413  GLOBAL dev_t root_device;
     414  
     415  /* Unquote filenames */
     416  GLOBAL bool unquote_option;
     417  
     418  GLOBAL int savedir_sort_order;
     419  
     420  /* Show file or archive names after transformation.
     421     In particular, when creating archive in verbose mode, list member names
     422     as stored in the archive */
     423  GLOBAL bool show_transformed_names_option;
     424  
     425  /* Delay setting modification times and permissions of extracted directories
     426     until the end of extraction. This variable helps correctly restore directory
     427     timestamps from archives with an unusual member order. It is automatically
     428     set for incremental archives. */
     429  GLOBAL bool delay_directory_restore_option;
     430  
     431  /* Declarations for each module.  */
     432  
     433  /* FIXME: compare.c should not directly handle the following variable,
     434     instead, this should be done in buffer.c only.  */
     435  
     436  enum access_mode
     437  {
     438    ACCESS_READ,
     439    ACCESS_WRITE,
     440    ACCESS_UPDATE
     441  };
     442  extern enum access_mode access_mode;
     443  
     444  /* Module buffer.c.  */
     445  
     446  extern FILE *stdlis;
     447  extern bool write_archive_to_stdout;
     448  extern char *volume_label;
     449  extern size_t volume_label_count;
     450  extern char *continued_file_name;
     451  extern uintmax_t continued_file_size;
     452  extern uintmax_t continued_file_offset;
     453  extern off_t records_written;
     454  
     455  char *drop_volume_label_suffix (const char *label);
     456  
     457  size_t available_space_after (union block *pointer);
     458  off_t current_block_ordinal (void);
     459  void close_archive (void);
     460  void closeout_volume_number (void);
     461  double compute_duration (void);
     462  union block *find_next_block (void);
     463  void flush_read (void);
     464  void flush_write (void);
     465  void flush_archive (void);
     466  void init_volume_number (void);
     467  void open_archive (enum access_mode mode);
     468  void print_total_stats (void);
     469  void reset_eof (void);
     470  void set_next_block_after (union block *block);
     471  void clear_read_error_count (void);
     472  void xclose (int fd);
     473  _Noreturn void archive_write_error (ssize_t status);
     474  void archive_read_error (void);
     475  off_t seek_archive (off_t size);
     476  void set_start_time (void);
     477  
     478  #define TF_READ    0
     479  #define TF_WRITE   1
     480  #define TF_DELETED 2
     481  int format_total_stats (FILE *fp, char const *const *formats, int eor, int eol);
     482  void print_total_stats (void);
     483  
     484  void mv_begin_write (const char *file_name, off_t totsize, off_t sizeleft);
     485  
     486  void mv_begin_read (struct tar_stat_info *st);
     487  void mv_end (void);
     488  void mv_size_left (off_t size);
     489  
     490  void buffer_write_global_xheader (void);
     491  
     492  const char *first_decompress_program (int *pstate);
     493  const char *next_decompress_program (int *pstate);
     494  
     495  /* Module create.c.  */
     496  
     497  enum dump_status
     498    {
     499      dump_status_ok,
     500      dump_status_short,
     501      dump_status_fail,
     502      dump_status_not_implemented
     503    };
     504  
     505  void add_exclusion_tag (const char *name, enum exclusion_tag_type type,
     506  			bool (*predicate) (int));
     507  bool cachedir_file_p (int fd);
     508  char *get_directory_entries (struct tar_stat_info *st)
     509    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
     510  
     511  void create_archive (void);
     512  void pad_archive (off_t size_left);
     513  void dump_file (struct tar_stat_info *parent, char const *name,
     514  		char const *fullname);
     515  union block *start_header (struct tar_stat_info *st);
     516  void finish_header (struct tar_stat_info *st, union block *header,
     517  		    off_t block_ordinal);
     518  void simple_finish_header (union block *header);
     519  union block * write_extended (bool global, struct tar_stat_info *st,
     520  			      union block *old_header);
     521  union block *start_private_header (const char *name, size_t size, time_t t);
     522  void write_eot (void);
     523  void check_links (void);
     524  int subfile_open (struct tar_stat_info const *dir, char const *file, int flags);
     525  void restore_parent_fd (struct tar_stat_info const *st);
     526  void exclusion_tag_warning (const char *dirname, const char *tagname,
     527  			    const char *message);
     528  enum exclusion_tag_type check_exclusion_tags (struct tar_stat_info const *st,
     529  					      const char **tag_file_name);
     530  
     531  #define OFF_TO_CHARS(val, where) off_to_chars (val, where, sizeof (where))
     532  #define TIME_TO_CHARS(val, where) time_to_chars (val, where, sizeof (where))
     533  
     534  bool off_to_chars (off_t off, char *buf, size_t size);
     535  bool time_to_chars (time_t t, char *buf, size_t size);
     536  
     537  /* Module diffarch.c.  */
     538  
     539  extern bool now_verifying;
     540  
     541  void diff_archive (void);
     542  void diff_init (void);
     543  void verify_volume (void);
     544  
     545  /* Module extract.c.  */
     546  
     547  void extr_init (void);
     548  void extract_archive (void);
     549  void extract_finish (void);
     550  bool rename_directory (char *src, char *dst);
     551  
     552  void remove_delayed_set_stat (const char *fname);
     553  
     554  /* Module delete.c.  */
     555  
     556  void delete_archive_members (void);
     557  
     558  /* Module incremen.c.  */
     559  
     560  struct directory *scan_directory (struct tar_stat_info *st);
     561  const char *directory_contents (struct directory *dir);
     562  const char *safe_directory_contents (struct directory *dir);
     563  
     564  void rebase_directory (struct directory *dir,
     565  		       const char *samp, size_t slen,
     566  		       const char *repl, size_t rlen);
     567  
     568  void append_incremental_renames (struct directory *dir);
     569  void show_snapshot_field_ranges (void);
     570  void read_directory_file (void);
     571  void write_directory_file (void);
     572  void purge_directory (char const *directory_name);
     573  void list_dumpdir (char *buffer, size_t size);
     574  void update_parent_directory (struct tar_stat_info *st);
     575  
     576  size_t dumpdir_size (const char *p);
     577  bool is_dumpdir (struct tar_stat_info *stat_info);
     578  void clear_directory_table (void);
     579  
     580  /* Module list.c.  */
     581  
     582  enum read_header
     583  {
     584    HEADER_STILL_UNREAD,		/* for when read_header has not been called */
     585    HEADER_SUCCESS,		/* header successfully read and checksummed */
     586    HEADER_SUCCESS_EXTENDED,	/* likewise, but we got an extended header */
     587    HEADER_ZERO_BLOCK,		/* zero block where header expected */
     588    HEADER_END_OF_FILE,		/* true end of file while header expected */
     589    HEADER_FAILURE		/* ill-formed header, or bad checksum */
     590  };
     591  
     592  /* Operation mode for read_header: */
     593  
     594  enum read_header_mode
     595  {
     596    read_header_auto,             /* process extended headers automatically */
     597    read_header_x_raw,            /* return raw extended headers (return
     598  				   HEADER_SUCCESS_EXTENDED) */
     599    read_header_x_global          /* when POSIX global extended header is read,
     600  				   decode it and return
     601  				   HEADER_SUCCESS_EXTENDED */
     602  };
     603  extern union block *current_header;
     604  extern enum archive_format current_format;
     605  extern size_t recent_long_name_blocks;
     606  extern size_t recent_long_link_blocks;
     607  
     608  void decode_header (union block *header, struct tar_stat_info *stat_info,
     609  		    enum archive_format *format_pointer, int do_user_group);
     610  void transform_stat_info (int typeflag, struct tar_stat_info *stat_info);
     611  char const *tartime (struct timespec t, bool full_time);
     612  
     613  #define OFF_FROM_HEADER(where) off_from_header (where, sizeof (where))
     614  #define UINTMAX_FROM_HEADER(where) uintmax_from_header (where, sizeof (where))
     615  
     616  off_t off_from_header (const char *buf, size_t size);
     617  uintmax_t uintmax_from_header (const char *buf, size_t size);
     618  
     619  void list_archive (void);
     620  void test_archive_label (void);
     621  void print_for_mkdir (char *dirname, mode_t mode);
     622  void print_header (struct tar_stat_info *st, union block *blk,
     623  	           off_t block_ordinal);
     624  void read_and (void (*do_something) (void));
     625  enum read_header read_header (union block **return_block,
     626  			      struct tar_stat_info *info,
     627  			      enum read_header_mode m);
     628  enum read_header tar_checksum (union block *header, bool silent);
     629  void skim_file (off_t size, bool must_copy);
     630  void skip_member (void);
     631  void skim_member (bool must_copy);
     632  
     633  /* Module misc.c.  */
     634  
     635  #define min(a, b) ((a) < (b) ? (a) : (b))
     636  #define max(a, b) ((a) < (b) ? (b) : (a))
     637  
     638  char const *quote_n_colon (int n, char const *arg);
     639  void assign_string_or_null (char **dest, const char *src)
     640    ATTRIBUTE_NONNULL ((1));
     641  void assign_string (char **dest, const char *src) ATTRIBUTE_NONNULL ((1, 2));
     642  void assign_null (char **dest) ATTRIBUTE_NONNULL ((1));
     643  void assign_string_n (char **string, const char *value, size_t n);
     644  #define ASSIGN_STRING_N(s,v) assign_string_n (s, v, sizeof (v))
     645  int unquote_string (char *str);
     646  char *zap_slashes (char *name);
     647  char *normalize_filename (int cdidx, const char *name);
     648  void normalize_filename_x (char *name);
     649  void replace_prefix (char **pname, const char *samp, size_t slen,
     650  		     const char *repl, size_t rlen);
     651  char *tar_savedir (const char *name, int must_exist);
     652  
     653  typedef struct namebuf *namebuf_t;
     654  namebuf_t namebuf_create (const char *dir);
     655  void namebuf_free (namebuf_t buf);
     656  char *namebuf_name (namebuf_t buf, const char *name);
     657  
     658  const char *tar_dirname (void);
     659  
     660  /* Represent N using a signed integer I such that (uintmax_t) I == N.
     661     With a good optimizing compiler, this is equivalent to (intmax_t) i
     662     and requires zero machine instructions.  */
     663  #if ! (UINTMAX_MAX / 2 <= INTMAX_MAX)
     664  # error "represent_uintmax returns intmax_t to represent uintmax_t"
     665  #endif
     666  COMMON_INLINE intmax_t
     667  represent_uintmax (uintmax_t n)
     668  {
     669    if (n <= INTMAX_MAX)
     670      return n;
     671    else
     672      {
     673        /* Avoid signed integer overflow on picky platforms.  */
     674        intmax_t nd = n - INTMAX_MIN;
     675        return nd + INTMAX_MIN;
     676      }
     677  }
     678  
     679  #define STRINGIFY_BIGINT(i, b) umaxtostr (i, b)
     680  enum { UINTMAX_STRSIZE_BOUND = INT_BUFSIZE_BOUND (intmax_t) };
     681  enum { SYSINT_BUFSIZE =
     682  	 max (UINTMAX_STRSIZE_BOUND, INT_BUFSIZE_BOUND (intmax_t)) };
     683  char *sysinttostr (uintmax_t, intmax_t, uintmax_t, char buf[SYSINT_BUFSIZE]);
     684  intmax_t strtosysint (char const *, char **, intmax_t, uintmax_t);
     685  void code_ns_fraction (int ns, char *p);
     686  enum { BILLION = 1000000000, LOG10_BILLION = 9 };
     687  enum { TIMESPEC_STRSIZE_BOUND =
     688           UINTMAX_STRSIZE_BOUND + LOG10_BILLION + sizeof "-." - 1 };
     689  char const *code_timespec (struct timespec ts,
     690  			   char sbuf[TIMESPEC_STRSIZE_BOUND]);
     691  struct timespec decode_timespec (char const *, char **, bool);
     692  
     693  /* Return true if T does not represent an out-of-range or invalid value.  */
     694  COMMON_INLINE bool
     695  valid_timespec (struct timespec t)
     696  {
     697    return 0 <= t.tv_nsec;
     698  }
     699  
     700  bool must_be_dot_or_slash (char const *);
     701  
     702  enum remove_option
     703  {
     704    ORDINARY_REMOVE_OPTION,
     705    RECURSIVE_REMOVE_OPTION,
     706  
     707    /* FIXME: The following value is never used. It seems to be intended
     708       as a placeholder for a hypothetical option that should instruct tar
     709       to recursively remove subdirectories in purge_directory(),
     710       as opposed to the functionality of --recursive-unlink
     711       (RECURSIVE_REMOVE_OPTION value), which removes them in
     712       prepare_to_extract() phase. However, with the addition of more
     713       meta-info to the incremental dumps, this should become unnecessary */
     714    WANT_DIRECTORY_REMOVE_OPTION
     715  };
     716  int remove_any_file (const char *file_name, enum remove_option option);
     717  bool maybe_backup_file (const char *file_name, bool this_is_the_archive);
     718  void undo_last_backup (void);
     719  
     720  int deref_stat (char const *name, struct stat *buf);
     721  
     722  size_t blocking_read (int fd, void *buf, size_t count);
     723  size_t blocking_write (int fd, void const *buf, size_t count);
     724  
     725  extern int chdir_current;
     726  extern int chdir_fd;
     727  int chdir_arg (char const *dir);
     728  void chdir_do (int dir);
     729  int chdir_count (void);
     730  
     731  void close_diag (char const *name);
     732  void open_diag (char const *name);
     733  void read_diag_details (char const *name, off_t offset, size_t size);
     734  void readlink_diag (char const *name);
     735  void savedir_diag (char const *name);
     736  void seek_diag_details (char const *name, off_t offset);
     737  void stat_diag (char const *name);
     738  void file_removed_diag (const char *name, bool top_level,
     739  			void (*diagfn) (char const *name));
     740  void write_error_details (char const *name, size_t status, size_t size);
     741  _Noreturn void write_fatal (char const *name);
     742  _Noreturn void write_fatal_details (char const *name, ssize_t status, size_t size);
     743  
     744  pid_t xfork (void);
     745  void xpipe (int fd[2]);
     746  
     747  void *page_aligned_alloc (void **ptr, size_t size);
     748  int set_file_atime (int fd, int parentfd, char const *file,
     749  		    struct timespec atime);
     750  
     751  /* Module names.c.  */
     752  
     753  enum files_count
     754    {
     755      FILES_NONE,
     756      FILES_ONE,
     757      FILES_MANY
     758    };
     759  extern enum files_count filename_args;
     760  
     761  /* Return true if there are file names in the list */
     762  COMMON_INLINE bool
     763  name_more_files (void)
     764  {
     765    return filename_args != FILES_NONE;
     766  }
     767  
     768  extern struct name *gnu_list_name;
     769  
     770  void gid_to_gname (gid_t gid, char **gname);
     771  int gname_to_gid (char const *gname, gid_t *pgid);
     772  void uid_to_uname (uid_t uid, char **uname);
     773  int uname_to_uid (char const *uname, uid_t *puid);
     774  
     775  void name_init (void);
     776  void name_add_name (const char *name);
     777  void name_term (void);
     778  const char *name_next (int change_dirs);
     779  void name_gather (void);
     780  struct name *addname (char const *string, int change_dir,
     781  		      bool cmdline, struct name *parent);
     782  void add_starting_file (char const *file_name);
     783  void remname (struct name *name);
     784  bool name_match (const char *name);
     785  void names_notfound (void);
     786  void label_notfound (void);
     787  void collect_and_sort_names (void);
     788  struct name *name_scan (const char *name, bool exact);
     789  struct name const *name_from_list (void);
     790  void blank_name_list (void);
     791  char *make_file_name (const char *dir_name, const char *name);
     792  size_t stripped_prefix_len (char const *file_name, size_t num);
     793  bool all_names_found (struct tar_stat_info *st);
     794  
     795  void add_avoided_name (char const *name);
     796  bool is_avoided_name (char const *name);
     797  
     798  bool contains_dot_dot (char const *name);
     799  
     800  #define ISFOUND(c) (occurrence_option == 0			\
     801  		    ? (c)->found_count != 0			\
     802  		    : (c)->found_count == occurrence_option)
     803  #define WASFOUND(c) (occurrence_option == 0			\
     804  		     ? (c)->found_count != 0			\
     805  		     : (c)->found_count >= occurrence_option)
     806  
     807  /* Module tar.c.  */
     808  
     809  _Noreturn void usage (int);
     810  
     811  int confirm (const char *message_action, const char *name);
     812  
     813  void tar_stat_init (struct tar_stat_info *st);
     814  bool tar_stat_close (struct tar_stat_info *st);
     815  void tar_stat_destroy (struct tar_stat_info *st);
     816  _Noreturn void usage (int);
     817  int tar_timespec_cmp (struct timespec a, struct timespec b);
     818  const char *archive_format_string (enum archive_format fmt);
     819  const char *subcommand_string (enum subcommand c);
     820  void set_exit_status (int val);
     821  
     822  void request_stdin (const char *option);
     823  
     824  int decode_signal (const char *);
     825  
     826  /* Where an option comes from: */
     827  enum option_source
     828    {
     829      OPTS_ENVIRON,        /* Environment variable TAR_OPTIONS */
     830      OPTS_COMMAND_LINE,   /* Command line */
     831      OPTS_FILE            /* File supplied by --files-from */
     832    };
     833  
     834  /* Option location */
     835  struct option_locus
     836  {
     837    enum option_source source;  /* Option origin */
     838    char const *name;           /* File or variable name */
     839    size_t line;                /* Number of input line if source is OPTS_FILE */
     840    struct option_locus *prev;  /* Previous occurrence of the option of same
     841  				 class */
     842  };
     843  
     844  struct tar_args        /* Variables used during option parsing */
     845  {
     846    struct option_locus *loc;
     847  
     848    struct textual_date *textual_date; /* Keeps the arguments to --newer-mtime
     849  					and/or --date option if they are
     850  					textual dates */
     851    bool o_option;                   /* True if -o option was given */
     852    bool pax_option;                 /* True if --pax-option was given */
     853    bool compress_autodetect;        /* True if compression autodetection should
     854  				      be attempted when creating archives */
     855    char const *backup_suffix_string;   /* --suffix option argument */
     856    char const *version_control_string; /* --backup option argument */
     857  };
     858  
     859  #define TAR_ARGS_INITIALIZER(loc)              \
     860    { loc, NULL, false, false, false, NULL, NULL }
     861  
     862  void more_options (int argc, char **argv, struct option_locus *loc);
     863  
     864  /* Module update.c.  */
     865  
     866  extern char *output_start;
     867  
     868  void update_archive (void);
     869  
     870  /* Module attrs.c.  */
     871  #include "xattrs.h"
     872  
     873  /* Module xheader.c.  */
     874  
     875  void xheader_decode (struct tar_stat_info *stat);
     876  void xheader_decode_global (struct xheader *xhdr);
     877  void xheader_store (char const *keyword, struct tar_stat_info *st,
     878  		    void const *data);
     879  void xheader_read (struct xheader *xhdr, union block *header, off_t size);
     880  void xheader_write (char type, char *name, time_t t, struct xheader *xhdr);
     881  void xheader_write_global (struct xheader *xhdr);
     882  void xheader_forbid_global (void);
     883  void xheader_finish (struct xheader *hdr);
     884  void xheader_destroy (struct xheader *hdr);
     885  char *xheader_xhdr_name (struct tar_stat_info *st);
     886  char *xheader_ghdr_name (void);
     887  void xheader_set_option (char *string);
     888  void xheader_string_begin (struct xheader *xhdr);
     889  void xheader_string_add (struct xheader *xhdr, char const *s);
     890  bool xheader_string_end (struct xheader *xhdr, char const *keyword);
     891  bool xheader_keyword_deleted_p (const char *kw);
     892  char *xheader_format_name (struct tar_stat_info *st, const char *fmt,
     893  			   size_t n);
     894  void xheader_xattr_init (struct tar_stat_info *st);
     895  void xheader_xattr_add (struct tar_stat_info *st,
     896                          const char *key, const char *val, size_t len);
     897  
     898  void xattr_map_init (struct xattr_map *map);
     899  void xattr_map_copy (struct xattr_map *dst,
     900  		     const struct xattr_map *src);
     901  void xattr_map_add (struct xattr_map *map,
     902  		    const char *key, const char *val, size_t len);
     903  void xattr_map_free (struct xattr_map *xattr_map);
     904  
     905  /* Module system.c */
     906  
     907  void sys_detect_dev_null_output (void);
     908  void sys_wait_for_child (pid_t, bool);
     909  void sys_spawn_shell (void);
     910  bool sys_compare_uid (struct stat *a, struct stat *b);
     911  bool sys_compare_gid (struct stat *a, struct stat *b);
     912  bool sys_file_is_archive (struct tar_stat_info *p);
     913  bool sys_compare_links (struct stat *link_data, struct stat *stat_data);
     914  int sys_truncate (int fd);
     915  pid_t sys_child_open_for_compress (void);
     916  pid_t sys_child_open_for_uncompress (void);
     917  size_t sys_write_archive_buffer (void);
     918  bool sys_get_archive_stat (void);
     919  int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st);
     920  void sys_wait_command (void);
     921  int sys_exec_info_script (const char **archive_name, int volume_number);
     922  void sys_exec_checkpoint_script (const char *script_name,
     923  				 const char *archive_name,
     924  				 int checkpoint_number);
     925  bool mtioseek (bool count_files, off_t count);
     926  
     927  /* Module compare.c */
     928  void report_difference (struct tar_stat_info *st, const char *message, ...)
     929    ATTRIBUTE_FORMAT ((printf, 2, 3));
     930  
     931  /* Module sparse.c */
     932  bool sparse_member_p (struct tar_stat_info *st);
     933  bool sparse_fixup_header (struct tar_stat_info *st);
     934  enum dump_status sparse_dump_file (int, struct tar_stat_info *st);
     935  enum dump_status sparse_extract_file (int fd, struct tar_stat_info *st,
     936  				      off_t *size);
     937  enum dump_status sparse_skim_file (struct tar_stat_info *st, bool must_copy);
     938  bool sparse_diff_file (int, struct tar_stat_info *st);
     939  
     940  /* Module utf8.c */
     941  bool string_ascii_p (const char *str);
     942  bool utf8_convert (bool to_utf, char const *input, char **output);
     943  
     944  /* Module transform.c */
     945  #define XFORM_REGFILE  0x01
     946  #define XFORM_LINK     0x02
     947  #define XFORM_SYMLINK  0x04
     948  #define XFORM_ALL      (XFORM_REGFILE|XFORM_LINK|XFORM_SYMLINK)
     949  
     950  void set_transform_expr (const char *expr);
     951  bool transform_name (char **pinput, int type);
     952  bool transform_name_fp (char **pinput, int type,
     953  			char *(*fun)(char *, void *), void *);
     954  bool transform_program_p (void);
     955  
     956  /* Module suffix.c */
     957  void set_compression_program_by_suffix (const char *name, const char *defprog);
     958  char *strip_compression_suffix (const char *name);
     959  
     960  /* Module checkpoint.c */
     961  void checkpoint_compile_action (const char *str);
     962  void checkpoint_finish_compile (void);
     963  void checkpoint_run (bool do_write);
     964  void checkpoint_finish (void);
     965  void checkpoint_flush_actions (void);
     966  
     967  /* Module warning.c */
     968  #define WARN_ALONE_ZERO_BLOCK    0x00000001
     969  #define WARN_BAD_DUMPDIR         0x00000002
     970  #define WARN_CACHEDIR            0x00000004
     971  #define WARN_CONTIGUOUS_CAST     0x00000008
     972  #define WARN_FILE_CHANGED        0x00000010
     973  #define WARN_FILE_IGNORED        0x00000020
     974  #define WARN_FILE_REMOVED        0x00000040
     975  #define WARN_FILE_SHRANK         0x00000080
     976  #define WARN_FILE_UNCHANGED      0x00000100
     977  #define WARN_FILENAME_WITH_NULS  0x00000200
     978  #define WARN_IGNORE_ARCHIVE      0x00000400
     979  #define WARN_IGNORE_NEWER        0x00000800
     980  #define WARN_NEW_DIRECTORY       0x00001000
     981  #define WARN_RENAME_DIRECTORY    0x00002000
     982  #define WARN_SYMLINK_CAST        0x00004000
     983  #define WARN_TIMESTAMP           0x00008000
     984  #define WARN_UNKNOWN_CAST        0x00010000
     985  #define WARN_UNKNOWN_KEYWORD     0x00020000
     986  #define WARN_XDEV                0x00040000
     987  #define WARN_DECOMPRESS_PROGRAM  0x00080000
     988  #define WARN_EXISTING_FILE       0x00100000
     989  #define WARN_XATTR_WRITE         0x00200000
     990  #define WARN_RECORD_SIZE         0x00400000
     991  #define WARN_FAILED_READ         0x00800000
     992  #define WARN_MISSING_ZERO_BLOCKS 0x01000000
     993  
     994  /* These warnings are enabled by default in verbose mode: */
     995  #define WARN_VERBOSE_WARNINGS    (WARN_RENAME_DIRECTORY|WARN_NEW_DIRECTORY|\
     996  				  WARN_DECOMPRESS_PROGRAM|WARN_EXISTING_FILE|\
     997  		                  WARN_RECORD_SIZE)
     998  #define WARN_ALL                 0xffffffff
     999  
    1000  void set_warning_option (const char *arg);
    1001  
    1002  extern int warning_option;
    1003  
    1004  #define WARNING_ENABLED(opt) (warning_option & (opt))
    1005  
    1006  #define WARNOPT(opt,args)			\
    1007    do						\
    1008      {						\
    1009        if (WARNING_ENABLED(opt)) WARN (args);	\
    1010      }						\
    1011    while (0)
    1012  
    1013  /* Module unlink.c */
    1014  
    1015  void queue_deferred_unlink (const char *name, bool is_dir);
    1016  void finish_deferred_unlinks (void);
    1017  
    1018  /* Module exit.c */
    1019  extern void (*fatal_exit_hook) (void);
    1020  
    1021  /* Module exclist.c */
    1022  #define EXCL_DEFAULT       0x00
    1023  #define EXCL_RECURSIVE     0x01
    1024  #define EXCL_NON_RECURSIVE 0x02
    1025  
    1026  void excfile_add (const char *name, int flags);
    1027  void info_attach_exclist (struct tar_stat_info *dir);
    1028  void info_free_exclist (struct tar_stat_info *dir);
    1029  bool excluded_name (char const *name, struct tar_stat_info *st);
    1030  void exclude_vcs_ignores (void);
    1031  
    1032  /* Module map.c */
    1033  void owner_map_read (char const *name);
    1034  int owner_map_translate (uid_t uid, uid_t *new_uid, char const **new_name);
    1035  void group_map_read (char const *file);
    1036  int group_map_translate (gid_t gid, gid_t *new_gid, char const **new_name);
    1037  
    1038  
    1039  _GL_INLINE_HEADER_END