From 63a297994b9226276d36ecf986e301f3f83fccf0 Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 19 Nov 2007 09:48:00 +0000 Subject: [PATCH] * file.c (utime_internal): fallback utimensat to utimes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13970 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ file.c | 30 +++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 047bc9b090..b6008c1fb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Nov 19 18:46:49 2007 Tanaka Akira + + * file.c (utime_internal): fallback utimensat to utimes. + Mon Nov 19 17:51:27 2007 Tanaka Akira * configure.in: check struct timespec, clock_gettime, utimensat, diff --git a/file.c b/file.c index 6f199f6625..a7822d0c3b 100644 --- a/file.c +++ b/file.c @@ -2041,23 +2041,31 @@ rb_file_s_lchown(int argc, VALUE *argv) struct timespec rb_time_timespec(VALUE time); -#if defined(HAVE_UTIMENSAT) - -static void -utime_internal(const char *path, void *arg) -{ - struct timespec *tsp = arg; - if (utimensat(AT_FDCWD, path, tsp, 0) < 0) - rb_sys_fail(path); -} - -#elif defined(HAVE_UTIMES) +#if defined(HAVE_UTIMES) static void utime_internal(const char *path, void *arg) { struct timespec *tsp = arg; struct timeval tvbuf[2], *tvp = arg; + +#ifdef HAVE_UTIMENSAT + static int try_utimensat = 1; + + if (try_utimensat) { + struct timespec *tsp = arg; + if (utimensat(AT_FDCWD, path, tsp, 0) < 0) { + if (errno == ENOSYS) { + try_utimensat = 0; + goto no_utimensat; + } + rb_sys_fail(path); + } + return; + } +no_utimensat: +#endif + if (tsp) { tvbuf[0].tv_sec = tsp[0].tv_sec; tvbuf[0].tv_usec = tsp[0].tv_nsec / 1000;