Merge changes from gnulib for file system sub-second time stamps.

* configure.ac: Remove checks for struct stat.st_spare1, struct
stat.st_atim.tv_nsec, struct stat.st_atimespec.tv_nsec, struct
stat.st_atimensec, as gnulib now does this for us.
Similarly for LIB_CLOCK_GETTIME.
* gnulib.modules: Add stat-time.
* lib/.cvsignore: Add stat-time.h.
* src/common.h: Include stat-time.h.
(timespec_lt): Remove.  All callers changed to use timespec_cmp.
(get_stat_atime, get_stat_ctime, get_stat_mtime):
(set_stat_atime, set_stat_ctime, set_stat_mtime):
Remove; now defined by stat-time.h.
This commit is contained in:
Paul Eggert
2005-09-16 07:03:44 +00:00
parent ae5473fe02
commit 2f800ce3fb
6 changed files with 21 additions and 149 deletions

View File

@@ -1,3 +1,18 @@
2005-09-16 Paul Eggert <eggert@cs.ucla.edu>
Merge changes from gnulib for file system sub-second time stamps.
* configure.ac: Remove checks for struct stat.st_spare1, struct
stat.st_atim.tv_nsec, struct stat.st_atimespec.tv_nsec, struct
stat.st_atimensec, as gnulib now does this for us.
Similarly for LIB_CLOCK_GETTIME.
* gnulib.modules: Add stat-time.
* lib/.cvsignore: Add stat-time.h.
* src/common.h: Include stat-time.h.
(timespec_lt): Remove. All callers changed to use timespec_cmp.
(get_stat_atime, get_stat_ctime, get_stat_mtime):
(set_stat_atime, set_stat_ctime, set_stat_mtime):
Remove; now defined by stat-time.h.
2005-09-14 Sergey Poznyakoff <gray@gnu.org.ua> 2005-09-14 Sergey Poznyakoff <gray@gnu.org.ua>
* src/incremen.c (list_dumpdir): New function. Used to dump * src/incremen.c (list_dumpdir): New function. Used to dump

View File

@@ -88,27 +88,6 @@ tar_GNULIB
# paxutils modules # paxutils modules
tar_PAXUTILS tar_PAXUTILS
AC_CHECK_MEMBERS([struct stat.st_spare1, struct stat.st_atim.tv_nsec, struct stat.st_atimespec.tv_nsec, struct stat.st_atimensec], , ,
[
#include <sys/types.h>
#include <sys/stat.h>])
# Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all*
# programs in the package would end up linked with that potentially-shared
# library, inducing unnecessary run-time overhead.
# Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
# Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
tar_save_LIBS=$LIBS
LIB_CLOCK_GETTIME=
AC_SEARCH_LIBS(clock_gettime, [rt posix4])
case "$ac_cv_search_clock_gettime" in
-l*) LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime;;
esac
AC_SUBST(LIB_CLOCK_GETTIME)
AC_CHECK_FUNCS(clock_gettime)
LIBS=$tar_save_LIBS
AC_CHECK_FUNCS(fsync lstat mkfifo readlink strerror symlink setlocale utimes) AC_CHECK_FUNCS(fsync lstat mkfifo readlink strerror symlink setlocale utimes)
AC_CHECK_DECLS([getgrgid],,, [#include <grp.h>]) AC_CHECK_DECLS([getgrgid],,, [#include <grp.h>])
AC_CHECK_DECLS([getpwuid],,, [#include <pwd.h>]) AC_CHECK_DECLS([getpwuid],,, [#include <pwd.h>])

View File

@@ -32,6 +32,7 @@ safe-read
save-cwd save-cwd
savedir savedir
setenv setenv
stat-time
stdbool stdbool
stpcpy stpcpy
strdup strdup

View File

@@ -132,6 +132,7 @@ setenv.c
setenv.h setenv.h
size_max.h size_max.h
stat-macros.h stat-macros.h
stat-time.h
stdbool.h stdbool.h
stdbool_.h stdbool_.h
stpcpy.c stpcpy.c

View File

@@ -55,6 +55,7 @@
#include <modechange.h> #include <modechange.h>
#include <quote.h> #include <quote.h>
#include <safe-read.h> #include <safe-read.h>
#include <stat-time.h>
#include <timespec.h> #include <timespec.h>
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free #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 /* Return true if the struct stat ST's M time is less than
newer_mtime_option. */ newer_mtime_option. */
#define OLDER_STAT_TIME(st, m) \ #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));
}
/* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */ /* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */
GLOBAL int recursion_option; GLOBAL int recursion_option;
@@ -646,120 +639,3 @@ bool sparse_diff_file (int, struct tar_stat_info *);
/* Module utf8.c */ /* Module utf8.c */
bool string_ascii_p (const char *str); bool string_ascii_p (const char *str);
bool utf8_convert (bool to_utf, char const *input, char **output); 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
}

View File

@@ -200,11 +200,11 @@ check_time (char const *file_name, struct timespec t)
if (t.tv_sec <= 0) if (t.tv_sec <= 0)
WARN ((0, 0, _("%s: implausibly old time stamp %s"), WARN ((0, 0, _("%s: implausibly old time stamp %s"),
file_name, tartime (t, true))); file_name, tartime (t, true)));
else if (timespec_lt (start_time, t)) else if (timespec_cmp (start_time, t) < 0)
{ {
struct timespec now; struct timespec now;
gettime (&now); gettime (&now);
if (timespec_lt (now, t)) if (timespec_cmp (now, t) < 0)
{ {
unsigned long int ds = t.tv_sec - now.tv_sec; unsigned long int ds = t.tv_sec - now.tv_sec;
int dns = t.tv_nsec - now.tv_nsec; int dns = t.tv_nsec - now.tv_nsec;