]> granicus.if.org Git - python/commitdiff
Patch #1490190: posixmodule now includes os.chflags() and os.lchflags()
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 19 Feb 2007 10:55:19 +0000 (10:55 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 19 Feb 2007 10:55:19 +0000 (10:55 +0000)
functions on platforms where the underlying system calls are available.

Doc/lib/libos.tex
Doc/lib/libshutil.tex
Lib/shutil.py
Lib/stat.py
Lib/test/test_posix.py
Misc/ACKS
Misc/NEWS
Modules/posixmodule.c
configure
configure.in
pyconfig.h.in

index 355d8fab2576fc25bc74245b58876bbd7278678a..cbb35f39d254e4e0589044a93a72ae833020cd46 100644 (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.
index 449d7414f38b248d524c3e493cec04ef247f5567..ab2a0c18b7b147b80beacdb5bbe268dc12383f06 100644 (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}
index c3ff687bff4efcd407f16cddbf71995f7d8962b2..f00f9b7b8b9a57fcae7cda3ede6eca0c0712627e 100644 (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):
index 70750d8b1ae909039c1e95d37ccab60b2f0096b0..5f416879c6c7a893e56441ebea05a5466e5d7409 100644 (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
index f98c723193ea2e355197d0af1493174145a1164b..7207de54eafa57f4f1f49cc8c137c19eeddd9741 100644 (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)
 
index 7ea63cce7528f3e9ad3c2885cca8f60d422f565c..92e4f405cf76049f51c069279ea8af39be2e0565 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -377,6 +377,7 @@ Luc Lefebvre
 Kip Lehman
 Joerg Lehmann
 Marc-Andre Lemburg
+Mark Levinson
 William Lewis
 Robert van Liere
 Martin Ligr
index 0ef1716373201fc94852efecea780c8ce225e402..72d58320a7159f0407fa9c0556541f683d6dd35d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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
index 579f2f3da3ba2959cf301cf1c737ec611f390120..b9572cfa01e29ef133672e2bdda8ba404d317653 100644 (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 */
index ac97264df215f1c7db63768b3de0545f23ae3802..9065cb97121f580da46872a23f21591968d7ee4d 100755 (executable)
--- a/configure
+++ b/configure
@@ -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 \
index 1a11ec2ca287cac37719f7f4e0390ccf84bb4f8e..2f4292d3f7273b15e0a7defe255517de83da23eb 100644 (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 \
index 2e8f4bff01e9fd7056ad443827133969f28211b1..d5dafc1d176f865b67d9162dcf34decb025e3114 100644 (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
 
    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