]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix for feature request #1528 Add os.fchmod
authorChristian Heimes <christian@cheimes.de>
Fri, 30 Nov 2007 21:11:28 +0000 (21:11 +0000)
committerChristian Heimes <christian@cheimes.de>
Fri, 30 Nov 2007 21:11:28 +0000 (21:11 +0000)
Georg Brandl has added fchmod() and fchown(). I've contributed lchown but I'm not able to test it on Linux. However it should be available on Mac and some other flavors of Unix.
I've made a quick test of fchmod() and fchown() on my system. They are working as expected.

Doc/library/os.rst
Modules/posixmodule.c
configure
configure.in
pyconfig.h.in

index 7d12488e3185ba6b40ee5613cb61c0fbac2e0b0e..4904ea0f62e6e8a888bfa36c3ead6a35371e754d 100644 (file)
@@ -523,6 +523,19 @@ by file descriptors.
    Availability: Macintosh, Unix, Windows.
 
 
+.. function:: fchmod(fd, mode)
+
+   Change the mode of the file given by *fd* to the numeric *mode*.  See the docs
+   for :func:`chmod` for possible values of *mode*.  Availability: Unix.
+
+
+.. function:: fchown(fd, uid, gid)
+
+   Change the owner and group id of the file given by *fd* to the numeric *uid*
+   and *gid*.  To leave one of the ids unchanged, set it to -1.
+   Availability: Unix.
+
+
 .. function:: fdatasync(fd)
 
    Force write of file with filedescriptor *fd* to disk. Does not force update of
@@ -581,6 +594,13 @@ by file descriptors.
    tty(-like) device, else ``False``. Availability: Macintosh, Unix.
 
 
+.. function:: lchmod(path, mode)
+
+   Change the mode of *path* to the numeric *mode*. If path is a symlink, this
+   affects the symlink rather than the target. See the docs for :func:`chmod`
+   for possible values of *mode*.  Availability: Unix.
+
+
 .. function:: lseek(fd, pos, how)
 
    Set the current position of file descriptor *fd* to position *pos*, modified by
index 5fcc521d7a478fbeb643f79a0c2408461faebdf8..ff79a0e8faa70a99252f557b5bdba4c5c7f4228e 100644 (file)
@@ -191,6 +191,12 @@ extern int chmod(const char *, int);
 #else
 extern int chmod(const char *, mode_t);
 #endif
+/*#ifdef HAVE_FCHMOD
+extern int fchmod(int, mode_t);
+#endif*/
+/*#ifdef HAVE_LCHMOD
+extern int lchmod(const char *, mode_t);
+#endif*/
 extern int chown(const char *, uid_t, gid_t);
 extern char *getcwd(char *, int);
 extern char *strerror(int);
@@ -1722,6 +1728,52 @@ posix_chmod(PyObject *self, PyObject *args)
 #endif
 }
 
+#ifdef HAVE_FCHMOD
+PyDoc_STRVAR(posix_fchmod__doc__,
+"fchmod(fd, mode)\n\n\
+Change the access permissions of the file given by file\n\
+descriptor fd.");
+
+static PyObject *
+posix_fchmod(PyObject *self, PyObject *args)
+{
+       int fd, mode, res;
+       if (!PyArg_ParseTuple(args, "ii:fchmod", &fd, &mode))
+               return NULL;
+       Py_BEGIN_ALLOW_THREADS
+       res = fchmod(fd, mode);
+       Py_END_ALLOW_THREADS
+       if (res < 0)
+               return posix_error();
+       Py_RETURN_NONE;
+}
+#endif /* HAVE_FCHMOD */
+
+#ifdef HAVE_LCHMOD
+PyDoc_STRVAR(posix_lchmod__doc__,
+"lchmod(path, mode)\n\n\
+Change the access permissions of a file. If path is a symlink, this\n\
+affects the link itself rather than the target.");
+
+static PyObject *
+posix_lchmod(PyObject *self, PyObject *args)
+{
+       char *path = NULL;
+       int i;
+       int res;
+       if (!PyArg_ParseTuple(args, "eti:lchmod", Py_FileSystemDefaultEncoding,
+                             &path, &i))
+               return NULL;
+       Py_BEGIN_ALLOW_THREADS
+       res = lchmod(path, i);
+       Py_END_ALLOW_THREADS
+       if (res < 0)
+               return posix_error_with_allocated_filename(path);
+       PyMem_Free(path);
+       Py_RETURN_NONE;
+}
+#endif /* HAVE_LCHMOD */
+
 
 #ifdef HAVE_CHFLAGS
 PyDoc_STRVAR(posix_chflags__doc__,
@@ -1843,6 +1895,28 @@ posix_chown(PyObject *self, PyObject *args)
 }
 #endif /* HAVE_CHOWN */
 
+#ifdef HAVE_FCHOWN
+PyDoc_STRVAR(posix_fchown__doc__,
+"fchown(fd, uid, gid)\n\n\
+Change the owner and group id of the file given by file descriptor\n\
+fd to the numeric uid and gid.");
+
+static PyObject *
+posix_fchown(PyObject *self, PyObject *args)
+{
+       int fd, uid, gid;
+       int res;
+       if (!PyArg_ParseTuple(args, "iii:chown", &fd, &uid, &gid))
+               return NULL;
+       Py_BEGIN_ALLOW_THREADS
+       res = fchown(fd, (uid_t) uid, (gid_t) gid);
+       Py_END_ALLOW_THREADS
+       if (res < 0)
+               return posix_error();
+       Py_RETURN_NONE;
+}
+#endif /* HAVE_FCHOWN */
+
 #ifdef HAVE_LCHOWN
 PyDoc_STRVAR(posix_lchown__doc__,
 "lchown(path, uid, gid)\n\n\
@@ -8182,9 +8256,18 @@ static PyMethodDef posix_methods[] = {
        {"chflags",     posix_chflags, METH_VARARGS, posix_chflags__doc__},
 #endif /* HAVE_CHFLAGS */
        {"chmod",       posix_chmod, METH_VARARGS, posix_chmod__doc__},
+#ifdef HAVE_FCHMOD
+       {"fchmod",      posix_fchmod, METH_VARARGS, posix_fchmod__doc__},
+#endif /* HAVE_FCHMOD */
 #ifdef HAVE_CHOWN
        {"chown",       posix_chown, METH_VARARGS, posix_chown__doc__},
 #endif /* HAVE_CHOWN */
+#ifdef HAVE_LCHMOD
+       {"lchmod",      posix_lchmod, METH_VARARGS, posix_lchmod__doc__},
+#endif /* HAVE_LCHMOD */
+#ifdef HAVE_FCHOWN
+       {"fchown",      posix_fchown, METH_VARARGS, posix_fchown__doc__},
+#endif /* HAVE_FCHOWN */
 #ifdef HAVE_LCHFLAGS
        {"lchflags",    posix_lchflags, METH_VARARGS, posix_lchflags__doc__},
 #endif /* HAVE_LCHFLAGS */
index 6beb47d5b165bd5b6dd5bde2225cdabd69dfc317..e11651772b7b95c62c026bb2464d5f406852067f 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.in Revision: 58653 .
+# From configure.in Revision: 58784 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.61 for python 2.6.
 #
@@ -15222,15 +15222,18 @@ echo "${ECHO_T}MACHDEP_OBJS" >&6; }
 
 
 
+
+
+
 
 
 
 
 for ac_func in alarm bind_textdomain_codeset chflags chown clock confstr \
- ctermid execv fork fpathconf ftime ftruncate \
+ ctermid execv fchmod fchown fork fpathconf ftime ftruncate \
  gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
  getpriority getpwent getspnam getspent getsid getwd \
- kill killpg lchflags lchown lstat mkfifo mknod mktime \
+ kill killpg lchflags lchmod lchown lstat mkfifo mknod mktime \
  mremap nice pathconf pause plock poll pthread_init \
  putenv readlink realpath \
  select setegid seteuid setgid \
index 580691221447c37483c6a7ede41ea1c523899aef..4c6dee9069e2a1a20b41505c4c7e7ebdeef19629 100644 (file)
@@ -2304,10 +2304,10 @@ AC_MSG_RESULT(MACHDEP_OBJS)
 
 # checks for library functions
 AC_CHECK_FUNCS(alarm bind_textdomain_codeset chflags chown clock confstr \
- ctermid execv fork fpathconf ftime ftruncate \
+ ctermid execv fchmod fchown fork fpathconf ftime ftruncate \
  gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
  getpriority getpwent getspnam getspent getsid getwd \
- kill killpg lchflags lchown lstat mkfifo mknod mktime \
+ kill killpg lchflags lchmod lchown lstat mkfifo mknod mktime \
  mremap nice pathconf pause plock poll pthread_init \
  putenv readlink realpath \
  select setegid seteuid setgid \
index 16c85a591a8255bea97096d4716dd510e862d2fe..1ba3e5834ece35e8b8b815c073388d76960703f3 100644 (file)
 /* Define if you have the 'fchdir' function. */
 #undef HAVE_FCHDIR
 
+/* Define to 1 if you have the `fchmod' function. */
+#undef HAVE_FCHMOD
+
+/* Define to 1 if you have the `fchown' function. */
+#undef HAVE_FCHOWN
+
 /* Define to 1 if you have the <fcntl.h> header file. */
 #undef HAVE_FCNTL_H
 
 /* Define to 1 if you have the `lchflags' function. */
 #undef HAVE_LCHFLAGS
 
+/* Define to 1 if you have the `lchmod' function. */
+#undef HAVE_LCHMOD
+
 /* Define to 1 if you have the `lchown' function. */
 #undef HAVE_LCHOWN