]> granicus.if.org Git - python/commitdiff
Issue #14626: Fix buildbot issue on OpenIndiana 3.x machines. (Hopefully.)
authorLarry Hastings <larry@hastings.org>
Sat, 23 Jun 2012 02:50:21 +0000 (19:50 -0700)
committerLarry Hastings <larry@hastings.org>
Sat, 23 Jun 2012 02:50:21 +0000 (19:50 -0700)
Lib/os.py
Modules/posixmodule.c

index fc8b92efbd7f4d0c011300927542d927b693a951..b5ad1b515dd60bd2ea8740a446419f5b882ef973 100644 (file)
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -179,16 +179,27 @@ if _exists("_have_functions"):
 
     _set = set()
     _add("HAVE_FACCESSAT",  "access")
-    # Current linux (kernel 3.2, glibc 2.15) doesn't support lchmod.
-    # (The function exists, but it's a stub that always returns ENOSUP.)
-    # Now, linux *does* have fchmodat, which says it can ignore
-    # symbolic links.  But that doesn't work either (also returns ENOSUP).
-    # I'm guessing that if they fix fchmodat, they'll also add lchmod at
-    # the same time.  So, for now, assume that fchmodat doesn't support
-    # follow_symlinks unless lchmod works.
-    if ((sys.platform != "linux") or
-        ("HAVE_LCHMOD" in _have_functions)):
-        _add("HAVE_FCHMODAT",   "chmod")
+    # Some platforms don't support lchmod().  Often the function exists
+    # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP.
+    # (No, I don't know why that's a good design.)  ./configure will detect
+    # this and reject it--so HAVE_LCHMOD still won't be defined on such
+    # platforms.  This is Very Helpful.
+    #
+    # However, sometimes platforms without a working lchmod() *do* have
+    # fchmodat().  (Examples: Linux kernel 3.2 with glibc 2.15,
+    # OpenIndiana 3.x.)  And fchmodat() has a flag that theoretically makes
+    # it behave like lchmod().  So in theory it would be a suitable
+    # replacement for lchmod().  But when lchmod() doesn't work, fchmodat()'s
+    # flag doesn't work *either*.  Sadly ./configure isn't sophisticated
+    # enough to detect this condition--it only determines whether or not
+    # fchmodat() minimally works.
+    #
+    # Therefore we simply ignore fchmodat() when deciding whether or not
+    # os.chmod supports follow_symlinks.  Just checking lchmod() is
+    # sufficient.  After all--if you have a working fchmodat(), your
+    # lchmod() almost certainly works too.
+    #
+    # _add("HAVE_FCHMODAT",   "chmod")
     _add("HAVE_FCHOWNAT",   "chown")
     _add("HAVE_FSTATAT",    "stat")
     _add("HAVE_LCHFLAGS",   "chflags")
index eb595134daf804be8ad6be92a7ccde0e2ab7fd0c..1f1711df8fa8225e5461f3d9796a4bdf83b1491b 100644 (file)
@@ -2696,7 +2696,8 @@ posix_chmod(PyObject *self, PyObject *args, PyObject *kwargs)
         /*
          * fchmodat() doesn't currently support AT_SYMLINK_NOFOLLOW!
          * The documentation specifically shows how to use it,
-         * and then says it isn't implemented yet.   (glibc 2.15)
+         * and then says it isn't implemented yet.
+         * (true on linux with glibc 2.15, and openindiana 3.x)
          *
          * Once it is supported, os.chmod will automatically
          * support dir_fd and follow_symlinks=False.  (Hopefully.)
@@ -2709,7 +2710,9 @@ posix_chmod(PyObject *self, PyObject *args, PyObject *kwargs)
          * and we can't do that in this nested scope.  (Macro trickery, sigh.)
          */
         fchmodat_nofollow_unsupported =
-                         result && (errno == ENOTSUP) && !follow_symlinks;
+                         result &&
+                         ((errno == ENOTSUP) || (errno == EOPNOTSUPP)) &&
+                         !follow_symlinks;
     }
     else
 #endif