diff options
Diffstat (limited to 'rdiff-backup/rdiff_backup/cmodule.c')
-rw-r--r-- | rdiff-backup/rdiff_backup/cmodule.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/rdiff-backup/rdiff_backup/cmodule.c b/rdiff-backup/rdiff_backup/cmodule.c index 6fafde7..f6a44a3 100644 --- a/rdiff-backup/rdiff_backup/cmodule.c +++ b/rdiff-backup/rdiff_backup/cmodule.c @@ -368,6 +368,36 @@ static PyObject *acl_unquote(PyObject *self, PyObject *args) return Py_BuildValue("s", unquote(s)); } +/* ------------- lchown taken from Python's posixmodule.c -------------- */ +/* duplicate here to avoid v2.3 requirement */ + +static PyObject * +posix_error_with_allocated_filename(char* name) +{ + PyObject *rc = PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); + PyMem_Free(name); + return rc; +} + +static PyObject * +posix_lchown(PyObject *self, PyObject *args) +{ + char *path = NULL; + int uid, gid; + int res; + if (!PyArg_ParseTuple(args, "etii:lchown", + Py_FileSystemDefaultEncoding, &path, + &uid, &gid)) + return NULL; + Py_BEGIN_ALLOW_THREADS + res = lchown(path, (uid_t) uid, (gid_t) gid); + Py_END_ALLOW_THREADS + if (res < 0) + return posix_error_with_allocated_filename(path); + PyMem_Free(path); + Py_INCREF(Py_None); + return Py_None; +} /* ------------- Python export lists -------------------------------- */ @@ -381,6 +411,8 @@ static PyMethodDef CMethods[] = { "Quote string, escaping non-printables"}, {"acl_unquote", acl_unquote, METH_VARARGS, "Unquote string, producing original input to quote"}, + {"lchown", posix_lchown, METH_VARARGS, + "Like chown, but don't follow symlinks"}, {NULL, NULL, 0, NULL} }; |