-/* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Set file access and modification times.
+
+ Copyright (C) 2003, 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 the
else
t = NULL;
+
+ if (fd < 0)
+ {
# if HAVE_FUTIMESAT
- return fd < 0 ? futimesat (AT_FDCWD, file, t) : futimesat (fd, NULL, t);
-# elif HAVE_FUTIMES
- if (0 <= fd)
+ return futimesat (AT_FDCWD, file, t);
+# endif
+ }
+ else
{
+ /* If futimesat or futimes fails here, don't try to speed things
+ up by returning right away. glibc can incorrectly fail with
+ errno == ENOENT if /proc isn't mounted. Also, Mandrake 10.0
+ in high security mode doesn't allow ordinary users to read
+ /proc/self, so glibc incorrectly fails with errno == EACCES.
+ If errno == EIO, EPERM, or EROFS, it's probably safe to fail
+ right away, but these cases are rare enough that they're not
+ worth optimizing, and who knows what other messed-up systems
+ are out there? So play it safe and fall back on the code
+ below. */
+# if HAVE_FUTIMESAT
+ if (futimesat (fd, NULL, t) == 0)
+ return 0;
+# elif HAVE_FUTIMES
if (futimes (fd, t) == 0)
return 0;
-
- /* Don't worry about trying to speed things up by returning right
- away here. glibc futimes can incorrectly fail with errno ==
- ENOENT if /proc isn't mounted. Also, Mandrake 10.0 in high
- security mode doesn't allow ordinary users to read /proc/self, so
- glibc futimes incorrectly fails with errno == EACCES. If futimes
- fails with errno == EIO, EPERM, or EROFS, it's probably safe to
- fail right away, but these cases are rare enough that they're not
- worth optimizing, and who knows what other messed-up systems are
- out there? So play it safe and fall back on the code below. */
- }
# endif
+ }
#endif
-#if ! HAVE_FUTIMESAT
-
if (!file)
{
-# if ! (HAVE_WORKING_UTIMES && HAVE_FUTIMES)
+#if ! (HAVE_FUTIMESAT || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
errno = ENOSYS;
-# endif
+#endif
/* Prefer EBADF to ENOSYS if both error numbers apply. */
if (errno == ENOSYS)
return -1;
}
-# if HAVE_WORKING_UTIMES
+#if HAVE_WORKING_UTIMES
return utimes (file, t);
-# else
+#else
{
struct utimbuf utimbuf;
struct utimbuf const *ut;
return utime (file, ut);
}
-# endif
-
#endif
}