mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Fix for feature request #1528 Add os.fchmod
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.
This commit is contained in:
parent
dafd32b730
commit
3628187b66
5 changed files with 120 additions and 5 deletions
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue