blob: fc571d7325e314e8dc0e191d7dd913b655f45acc [file] [log] [blame]
/* $Id$ */
#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);
}