X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fcommon.h;h=77c353bc46a25a5124bf18bb99e2d0577afa7af3;hb=5249a993776ba32c851cf6eb3734958512d55d11;hp=b893fcc944fad45a3b5bd4c7a96ead0b4e9cfb6e;hpb=4f4a858eb6c0413aff0e4a0a787f151563643666;p=chaz%2Ftar diff --git a/src/common.h b/src/common.h index b893fcc..77c353b 100644 --- a/src/common.h +++ b/src/common.h @@ -55,6 +55,7 @@ #include #include #include +#include #include #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free @@ -113,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; @@ -188,15 +195,11 @@ GLOBAL struct timespec newer_mtime_option; /* Return true if the struct stat ST's M time is less than newer_mtime_option. */ #define OLDER_STAT_TIME(st, m) \ - timespec_lt (get_stat_##m##time (&st), newer_mtime_option) + (timespec_cmp (get_stat_##m##time (&(st)), newer_mtime_option) < 0) -/* Return true if A < B. */ -static inline bool -timespec_lt (struct timespec a, struct timespec b) -{ - return (a.tv_sec < b.tv_sec - || (a.tv_sec == b.tv_sec && a.tv_nsec < b.tv_nsec)); -} +/* Likewise, for struct tar_stat_info ST. */ +#define OLDER_TAR_STAT_TIME(st, m) \ + (timespec_cmp ((st).m##time, newer_mtime_option) < 0) /* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */ GLOBAL int recursion_option; @@ -316,6 +319,13 @@ GLOBAL dev_t root_device; /* Unquote filenames */ 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 */ + /* Declarations for each module. */ @@ -333,10 +343,11 @@ extern enum access_mode access_mode; /* Module buffer.c. */ extern FILE *stdlis; -extern char *save_name; -extern off_t save_sizeleft; -extern off_t save_totsize; extern bool write_archive_to_stdout; +extern char *volume_label; +extern char *continued_file_name; +extern uintmax_t continued_file_size; +extern uintmax_t continued_file_offset; size_t available_space_after (union block *); off_t current_block_ordinal (void); @@ -358,6 +369,12 @@ void archive_read_error (void); off_t seek_archive (off_t size); void set_start_time (void); +void mv_begin (struct tar_stat_info *st); +void mv_end (void); +void mv_total_size (off_t size); +void mv_size_left (off_t size); + + /* Module create.c. */ enum dump_status @@ -375,6 +392,8 @@ 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 (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); void check_links (void); @@ -426,6 +445,11 @@ char *get_directory_contents (char *, dev_t); void read_directory_file (void); void write_directory_file (void); void purge_directory (char const *); +void list_dumpdir (char *buffer, size_t size); +void update_parent_directory (const char *name); + +size_t dumpdir_size (const char *p); +void get_gnu_dumpdir (void); /* Module list.c. */ @@ -496,6 +520,10 @@ char *quote_copy_string (const char *); int unquote_string (char *); void code_ns_fraction (int, char *); +char const *code_timespec (struct timespec, char *); +enum { BILLION = 1000000000, LOG10_BILLION = 9 }; +enum { TIMESPEC_STRSIZE_BOUND = + UINTMAX_STRSIZE_BOUND + LOG10_BILLION + sizeof "-." - 1 }; size_t dot_dot_prefix_len (char const *); @@ -588,6 +616,7 @@ void request_stdin (const char *); 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); /* Module update.c. */ @@ -599,7 +628,7 @@ void update_archive (void); void xheader_decode (struct tar_stat_info *); void xheader_decode_global (void); -void xheader_store (char const *, struct tar_stat_info const *, void *); +void xheader_store (char const *, struct tar_stat_info const *, void const *); void xheader_read (union block *, size_t); void xheader_write (char type, char *name, struct xheader *xhdr); void xheader_write_global (void); @@ -610,6 +639,12 @@ char *xheader_ghdr_name (void); void xheader_write (char, char *, struct xheader *); void xheader_write_global (void); void xheader_set_option (char *string); +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 */ @@ -645,120 +680,3 @@ bool sparse_diff_file (int, struct tar_stat_info *); /* Module utf8.c */ bool string_ascii_p (const char *str); bool utf8_convert (bool to_utf, char const *input, char **output); - - -/* FIXME: The following should get moved into gnulib. */ - -static inline struct timespec -get_stat_atime (struct stat const *st) -{ -#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - return st->st_atim; -#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - return st->st_atimespec; -#else - struct timespec t; - t.tv_sec = st->st_atime; -# if defined HAVE_STRUCT_STAT_ST_ATIMENSEC - t.tv_nsec = st->stat.st_atimensec; -# elif defined HAVE_STRUCT_STAT_ST_SPARE1 - t.tv_nsec = st->stat.st_spare1 * 1000; -# else - t.tv_nsec = 0; -# endif - return t; -#endif -} - -static inline struct timespec -get_stat_ctime (struct stat const *st) -{ -#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - return st->st_ctim; -#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - return st->st_ctimespec; -#else - struct timespec t; - t.tv_sec = st->st_ctime; -# if defined HAVE_STRUCT_STAT_ST_ATIMENSEC - t.tv_nsec = st->stat.st_ctimensec; -# elif defined HAVE_STRUCT_STAT_ST_SPARE1 - t.tv_nsec = st->stat.st_spare1 * 1000; -# else - t.tv_nsec = 0; -# endif - return t; -#endif -} - -static inline struct timespec -get_stat_mtime (struct stat const *st) -{ -#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - return st->st_mtim; -#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - return st->st_mtimespec; -#else - struct timespec t; - t.tv_sec = st->st_mtime; -# if defined HAVE_STRUCT_STAT_ST_ATIMENSEC - t.tv_nsec = st->stat.st_mtimensec; -# elif defined HAVE_STRUCT_STAT_ST_SPARE1 - t.tv_nsec = st->stat.st_spare1 * 1000; -# else - t.tv_nsec = 0; -# endif - return t; -#endif -} - -static inline void -set_stat_atime (struct stat *st, struct timespec t) -{ -#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - st->st_atim = t; -#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - st->st_atimespec = t; -#else - st->st_atime = t.tv_sec; -# if defined HAVE_STRUCT_STAT_ST_ATIMENSEC - st->stat.st_atimensec = t.tv_nsec; -# elif defined HAVE_STRUCT_STAT_ST_SPARE1 - st->stat.st_spare1 = t.tv_nsec / 1000; -# endif -#endif -} - -static inline void -set_stat_ctime (struct stat *st, struct timespec t) -{ -#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - st->st_ctim = t; -#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - st->st_ctimespec = t; -#else - st->st_ctime = t.tv_sec; -# if defined HAVE_STRUCT_STAT_ST_ATIMENSEC - st->stat.st_ctimensec = t.tv_nsec; -# elif defined HAVE_STRUCT_STAT_ST_SPARE1 - st->stat.st_spare1 = t.tv_nsec / 1000; -# endif -#endif -} - -static inline void -set_stat_mtime (struct stat *st, struct timespec t) -{ -#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - st->st_mtim = t; -#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - st->st_mtimespec = t; -#else - st->st_mtime = t.tv_sec; -# if defined HAVE_STRUCT_STAT_ST_ATIMENSEC - st->stat.st_mtimensec = t.tv_nsec; -# elif defined HAVE_STRUCT_STAT_ST_SPARE1 - st->stat.st_spare1 = t.tv_nsec / 1000; -# endif -#endif -}