summaryrefslogtreecommitdiff
path: root/lib/utimens.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2005-09-25 06:08:45 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2005-09-25 06:08:45 +0000
commit4f001e7a137d8c9a15efe3c3ed5088cd8b2bec8b (patch)
tree78c7d79a19500e5b0d233e3335fd952b34084c8e /lib/utimens.c
parentadd931ac28e275f75b676c7754c699863e6c0ad9 (diff)
downloadcoreutils-4f001e7a137d8c9a15efe3c3ed5088cd8b2bec8b.tar.xz
(ENOSYS): Define if not already defined.
(ftimens): Support having a null PATH if the file descriptor is nonnegative.
Diffstat (limited to 'lib/utimens.c')
-rw-r--r--lib/utimens.c55
1 files changed, 40 insertions, 15 deletions
diff --git a/lib/utimens.c b/lib/utimens.c
index 0b2f3e4d0..b60ec879a 100644
--- a/lib/utimens.c
+++ b/lib/utimens.c
@@ -41,6 +41,16 @@ struct utimbuf
};
#endif
+/* Some systems don't have ENOSYS. */
+#ifndef ENOSYS
+# ifdef ENOTSUP
+# define ENOSYS ENOTSUP
+# else
+/* Some systems don't have ENOTSUP either. */
+# define ENOSYS EINVAL
+# endif
+#endif
+
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
# define __attribute__(x)
#endif
@@ -53,7 +63,11 @@ struct utimbuf
TIMESPEC[0] and TIMESPEC[1], respectively.
FD must be either negative -- in which case it is ignored --
or a file descriptor that is open on FILE.
- If TIMESPEC is null, set the time stamps to the current time. */
+ If FD is nonnegative, then FILE can be NULL, which means
+ use just futimes (or equivalent) instead of utimes (or equivalent),
+ and fail if on an old system without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
int
futimens (int fd ATTRIBUTE_UNUSED,
@@ -78,8 +92,7 @@ futimens (int fd ATTRIBUTE_UNUSED,
# if HAVE_FUTIMESAT
return fd < 0 ? futimesat (AT_FDCWD, file, t) : futimesat (fd, NULL, t);
-# else
-# if HAVE_FUTIMES
+# elif HAVE_FUTIMES
if (0 <= fd)
{
if (futimes (fd, t) == 0)
@@ -97,23 +110,35 @@ futimens (int fd ATTRIBUTE_UNUSED,
return -1;
}
}
-# endif
- return utimes (file, t);
# endif
+#endif
-#else
+#if ! HAVE_FUTIMES_AT
- struct utimbuf utimbuf;
- struct utimbuf const *t;
- if (timespec)
+ if (!file)
{
- utimbuf.actime = timespec[0].tv_sec;
- utimbuf.modtime = timespec[1].tv_sec;
- t = &utimbuf;
+ errno = ENOSYS;
+ return -1;
}
- else
- t = NULL;
- return utime (file, t);
+
+# if HAVE_WORKING_UTIMES
+ return utimes (file, t);
+# else
+ {
+ struct utimbuf utimbuf;
+ struct utimbuf const *ut;
+ if (timespec)
+ {
+ utimbuf.actime = timespec[0].tv_sec;
+ utimbuf.modtime = timespec[1].tv_sec;
+ ut = &utimbuf;
+ }
+ else
+ ut = NULL;
+
+ return utime (file, ut);
+ }
+# endif
#endif
}