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