X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcommon.h;h=5cb2efb82216cc22fceded2f862def2f1074b82d;hb=38f08784bc95745e0c5e8308d098c3bc89cc9ba5;hp=cbcd2c735d5f9995325b01d5fd1b4c48e9d9ddfb;hpb=7200f4f5f715ff558da63258b7cdc6b489078cf6;p=chaz%2Ftar diff --git a/src/common.h b/src/common.h index cbcd2c7..5cb2efb 100644 --- a/src/common.h +++ b/src/common.h @@ -114,7 +114,13 @@ GLOBAL bool utc_option; than newer_mtime_option. */ GLOBAL int after_date_option; -GLOBAL bool atime_preserve_option; +enum atime_preserve +{ + no_atime_preserve, + replace_atime_preserve, + system_atime_preserve +}; +GLOBAL enum atime_preserve atime_preserve_option; GLOBAL bool backup_option; @@ -248,6 +254,9 @@ GLOBAL bool touch_option; GLOBAL char *to_command_option; GLOBAL bool ignore_command_error_option; +/* Restrict some potentially harmful tar options */ +GLOBAL bool restrict_option; + /* Return true if the extracted files are not being written to disk */ #define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option) @@ -294,7 +303,7 @@ struct name size_t length; /* cached strlen(name) */ uintmax_t found_count; /* number of times a matching file has been found */ - int isdir; + int explicit; /* was explicitely given in the command line */ char firstch; /* first char is literally matched */ char regexp; /* this name is a regexp, not literal */ int change_dir; /* set with the -C option */ @@ -316,9 +325,15 @@ GLOBAL bool unquote_option; GLOBAL bool test_label_option; /* Test archive volume label and exit */ -GLOBAL bool show_stored_names_option; /* When creating archive in verbose mode, - list member names as stored in the - archive */ +/* When creating archive in verbose mode, list member names as stored in the + archive */ +GLOBAL bool show_stored_names_option; + +/* Delay setting modification times and permissions of extracted directories + until the end of extraction. This variable helps correctly restore directory + timestamps from archives with an unusual member order. It is automatically + set for incremental archives. */ +GLOBAL bool delay_directory_restore_option; /* Declarations for each module. */ @@ -348,8 +363,8 @@ off_t current_block_ordinal (void); void close_archive (void); void closeout_volume_number (void); union block *find_next_block (void); -void (*flush_read) (void); -void (*flush_write) (void); +void flush_read (void); +void flush_write (void); void flush_archive (void); void init_volume_number (void); void open_archive (enum access_mode); @@ -386,7 +401,7 @@ void dump_file (char *, int, dev_t); union block *start_header (struct tar_stat_info *st); void finish_header (struct tar_stat_info *, union block *, off_t); void simple_finish_header (union block *header); -union block * write_extended (char type, struct tar_stat_info *st, +union block * write_extended (bool global, struct tar_stat_info *st, union block *old_header); union block *start_private_header (const char *name, size_t size); void write_eot (void); @@ -404,15 +419,15 @@ void check_links (void); #define UNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf)) #define GNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf)) -void gid_to_chars (gid_t, char *, size_t); -void major_to_chars (major_t, char *, size_t); -void minor_to_chars (minor_t, char *, size_t); -void mode_to_chars (mode_t, char *, size_t); -void off_to_chars (off_t, char *, size_t); -void size_to_chars (size_t, char *, size_t); -void time_to_chars (time_t, char *, size_t); -void uid_to_chars (uid_t, char *, size_t); -void uintmax_to_chars (uintmax_t, char *, size_t); +bool gid_to_chars (gid_t, char *, size_t); +bool major_to_chars (major_t, char *, size_t); +bool minor_to_chars (minor_t, char *, size_t); +bool mode_to_chars (mode_t, char *, size_t); +bool off_to_chars (off_t, char *, size_t); +bool size_to_chars (size_t, char *, size_t); +bool time_to_chars (time_t, char *, size_t); +bool uid_to_chars (uid_t, char *, size_t); +bool uintmax_to_chars (uintmax_t, char *, size_t); void string_to_chars (char const *, char *, size_t); /* Module diffarch.c. */ @@ -560,7 +575,9 @@ pid_t xfork (void); void xpipe (int[2]); void *page_aligned_alloc (void **, size_t); - +int set_file_atime (int fd, char const *file, + struct timespec const timespec[2]); + /* Module names.c. */ extern struct name *gnu_list_name; @@ -580,7 +597,7 @@ struct name *addname (char const *, int); int name_match (const char *); void names_notfound (void); void collect_and_sort_names (void); -struct name *name_scan (const char *); +struct name *name_scan (const char *, bool); char *name_from_list (void); void blank_name_list (void); char *new_name (const char *, const char *); @@ -611,6 +628,8 @@ void tar_stat_init (struct tar_stat_info *st); void tar_stat_destroy (struct tar_stat_info *st); void usage (int) __attribute__ ((noreturn)); int tar_timespec_cmp (struct timespec a, struct timespec b); +const char *archive_format_string (enum archive_format fmt); +const char *subcommand_string (enum subcommand c); /* Module update.c. */ @@ -637,7 +656,9 @@ void xheader_string_begin (void); void xheader_string_add (char const *s); void xheader_string_end (char const *keyword); bool xheader_keyword_deleted_p (const char *kw); - +char *xheader_format_name (struct tar_stat_info *st, const char *fmt, + size_t n); + /* Module system.c */ void sys_detect_dev_null_output (void); @@ -656,6 +677,7 @@ size_t sys_write_archive_buffer (void); bool sys_get_archive_stat (void); int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st); void sys_wait_command (void); +int sys_exec_info_script (const char **archive_name, int volume_number); /* Module compare.c */ void report_difference (struct tar_stat_info *st, const char *message, ...);