bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] cp -p doesn't work with HAVE_FUTIMENS and without /proc


From: Paul Eggert
Subject: Re: [PATCH] cp -p doesn't work with HAVE_FUTIMENS and without /proc
Date: Sat, 15 Apr 2006 00:45:11 -0700
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

Kir Kolyshkin <address@hidden> writes:

> Apparently, there is a fallback path for futimes, but there is no such
> path for futimesat.

Thanks for the bug report and patch.  The patch is the right idea,
but there is a minor problem for the ENOSYS case.  I installed this
instead, into gnulib and coreutils; I hope it fixes your problem.

2006-04-15  Paul Eggert  <address@hidden>

        * utimens.c (futimens): glibc futimesat messes up if /proc
        isn't mounted.  Problem reported by Kir Kolyshkin.

--- utimens.c   30 Oct 2005 21:32:02 -0000      1.11
+++ utimens.c   15 Apr 2006 07:39:46 -0000      1.12
@@ -1,4 +1,6 @@
-/* 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
@@ -91,34 +93,40 @@ futimens (int fd ATTRIBUTE_UNUSED,
   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)
@@ -133,9 +141,9 @@ futimens (int fd ATTRIBUTE_UNUSED,
       return -1;
     }
 
-# if HAVE_WORKING_UTIMES
+#if HAVE_WORKING_UTIMES
   return utimes (file, t);
-# else
+#else
   {
     struct utimbuf utimbuf;
     struct utimbuf const *ut;
@@ -150,8 +158,6 @@ futimens (int fd ATTRIBUTE_UNUSED,
 
     return utime (file, ut);
   }
-# endif
-
 #endif
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]