X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Futimecmp.c;h=e0bfcb63520b35605f66625099158b36529d9174;hb=2261dd45772d0344092bbecd9ecc9e6164a6c4e3;hp=1ff61f39aefb260b1d41eb198a8dddaceb073525;hpb=41051009bb2982be6f3ce70986f21b855e5fc888;p=gnulib.git diff --git a/lib/utimecmp.c b/lib/utimecmp.c index 1ff61f39a..e0bfcb635 100644 --- a/lib/utimecmp.c +++ b/lib/utimecmp.c @@ -1,6 +1,6 @@ /* utimecmp.c -- compare file time stamps - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,56 +14,41 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Paul Eggert. */ -#if HAVE_CONFIG_H -# include -#endif +#include #include "utimecmp.h" -#if HAVE_INTTYPES_H -# include -#endif -#if HAVE_STDINT_H -# include -#endif - #include #include +#include #include #include "hash.h" +#include "intprops.h" +#include "stat-time.h" #include "timespec.h" #include "utimens.h" +#include "verify.h" #include "xalloc.h" -/* Verify a requirement at compile-time (unlike assert, which is runtime). */ -#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } - #ifndef MAX # define MAX(a, b) ((a) > (b) ? (a) : (b)) #endif -#ifndef SIZE_MAX -# define SIZE_MAX ((size_t) -1) -#endif - -/* The extra casts work around common compiler bugs. */ -#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) -/* The outer cast is needed to work around a bug in Cray C 5.0.3.0. - It is necessary at least when t == time_t. */ -#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ - ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) -#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) - enum { BILLION = 1000 * 1000 * 1000 }; /* Best possible resolution that utimens can set and stat can return, due to system-call limitations. It must be a power of 10 that is no greater than 1 billion. */ -#if HAVE_WORKING_UTIMES && defined ST_MTIM_NSEC +#if (HAVE_WORKING_UTIMES \ + && (defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC \ + || defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC \ + || defined HAVE_STRUCT_STAT_ST_ATIMENSEC \ + || defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC \ + || defined HAVE_STRUCT_STAT_ST_SPARE1)) enum { SYSCALL_RESOLUTION = 1000 }; #else enum { SYSCALL_RESOLUTION = BILLION }; @@ -140,14 +125,14 @@ utimecmp (char const *dst_name, time_t might be unsigned. */ - verify (time_t_is_integer, (time_t) 0.5 == 0); - verify (twos_complement_arithmetic, -1 == ~1 + 1); + verify (TYPE_IS_INTEGER (time_t)); + verify (TYPE_TWOS_COMPLEMENT (int)); /* Destination and source time stamps. */ time_t dst_s = dst_stat->st_mtime; time_t src_s = src_stat->st_mtime; - int dst_ns = TIMESPEC_NS (dst_stat->st_mtim); - int src_ns = TIMESPEC_NS (src_stat->st_mtim); + int dst_ns = get_stat_mtime_ns (dst_stat); + int src_ns = get_stat_mtime_ns (src_stat); if (options & UTIMECMP_TRUNCATE_SOURCE) { @@ -193,8 +178,8 @@ utimecmp (char const *dst_name, time_t dst_a_s = dst_stat->st_atime; time_t dst_c_s = dst_stat->st_ctime; time_t dst_m_s = dst_s; - int dst_a_ns = TIMESPEC_NS (dst_stat->st_atim); - int dst_c_ns = TIMESPEC_NS (dst_stat->st_ctim); + int dst_a_ns = get_stat_atime_ns (dst_stat); + int dst_c_ns = get_stat_ctime_ns (dst_stat); int dst_m_ns = dst_ns; /* Set RES to an upper bound on the file system resolution @@ -287,7 +272,7 @@ utimecmp (char const *dst_name, if (stat_result | (dst_status.st_mtime ^ dst_m_s) - | (TIMESPEC_NS (dst_status.st_mtim) ^ dst_m_ns)) + | (get_stat_mtime_ns (&dst_status) ^ dst_m_ns)) { /* The modification time changed, or we can't tell whether it changed. Change it back as best we can. */ @@ -305,7 +290,7 @@ utimecmp (char const *dst_name, { int old_res = res; int a = (BILLION * (dst_status.st_mtime & 1) - + TIMESPEC_NS (dst_status.st_mtim)); + + get_stat_mtime_ns (&dst_status)); res = SYSCALL_RESOLUTION;