changeset 6283:b377d8796118

* lib/utimens.c (futimens): Use futimesat if available. Prefer it to futimes since it doesn't have the futimes bug. * m4/utimens.m4 (gl_UTIMENS): Check for futimesat.
author Paul Eggert <eggert@cs.ucla.edu>
date Fri, 23 Sep 2005 19:18:06 +0000
parents ad1b37bff099
children 9500c37faeb5
files lib/utimens.c m4/utimens.m4
diffstat 2 files changed, 10 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lib/utimens.c
+++ b/lib/utimens.c
@@ -25,6 +25,7 @@
 #include "utimens.h"
 
 #include <errno.h>
+#include <fcntl.h>
 
 #if HAVE_UTIME_H
 # include <utime.h>
@@ -61,7 +62,7 @@
   /* There's currently no interface to set file timestamps with
      nanosecond resolution, so do the best we can, discarding any
      fractional part of the timestamp.  */
-#if HAVE_WORKING_UTIMES
+#if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
   struct timeval timeval[2];
   struct timeval const *t;
   if (timespec)
@@ -74,7 +75,11 @@
     }
   else
     t = NULL;
-# if HAVE_FUTIMES
+
+# if HAVE_FUTIMESAT
+  return fd < 0 ? futimesat (AT_FDCWD, file, t) : futimesat (fd, NULL, t);
+# else
+#  if HAVE_FUTIMES
   if (0 <= fd)
     {
       if (futimes (fd, t) == 0)
@@ -92,8 +97,9 @@
 	  return -1;
 	}
     }
+#  endif
+  return utimes (file, t);
 # endif
-  return utimes (file, t);
 
 #else
 
--- a/m4/utimens.m4
+++ b/m4/utimens.m4
@@ -13,5 +13,5 @@
   AC_REQUIRE([gl_FUNC_UTIMES])
   AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
   AC_REQUIRE([gl_CHECK_TYPE_STRUCT_UTIMBUF])
-  AC_CHECK_FUNCS_ONCE(futimes)
+  AC_CHECK_FUNCS_ONCE([futimes futimesat])
 ])