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