X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcommon.h;h=a4352c3914a1d833782ed0c4298bd2ad6603cb06;hb=3209329337c87a102fa12d7eb60a3df323ba56c1;hp=70a925c912d7a8f073c4f7bc6d630d181cbed263;hpb=d659cbaccdc1f3279c49107cf15f15a639738529;p=chaz%2Ftar diff --git a/src/common.h b/src/common.h index 70a925c..a4352c3 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 @@ -188,14 +189,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 -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; @@ -425,6 +423,7 @@ 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); /* Module list.c. */ @@ -495,6 +494,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 *); @@ -644,120 +647,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 -}