Patch #1490190: posixmodule now includes os.chflags() and os.lchflags()

functions on platforms where the underlying system calls are available.
This commit is contained in:
Martin v. Löwis 2007-02-19 10:55:19 +00:00
parent 0713a68dc5
commit 382abeff0f
11 changed files with 133 additions and 10 deletions

View File

@ -758,6 +758,26 @@ Availability: Macintosh, \UNIX, Windows.
\versionadded{2.3}
\end{funcdesc}
\begin{funcdesc}{chflags}{path, flags}
Set the flags of \var{path} to the numeric \var{flags}.
\var{flags} may take a combination (bitwise OR) of the following values
(as defined in the \module{stat} module):
\begin{itemize}
\item \code{UF_NODUMP}
\item \code{UF_IMMUTABLE}
\item \code{UF_APPEND}
\item \code{UF_OPAQUE}
\item \code{UF_NOUNLINK}
\item \code{SF_ARCHIVED}
\item \code{SF_IMMUTABLE}
\item \code{SF_APPEND}
\item \code{SF_NOUNLINK}
\item \code{SF_SNAPSHOT}
\end{itemize}
Availability: Macintosh, \UNIX.
\versionadded{2.6}
\end{funcdesc}
\begin{funcdesc}{chroot}{path}
Change the root directory of the current process to \var{path}.
Availability: Macintosh, \UNIX.
@ -804,6 +824,13 @@ and \var{gid}. To leave one of the ids unchanged, set it to -1.
Availability: Macintosh, \UNIX.
\end{funcdesc}
\begin{funcdesc}{lchflags}{path, flags}
Set the flags of \var{path} to the numeric \var{flags}, like
\function{chflags()}, but do not follow symbolic links.
Availability: \UNIX.
\versionadded{2.6}
\end{funcdesc}
\begin{funcdesc}{lchown}{path, uid, gid}
Change the owner and group id of \var{path} to the numeric \var{uid}
and gid. This function will not follow symbolic links.

View File

@ -44,8 +44,8 @@ file type and creator codes will not be correct.
\end{funcdesc}
\begin{funcdesc}{copystat}{src, dst}
Copy the permission bits, last access time, and last modification
time from \var{src} to \var{dst}. The file contents, owner, and
Copy the permission bits, last access time, last modification time,
and flags from \var{src} to \var{dst}. The file contents, owner, and
group are unaffected. \var{src} and \var{dst} are path names given
as strings.
\end{funcdesc}

View File

@ -60,13 +60,15 @@ def copymode(src, dst):
os.chmod(dst, mode)
def copystat(src, dst):
"""Copy all stat info (mode bits, atime and mtime) from src to dst"""
"""Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
st = os.stat(src)
mode = stat.S_IMODE(st.st_mode)
if hasattr(os, 'utime'):
os.utime(dst, (st.st_atime, st.st_mtime))
if hasattr(os, 'chmod'):
os.chmod(dst, mode)
if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
os.chflags(dst, st.st_flags)
def copy(src, dst):

View File

@ -84,3 +84,16 @@ S_IRWXO = 00007
S_IROTH = 00004
S_IWOTH = 00002
S_IXOTH = 00001
# Names for file flags
UF_NODUMP = 0x00000001
UF_IMMUTABLE = 0x00000002
UF_APPEND = 0x00000004
UF_OPAQUE = 0x00000008
UF_NOUNLINK = 0x00000010
SF_ARCHIVED = 0x00010000
SF_IMMUTABLE = 0x00020000
SF_APPEND = 0x00040000
SF_NOUNLINK = 0x00100000
SF_SNAPSHOT = 0x00200000

View File

@ -192,6 +192,18 @@ class PosixTester(unittest.TestCase):
posix.utime(test_support.TESTFN, (int(now), int(now)))
posix.utime(test_support.TESTFN, (now, now))
def test_chflags(self):
if hasattr(posix, 'chflags'):
st = os.stat(test_support.TESTFN)
if hasattr(st, 'st_flags'):
posix.chflags(test_support.TESTFN, st.st_flags)
def test_lchflags(self):
if hasattr(posix, 'lchflags'):
st = os.stat(test_support.TESTFN)
if hasattr(st, 'st_flags'):
posix.lchflags(test_support.TESTFN, st.st_flags)
def test_main():
test_support.run_unittest(PosixTester)

View File

@ -377,6 +377,7 @@ Luc Lefebvre
Kip Lehman
Joerg Lehmann
Marc-Andre Lemburg
Mark Levinson
William Lewis
Robert van Liere
Martin Ligr

View File

@ -371,6 +371,9 @@ Library
Extension Modules
-----------------
- Patch #1490190: posixmodule now includes os.chflags() and os.lchflags()
functions on platforms where the underlying system calls are available.
- Patch #1494140: Add documentation for the new struct.Struct object.
- Patch #1432399: Support the HCI protocol for bluetooth sockets

View File

@ -1692,6 +1692,57 @@ posix_chmod(PyObject *self, PyObject *args)
}
#ifdef HAVE_CHFLAGS
PyDoc_STRVAR(posix_chflags__doc__,
"chflags(path, flags)\n\n\
Set file flags.");
static PyObject *
posix_chflags(PyObject *self, PyObject *args)
{
char *path;
unsigned long flags;
int res;
if (!PyArg_ParseTuple(args, "etk:chflags",
Py_FileSystemDefaultEncoding, &path, &flags))
return NULL;
Py_BEGIN_ALLOW_THREADS
res = chflags(path, flags);
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error_with_allocated_filename(path);
PyMem_Free(path);
Py_INCREF(Py_None);
return Py_None;
}
#endif /* HAVE_CHFLAGS */
#ifdef HAVE_LCHFLAGS
PyDoc_STRVAR(posix_lchflags__doc__,
"lchflags(path, flags)\n\n\
Set file flags.\n\
This function will not follow symbolic links.");
static PyObject *
posix_lchflags(PyObject *self, PyObject *args)
{
char *path;
unsigned long flags;
int res;
if (!PyArg_ParseTuple(args, "etk:lchflags",
Py_FileSystemDefaultEncoding, &path, &flags))
return NULL;
Py_BEGIN_ALLOW_THREADS
res = lchflags(path, flags);
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error_with_allocated_filename(path);
PyMem_Free(path);
Py_INCREF(Py_None);
return Py_None;
}
#endif /* HAVE_LCHFLAGS */
#ifdef HAVE_CHROOT
PyDoc_STRVAR(posix_chroot__doc__,
"chroot(path)\n\n\
@ -8081,10 +8132,16 @@ static PyMethodDef posix_methods[] = {
{"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
#endif
{"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
#ifdef HAVE_CHFLAGS
{"chflags", posix_chflags, METH_VARARGS, posix_chflags__doc__},
#endif /* HAVE_CHFLAGS */
{"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
#ifdef HAVE_CHOWN
{"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
#endif /* HAVE_CHOWN */
#ifdef HAVE_LCHFLAGS
{"lchflags", posix_lchflags, METH_VARARGS, posix_lchflags__doc__},
#endif /* HAVE_LCHFLAGS */
#ifdef HAVE_LCHOWN
{"lchown", posix_lchown, METH_VARARGS, posix_lchown__doc__},
#endif /* HAVE_LCHOWN */

10
configure vendored
View File

@ -1,5 +1,5 @@
#! /bin/sh
# From configure.in Revision: 52843 .
# From configure.in Revision: 53508 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.59 for python 2.6.
#
@ -14718,11 +14718,13 @@ echo "${ECHO_T}MACHDEP_OBJS" >&6
for ac_func in alarm bind_textdomain_codeset chown clock confstr ctermid \
execv fork fpathconf ftime ftruncate \
for ac_func in alarm bind_textdomain_codeset chflags chown clock confstr \
ctermid execv fork fpathconf ftime ftruncate \
gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
getpriority getpwent getspnam getspent getsid getwd \
kill killpg lchown lstat mkfifo mknod mktime \
kill killpg lchflags lchown lstat mkfifo mknod mktime \
mremap nice pathconf pause plock poll pthread_init \
putenv readlink realpath \
select setegid seteuid setgid \

View File

@ -2282,11 +2282,11 @@ fi
AC_MSG_RESULT(MACHDEP_OBJS)
# checks for library functions
AC_CHECK_FUNCS(alarm bind_textdomain_codeset chown clock confstr ctermid \
execv fork fpathconf ftime ftruncate \
AC_CHECK_FUNCS(alarm bind_textdomain_codeset chflags chown clock confstr \
ctermid execv fork fpathconf ftime ftruncate \
gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
getpriority getpwent getspnam getspent getsid getwd \
kill killpg lchown lstat mkfifo mknod mktime \
kill killpg lchflags lchown lstat mkfifo mknod mktime \
mremap nice pathconf pause plock poll pthread_init \
putenv readlink realpath \
select setegid seteuid setgid \

View File

@ -67,6 +67,9 @@
/* Define this if you have the type _Bool. */
#undef HAVE_C99_BOOL
/* Define to 1 if you have the `chflags' function. */
#undef HAVE_CHFLAGS
/* Define to 1 if you have the `chown' function. */
#undef HAVE_CHOWN
@ -290,6 +293,9 @@
Solaris and Linux, the necessary defines are already defined.) */
#undef HAVE_LARGEFILE_SUPPORT
/* Define to 1 if you have the `lchflags' function. */
#undef HAVE_LCHFLAGS
/* Define to 1 if you have the `lchown' function. */
#undef HAVE_LCHOWN