|  | @@ -55,6 +55,7 @@
 | 
	
		
			
				|  |  |  #include <modechange.h>
 | 
	
		
			
				|  |  |  #include <quote.h>
 | 
	
		
			
				|  |  |  #include <safe-read.h>
 | 
	
		
			
				|  |  | +#include <stat-time.h>
 | 
	
		
			
				|  |  |  #include <timespec.h>
 | 
	
		
			
				|  |  |  #define obstack_chunk_alloc xmalloc
 | 
	
		
			
				|  |  |  #define obstack_chunk_free free
 | 
	
	
		
			
				|  | @@ -188,15 +189,7 @@ 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)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/* 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));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +  (timespec_cmp (get_stat_##m##time (&st), newer_mtime_option) < 0)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Zero if there is no recursion, otherwise FNM_LEADING_DIR.  */
 | 
	
		
			
				|  |  |  GLOBAL int recursion_option;
 | 
	
	
		
			
				|  | @@ -646,120 +639,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
 | 
	
		
			
				|  |  | -}
 |