| /* $Id: /var/cvsroot/gentoo-src/portage/src/bsd-flags/chflags.c,v 1.1.2.2 2005/02/13 10:48:31 jstubbs Exp $ */ |
| |
| #include "Python.h" |
| |
| #include <sys/stat.h> |
| |
| static char chflags_lchflags__doc__[]; |
| static PyObject * chflags_lchflags(PyObject *self, PyObject *args); |
| static char chflags_lgetflags__doc__[]; |
| static PyObject * chflags_lgetflags(PyObject *self, PyObject *args); |
| static char chflags_lhasproblems__doc__[]; |
| static PyObject * chflags_lhasproblems(PyObject *self, PyObject *args); |
| |
| static char chflags__doc__[] = "Provide some operations for manipulating" \ |
| "FreeBSD's filesystem flags"; |
| |
| static PyMethodDef chflags_methods[] = { |
| {"lchflags", chflags_lchflags, METH_VARARGS, chflags_lchflags__doc__}, |
| {"lgetflags", chflags_lgetflags, METH_VARARGS, chflags_lgetflags__doc__}, |
| {"lhasproblems", chflags_lhasproblems, METH_VARARGS, chflags_lhasproblems__doc__}, |
| {NULL, NULL} |
| }; |
| |
| static char chflags_lchflags__doc__[] = |
| "lchflags(path, flags) -> None\n\ |
| Change the flags on path to equal flags."; |
| |
| static char chflags_lgetflags__doc__[] = |
| "lgetflags(path) -> Integer\n\ |
| Returns the file flags on path."; |
| |
| static char chflags_lhasproblems__doc__[] = |
| "lhasproblems(path) -> Integer\n\ |
| Returns 1 if path has any flags set that prevent write operations;\n\ |
| 0 otherwise."; |
| |
| static const unsigned long problemflags=0x00160016; |
| |
| #if defined __FreeBSD__ |
| static PyObject *chflags_lchflags(PyObject *self, PyObject *args) |
| { |
| char *path = NULL; |
| int flags; |
| int res; |
| |
| if (!PyArg_ParseTuple(args, "eti:lchflags", |
| Py_FileSystemDefaultEncoding, &path, |
| &flags)) |
| { |
| return NULL; |
| } |
| |
| res = lchflags(path, flags); |
| |
| PyMem_Free(path); |
| return PyInt_FromLong((long)res); |
| } |
| |
| static PyObject *chflags_lhasproblems(PyObject *self, PyObject *args) |
| { |
| char *path = NULL; |
| struct stat sb; |
| int res; |
| |
| if (!PyArg_ParseTuple(args, "et:lhasproblems", |
| Py_FileSystemDefaultEncoding, &path)) |
| { |
| return NULL; |
| } |
| |
| res = lstat(path, &sb); |
| |
| PyMem_Free(path); |
| |
| if (res < 0) |
| { |
| return PyInt_FromLong((long)res); |
| } |
| |
| if (sb.st_flags & problemflags) |
| return PyInt_FromLong(1); |
| else |
| return PyInt_FromLong(0); |
| } |
| |
| static PyObject *chflags_lgetflags(PyObject *self, PyObject *args) |
| { |
| char *path = NULL; |
| struct stat sb; |
| int res; |
| |
| if (!PyArg_ParseTuple(args, "et:lgetflags", |
| Py_FileSystemDefaultEncoding, &path)) |
| { |
| return NULL; |
| } |
| |
| res = lstat(path, &sb); |
| |
| if (res < 0) |
| { |
| PyMem_Free(path); |
| return PyInt_FromLong((long)res); |
| } |
| |
| PyMem_Free(path); |
| |
| return PyInt_FromLong((long)sb.st_flags); |
| } |
| |
| #else |
| #warning Not on FreeBSD; building dummy lchflags |
| |
| static PyObject *chflags_lgetflags(PyObject *self, PyObject *args) |
| { |
| /* Obviously we can't set flags if the OS/filesystem doesn't support them. */ |
| return PyInt_FromLong(0); |
| } |
| |
| static PyObject *chflags_lchflags(PyObject *self, PyObject *args) |
| { |
| /* If file system flags aren't supported, just return 0, |
| as the effect is basically the same. */ |
| return PyInt_FromLong(0); |
| } |
| |
| static PyObject *chflags_lhasproblems(PyObject *self, PyObject *args) |
| { |
| return PyInt_FromLong(0); |
| } |
| |
| #endif |
| |
| static int ins(PyObject *m, char *symbolname, int value) |
| { |
| return PyModule_AddIntConstant(m, symbolname, value); |
| } |
| |
| DL_EXPORT(void) initchflags(void) |
| { |
| PyObject *m; |
| m = Py_InitModule4("chflags", chflags_methods, chflags__doc__, |
| (PyObject*)NULL, PYTHON_API_VERSION); |
| |
| ins(m, "UF_SETTABLE", 0x0000ffff); |
| ins(m, "UF_NODUMP", 0x00000001); |
| ins(m, "UF_IMMUTABLE", 0x00000002); |
| ins(m, "UF_APPEND", 0x00000004); |
| ins(m, "UF_OPAQUE", 0x00000008); |
| ins(m, "UF_NOUNLINK", 0x00000010); |
| |
| ins(m, "SF_SETTABLE", 0xffff0000); |
| ins(m, "SF_NODUMP", 0x00010000); |
| ins(m, "SF_IMMUTABLE", 0x00020000); |
| ins(m, "SF_APPEND", 0x00040000); |
| ins(m, "SF_OPAQUE", 0x00080000); |
| ins(m, "SF_NOUNLINK", 0x00100000); |
| ins(m, "SF_SNAPSHOT", 0x00200000); |
| |
| ins(m, "PROBLEM_FLAGS", 0x00160016); |
| } |