[Top][All Lists]
[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
}