* lib/utimens.c (futimens): Use futimesat if available.
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 23 Sep 2005 19:18:06 +0000 (19:18 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 23 Sep 2005 19:18:06 +0000 (19:18 +0000)
Prefer it to futimes since it doesn't have the futimes bug.
* m4/utimens.m4 (gl_UTIMENS): Check for futimesat.

lib/utimens.c
m4/utimens.m4

index 3f4d5e6..0b2f3e4 100644 (file)
@@ -25,6 +25,7 @@
 #include "utimens.h"
 
 #include <errno.h>
+#include <fcntl.h>
 
 #if HAVE_UTIME_H
 # include <utime.h>
@@ -61,7 +62,7 @@ futimens (int fd ATTRIBUTE_UNUSED,
   /* 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 @@ futimens (int fd ATTRIBUTE_UNUSED,
     }
   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 @@ futimens (int fd ATTRIBUTE_UNUSED,
          return -1;
        }
     }
-# endif
+#  endif
   return utimes (file, t);
+# endif
 
 #else
 
index bb446c8..10f6821 100644 (file)
@@ -13,5 +13,5 @@ AC_DEFUN([gl_UTIMENS],
   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])
 ])