s3: Fix bug 7940 -- fall back for utimes calls
authorVolker Lendecke <vl@samba.org>
Sat, 29 Jan 2011 09:59:14 +0000 (10:59 +0100)
committerVolker Lendecke <vlendec@samba.org>
Tue, 1 Feb 2011 21:37:35 +0000 (22:37 +0100)
There are systems where ./configure has detected advanced utimes calls which
are then not available on other kernels. We should do a proper fallback.

Autobuild-User: Volker Lendecke <vlendec@samba.org>
Autobuild-Date: Tue Feb  1 22:37:35 CET 2011 on sn-devel-104

source3/modules/vfs_default.c

index 9cca3494137dafc456fb9e5f0b7dab289380954a..698e745d5904dc989748fd829914324825acedd3 100644 (file)
@@ -786,7 +786,11 @@ static int vfswrap_ntimes(vfs_handle_struct *handle,
        } else {
                result = utimensat(AT_FDCWD, smb_fname->base_name, NULL, 0);
        }
-#elif defined(HAVE_UTIMES)
+       if (!((result == -1) && (errno == ENOSYS))) {
+               goto out;
+       }
+#endif
+#if defined(HAVE_UTIMES)
        if (ft != NULL) {
                struct timeval tv[2];
                tv[0] = convert_timespec_to_timeval(ft->atime);
@@ -795,7 +799,11 @@ static int vfswrap_ntimes(vfs_handle_struct *handle,
        } else {
                result = utimes(smb_fname->base_name, NULL);
        }
-#elif defined(HAVE_UTIME)
+       if (!((result == -1) && (errno == ENOSYS))) {
+               goto out;
+       }
+#endif
+#if defined(HAVE_UTIME)
        if (ft != NULL) {
                struct utimbuf times;
                times.actime = convert_timespec_to_time_t(ft->atime);
@@ -804,10 +812,12 @@ static int vfswrap_ntimes(vfs_handle_struct *handle,
        } else {
                result = utime(smb_fname->base_name, NULL);
        }
-#else
+       if (!((result == -1) && (errno == ENOSYS))) {
+               goto out;
+       }
+#endif
        errno = ENOSYS;
        result = -1;
-#endif
 
  out:
        END_PROFILE(syscall_ntimes);