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