Commit 73e764ed authored by Ned Deily's avatar Ned Deily

Issue #8746: Correct faulty configure checks so that os.chflags() and

os.lchflags() are once again built on systems that support these
functions (*BSD and OS X).  Also add new stat file flags for OS X
(UF_HIDDEN and UF_COMPRESSED).  Also add additional tests for
os.chflags() and os.lchflags(). (Tests by Garrett Cooper)
parents f43765c2 0067017e
...@@ -1465,6 +1465,8 @@ Files and Directories ...@@ -1465,6 +1465,8 @@ Files and Directories
* :data:`stat.UF_APPEND` * :data:`stat.UF_APPEND`
* :data:`stat.UF_OPAQUE` * :data:`stat.UF_OPAQUE`
* :data:`stat.UF_NOUNLINK` * :data:`stat.UF_NOUNLINK`
* :data:`stat.UF_COMPRESSED`
* :data:`stat.UF_HIDDEN`
* :data:`stat.SF_ARCHIVED` * :data:`stat.SF_ARCHIVED`
* :data:`stat.SF_IMMUTABLE` * :data:`stat.SF_IMMUTABLE`
* :data:`stat.SF_APPEND` * :data:`stat.SF_APPEND`
......
...@@ -307,13 +307,21 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`: ...@@ -307,13 +307,21 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`:
The file may only be appended to. The file may only be appended to.
.. data:: UF_OPAQUE
The directory is opaque when viewed through a union stack.
.. data:: UF_NOUNLINK .. data:: UF_NOUNLINK
The file may not be renamed or deleted. The file may not be renamed or deleted.
.. data:: UF_OPAQUE .. data:: UF_COMPRESSED
The directory is opaque when viewed through a union stack. The file is stored compressed (Mac OS X 10.6+).
.. data:: UF_HIDDEN
The file should not be displayed in a GUI (Mac OS X 10.5+).
.. data:: SF_ARCHIVED .. data:: SF_ARCHIVED
......
...@@ -87,6 +87,8 @@ UF_IMMUTABLE = 0x00000002 ...@@ -87,6 +87,8 @@ UF_IMMUTABLE = 0x00000002
UF_APPEND = 0x00000004 UF_APPEND = 0x00000004
UF_OPAQUE = 0x00000008 UF_OPAQUE = 0x00000008
UF_NOUNLINK = 0x00000010 UF_NOUNLINK = 0x00000010
UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed
UF_HIDDEN = 0x00008000 # OS X: file should not be displayed
SF_ARCHIVED = 0x00010000 SF_ARCHIVED = 0x00010000
SF_IMMUTABLE = 0x00020000 SF_IMMUTABLE = 0x00020000
SF_APPEND = 0x00040000 SF_APPEND = 0x00040000
......
...@@ -16,6 +16,7 @@ import stat ...@@ -16,6 +16,7 @@ import stat
import unittest import unittest
import warnings import warnings
_DUMMY_SYMLINK = '%s/dummy-symlink' % os.getenv('TMPDIR', '/tmp')
class PosixTester(unittest.TestCase): class PosixTester(unittest.TestCase):
...@@ -23,13 +24,15 @@ class PosixTester(unittest.TestCase): ...@@ -23,13 +24,15 @@ class PosixTester(unittest.TestCase):
# create empty file # create empty file
fp = open(support.TESTFN, 'w+') fp = open(support.TESTFN, 'w+')
fp.close() fp.close()
self.teardown_files = [ support.TESTFN ]
self._warnings_manager = support.check_warnings() self._warnings_manager = support.check_warnings()
self._warnings_manager.__enter__() self._warnings_manager.__enter__()
warnings.filterwarnings('ignore', '.* potential security risk .*', warnings.filterwarnings('ignore', '.* potential security risk .*',
RuntimeWarning) RuntimeWarning)
def tearDown(self): def tearDown(self):
support.unlink(support.TESTFN) for teardown_file in self.teardown_files:
support.unlink(teardown_file)
self._warnings_manager.__exit__(None, None, None) self._warnings_manager.__exit__(None, None, None)
def testNoArgFunctions(self): def testNoArgFunctions(self):
...@@ -426,7 +429,7 @@ class PosixTester(unittest.TestCase): ...@@ -426,7 +429,7 @@ class PosixTester(unittest.TestCase):
def test_lchown(self): def test_lchown(self):
os.unlink(support.TESTFN) os.unlink(support.TESTFN)
# create a symlink # create a symlink
os.symlink('/tmp/dummy-symlink-target', support.TESTFN) os.symlink(_DUMMY_SYMLINK, support.TESTFN)
self._test_all_chown_common(posix.lchown, support.TESTFN) self._test_all_chown_common(posix.lchown, support.TESTFN)
def test_chdir(self): def test_chdir(self):
...@@ -511,17 +514,49 @@ class PosixTester(unittest.TestCase): ...@@ -511,17 +514,49 @@ class PosixTester(unittest.TestCase):
posix.utime(support.TESTFN, (int(now), int(now))) posix.utime(support.TESTFN, (int(now), int(now)))
posix.utime(support.TESTFN, (now, now)) posix.utime(support.TESTFN, (now, now))
def _test_chflags_regular_file(self, chflags_func, target_file):
st = os.stat(target_file)
self.assertTrue(hasattr(st, 'st_flags'))
chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE)
try:
new_st = os.stat(target_file)
self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
try:
fd = open(target_file, 'w+')
except IOError as e:
self.assertEqual(e.errno, errno.EPERM)
finally:
posix.chflags(target_file, st.st_flags)
@unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
def test_chflags(self): def test_chflags(self):
if hasattr(posix, 'chflags'): self._test_chflags_regular_file(posix.chflags, support.TESTFN)
st = os.stat(support.TESTFN)
if hasattr(st, 'st_flags'): @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
posix.chflags(support.TESTFN, st.st_flags) def test_lchflags_regular_file(self):
self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
def test_lchflags(self):
if hasattr(posix, 'lchflags'): @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
st = os.stat(support.TESTFN) def test_lchflags_symlink(self):
if hasattr(st, 'st_flags'): testfn_st = os.stat(support.TESTFN)
posix.lchflags(support.TESTFN, st.st_flags)
self.assertTrue(hasattr(testfn_st, 'st_flags'))
os.symlink(support.TESTFN, _DUMMY_SYMLINK)
self.teardown_files.append(_DUMMY_SYMLINK)
dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
posix.lchflags(_DUMMY_SYMLINK,
dummy_symlink_st.st_flags | stat.UF_IMMUTABLE)
try:
new_testfn_st = os.stat(support.TESTFN)
new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
new_dummy_symlink_st.st_flags)
finally:
posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
def test_environ(self): def test_environ(self):
if os.name == "nt": if os.name == "nt":
......
...@@ -191,6 +191,7 @@ Juan José Conti ...@@ -191,6 +191,7 @@ Juan José Conti
Matt Conway Matt Conway
David M. Cooke David M. Cooke
Jason R. Coombs Jason R. Coombs
Garrett Cooper
Greg Copeland Greg Copeland
Aldo Cortesi Aldo Cortesi
David Costanzo David Costanzo
......
...@@ -857,6 +857,11 @@ Library ...@@ -857,6 +857,11 @@ Library
Build Build
----- -----
- Issue #8746: Correct faulty configure checks so that os.chflags() and
os.lchflags() are once again built on systems that support these
functions (*BSD and OS X). Also add new stat file flags for OS X
(UF_HIDDEN and UF_COMPRESSED).
- Issue #10645: Installing Python does no longer create a - Issue #10645: Installing Python does no longer create a
Python-X.Y.Z-pyX.Y.egg-info file in the lib-dynload directory. Python-X.Y.Z-pyX.Y.egg-info file in the lib-dynload directory.
...@@ -908,6 +913,9 @@ Extension Modules ...@@ -908,6 +913,9 @@ Extension Modules
Tests Tests
----- -----
- Issue #8746: Add additional tests for os.chflags() and os.lchflags().
Patch by Garrett Cooper.
- Issue #10736: Fix test_ttk test_widgets failures with Cocoa Tk 8.5.9 - Issue #10736: Fix test_ttk test_widgets failures with Cocoa Tk 8.5.9
2.8 + on Mac OS X. (Patch by Ronald Oussoren) 2.8 + on Mac OS X. (Patch by Ronald Oussoren)
......
...@@ -9912,7 +9912,7 @@ else ...@@ -9912,7 +9912,7 @@ else
else else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
[
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
int main(int argc, char*argv[]) int main(int argc, char*argv[])
...@@ -9921,7 +9921,7 @@ int main(int argc, char*argv[]) ...@@ -9921,7 +9921,7 @@ int main(int argc, char*argv[])
return 1; return 1;
return 0; return 0;
} }
]
_ACEOF _ACEOF
if ac_fn_c_try_run "$LINENO"; then : if ac_fn_c_try_run "$LINENO"; then :
ac_cv_have_chflags=yes ac_cv_have_chflags=yes
...@@ -9961,7 +9961,7 @@ else ...@@ -9961,7 +9961,7 @@ else
else else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
[
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
int main(int argc, char*argv[]) int main(int argc, char*argv[])
...@@ -9970,7 +9970,7 @@ int main(int argc, char*argv[]) ...@@ -9970,7 +9970,7 @@ int main(int argc, char*argv[])
return 1; return 1;
return 0; return 0;
} }
]
_ACEOF _ACEOF
if ac_fn_c_try_run "$LINENO"; then : if ac_fn_c_try_run "$LINENO"; then :
ac_cv_have_lchflags=yes ac_cv_have_lchflags=yes
......
...@@ -2675,7 +2675,7 @@ AC_CHECK_LIB(c, inet_aton, [$ac_cv_prog_TRUE], ...@@ -2675,7 +2675,7 @@ AC_CHECK_LIB(c, inet_aton, [$ac_cv_prog_TRUE],
# On Tru64, chflags seems to be present, but calling it will # On Tru64, chflags seems to be present, but calling it will
# exit Python # exit Python
AC_CACHE_CHECK([for chflags], [ac_cv_have_chflags], [dnl AC_CACHE_CHECK([for chflags], [ac_cv_have_chflags], [dnl
AC_RUN_IFELSE([AC_LANG_SOURCE([[[ AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
int main(int argc, char*argv[]) int main(int argc, char*argv[])
...@@ -2684,7 +2684,7 @@ int main(int argc, char*argv[]) ...@@ -2684,7 +2684,7 @@ int main(int argc, char*argv[])
return 1; return 1;
return 0; return 0;
} }
]]])], ]])],
[ac_cv_have_chflags=yes], [ac_cv_have_chflags=yes],
[ac_cv_have_chflags=no], [ac_cv_have_chflags=no],
[ac_cv_have_chflags=cross]) [ac_cv_have_chflags=cross])
...@@ -2693,11 +2693,11 @@ if test "$ac_cv_have_chflags" = cross ; then ...@@ -2693,11 +2693,11 @@ if test "$ac_cv_have_chflags" = cross ; then
AC_CHECK_FUNC([chflags], [ac_cv_have_chflags="yes"], [ac_cv_have_chflags="no"]) AC_CHECK_FUNC([chflags], [ac_cv_have_chflags="yes"], [ac_cv_have_chflags="no"])
fi fi
if test "$ac_cv_have_chflags" = yes ; then if test "$ac_cv_have_chflags" = yes ; then
AC_DEFINE(HAVE_CHFLAGS, 1, [Define to 1 if you have the `chflags' function.]) AC_DEFINE(HAVE_CHFLAGS, 1, [Define to 1 if you have the 'chflags' function.])
fi fi
AC_CACHE_CHECK([for lchflags], [ac_cv_have_lchflags], [dnl AC_CACHE_CHECK([for lchflags], [ac_cv_have_lchflags], [dnl
AC_RUN_IFELSE([AC_LANG_SOURCE([[[ AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
int main(int argc, char*argv[]) int main(int argc, char*argv[])
...@@ -2706,13 +2706,13 @@ int main(int argc, char*argv[]) ...@@ -2706,13 +2706,13 @@ int main(int argc, char*argv[])
return 1; return 1;
return 0; return 0;
} }
]]])],[ac_cv_have_lchflags=yes],[ac_cv_have_lchflags=no],[ac_cv_have_lchflags=cross]) ]])],[ac_cv_have_lchflags=yes],[ac_cv_have_lchflags=no],[ac_cv_have_lchflags=cross])
]) ])
if test "$ac_cv_have_lchflags" = cross ; then if test "$ac_cv_have_lchflags" = cross ; then
AC_CHECK_FUNC([lchflags], [ac_cv_have_lchflags="yes"], [ac_cv_have_lchflags="no"]) AC_CHECK_FUNC([lchflags], [ac_cv_have_lchflags="yes"], [ac_cv_have_lchflags="no"])
fi fi
if test "$ac_cv_have_lchflags" = yes ; then if test "$ac_cv_have_lchflags" = yes ; then
AC_DEFINE(HAVE_LCHFLAGS, 1, [Define to 1 if you have the `lchflags' function.]) AC_DEFINE(HAVE_LCHFLAGS, 1, [Define to 1 if you have the 'lchflags' function.])
fi fi
dnl Check if system zlib has *Copy() functions dnl Check if system zlib has *Copy() functions
......
...@@ -101,7 +101,7 @@ ...@@ -101,7 +101,7 @@
/* Define this if you have the type _Bool. */ /* Define this if you have the type _Bool. */
#undef HAVE_C99_BOOL #undef HAVE_C99_BOOL
/* Define to 1 if you have the `chflags' function. */ /* Define to 1 if you have the 'chflags' function. */
#undef HAVE_CHFLAGS #undef HAVE_CHFLAGS
/* Define to 1 if you have the `chown' function. */ /* Define to 1 if you have the `chown' function. */
...@@ -428,7 +428,7 @@ ...@@ -428,7 +428,7 @@
Solaris and Linux, the necessary defines are already defined.) */ Solaris and Linux, the necessary defines are already defined.) */
#undef HAVE_LARGEFILE_SUPPORT #undef HAVE_LARGEFILE_SUPPORT
/* Define to 1 if you have the `lchflags' function. */ /* Define to 1 if you have the 'lchflags' function. */
#undef HAVE_LCHFLAGS #undef HAVE_LCHFLAGS
/* Define to 1 if you have the `lchmod' function. */ /* Define to 1 if you have the `lchmod' function. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment