X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Futimecmp.c;h=6a9087398bd09bdb8eb4873027ce9d729761494b;hb=5a21606b0d57082670bd060d169492c2f3a410f2;hp=1ff61f39aefb260b1d41eb198a8dddaceb073525;hpb=41051009bb2982be6f3ce70986f21b855e5fc888;p=gnulib.git
diff --git a/lib/utimecmp.c b/lib/utimecmp.c
index 1ff61f39a..6a9087398 100644
--- a/lib/utimecmp.c
+++ b/lib/utimecmp.c
@@ -1,11 +1,11 @@
/* utimecmp.c -- compare file time stamps
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
- This program is free software; you can redistribute it and/or modify
+ 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
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -13,57 +13,41 @@
GNU General Public License for more details.
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. */
+ along with this program. If not, see . */
/* 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
#include "hash.h"
-#include "timespec.h"
+#include "intprops.h"
+#include "stat-time.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 +124,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 +177,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 +271,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 +289,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;