aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bsd-flags/PKG-INFO10
-rw-r--r--src/bsd-flags/chflags.c161
-rw-r--r--src/bsd-flags/setup.cfg6
-rw-r--r--src/bsd-flags/setup.py24
4 files changed, 201 insertions, 0 deletions
diff --git a/src/bsd-flags/PKG-INFO b/src/bsd-flags/PKG-INFO
new file mode 100644
index 0000000..f2cb5c5
--- /dev/null
+++ b/src/bsd-flags/PKG-INFO
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: bsd-chflags
+Version: 0.1
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: Stephen Bennett
+Author-email: spb@gentoo.org
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
diff --git a/src/bsd-flags/chflags.c b/src/bsd-flags/chflags.c
new file mode 100644
index 0000000..a5893d4
--- /dev/null
+++ b/src/bsd-flags/chflags.c
@@ -0,0 +1,161 @@
+/* $Header: /local/data/ulm/cvs/history/var/cvsroot/gentoo-src/portage/src/bsd-flags/chflags.c,v 1.2 2005/02/26 07:23:49 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);
+}
diff --git a/src/bsd-flags/setup.cfg b/src/bsd-flags/setup.cfg
new file mode 100644
index 0000000..f92c494
--- /dev/null
+++ b/src/bsd-flags/setup.cfg
@@ -0,0 +1,6 @@
+# bsd-flags
+# $Header: /local/data/ulm/cvs/history/var/cvsroot/gentoo-src/portage/src/bsd-flags/setup.cfg,v 1.2 2005/02/26 07:23:49 jstubbs Exp $
+
+[bdist_rpm]
+release = 1
+python=python2
diff --git a/src/bsd-flags/setup.py b/src/bsd-flags/setup.py
new file mode 100644
index 0000000..23bdc7c
--- /dev/null
+++ b/src/bsd-flags/setup.py
@@ -0,0 +1,24 @@
+#! /usr/bin/env python
+# $Header: /local/data/ulm/cvs/history/var/cvsroot/gentoo-src/portage/src/bsd-flags/setup.py,v 1.2 2005/02/26 07:23:49 jstubbs Exp $
+
+from os import chdir, stat
+from distutils.core import setup, Extension
+
+setup (# Distribution meta-data
+ name = "bsd-chflags",
+ version = "0.1",
+ description = "",
+ author = "Stephen Bennett",
+ author_email = "spb@gentoo.org",
+ license = "",
+ long_description = \
+ '''''',
+ ext_modules = [ Extension(
+ "chflags",
+ ["chflags.c"],
+ libraries=[],
+ )
+ ],
+ url = "",
+ )
+