Load . into chkpath-python/trunk.
authormdw <mdw>
Fri, 24 Jun 2005 11:11:15 +0000 (11:11 +0000)
committermdw <mdw>
Fri, 24 Jun 2005 11:11:15 +0000 (11:11 +0000)
checkpath.c [new file with mode: 0644]
checkpath.pyx [new file with mode: 0644]
checkpath.pyx~ [new file with mode: 0644]
checkpath.so [new file with mode: 0755]
test.py [new file with mode: 0644]
test.py~ [new file with mode: 0644]

diff --git a/checkpath.c b/checkpath.c
new file mode 100644 (file)
index 0000000..cc3afe3
--- /dev/null
@@ -0,0 +1,1002 @@
+/* Generated by Pyrex 0.9.3 on Thu Jun  9 16:58:27 2005 */
+
+#include "Python.h"
+#include "structmember.h"
+#ifndef PY_LONG_LONG
+  #define PY_LONG_LONG LONG_LONG
+#endif
+#include "checkpath.h"
+
+
+typedef struct {PyObject **p; char *s;} __Pyx_InternTabEntry; /*proto*/
+typedef struct {PyObject **p; char *s; long n;} __Pyx_StringTabEntry; /*proto*/
+static PyObject *__Pyx_UnpackItem(PyObject *, int); /*proto*/
+static int __Pyx_EndUnpack(PyObject *, int); /*proto*/
+static int __Pyx_PrintItem(PyObject *); /*proto*/
+static int __Pyx_PrintNewline(void); /*proto*/
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+static void __Pyx_ReRaise(void); /*proto*/
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
+static PyObject *__Pyx_GetExcValue(void); /*proto*/
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name); /*proto*/
+static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
+static int __Pyx_GetStarArgs(PyObject **args, PyObject **kwds, char *kwd_list[], int nargs, PyObject **args2, PyObject **kwds2); /*proto*/
+static void __Pyx_WriteUnraisable(char *name); /*proto*/
+static void __Pyx_AddTraceback(char *funcname); /*proto*/
+static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name, long size);  /*proto*/
+static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
+static int __Pyx_GetVtable(PyObject *dict, void *vtabptr); /*proto*/
+static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name, char *modname); /*proto*/
+static int __Pyx_InternStrings(__Pyx_InternTabEntry *t); /*proto*/
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
+
+static PyObject *__pyx_m;
+static PyObject *__pyx_b;
+static int __pyx_lineno;
+static char *__pyx_filename;
+staticforward char **__pyx_f;
+
+/* Declarations from checkpath */
+
+staticforward PyTypeObject __pyx_type_9checkpath_CheckPath;
+
+struct __pyx_obj_9checkpath_CheckPath {
+  PyObject_HEAD
+  struct checkpath cp;
+};
+
+static PyTypeObject *__pyx_ptype_9checkpath_CheckPath = 0;
+static void (__pyx_f_9checkpath_cp_report(unsigned int ,int ,char (*),char (*),void (*))); /*proto*/
+
+/* Implementation of checkpath */
+
+static PyObject *__pyx_n_ERROR;
+static PyObject *__pyx_n_WRWORLD;
+static PyObject *__pyx_n_WRGRP;
+static PyObject *__pyx_n_WROTHGRP;
+static PyObject *__pyx_n_WROTHUSR;
+static PyObject *__pyx_n_PROBLEMS;
+static PyObject *__pyx_n_SYMLINK;
+static PyObject *__pyx_n_REPORT;
+static PyObject *__pyx_n_STICKYOK;
+
+static PyObject *__pyx_n_report;
+
+static char (__pyx_k1[]) = "<null>";
+
+static void __pyx_f_9checkpath_cp_report(unsigned int __pyx_v_what,int __pyx_v_verb,char (*__pyx_v_path),char (*__pyx_v_msg),void (*__pyx_v_arg)) {
+  PyObject *__pyx_v_cp;
+  PyObject *__pyx_1 = 0;
+  int __pyx_2;
+  PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
+  PyObject *__pyx_5 = 0;
+  PyObject *__pyx_6 = 0;
+  PyObject *__pyx_7 = 0;
+  __pyx_v_cp = Py_None; Py_INCREF(__pyx_v_cp);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":44 */
+  __pyx_1 = (PyObject *)__pyx_v_arg;
+  Py_INCREF(__pyx_1);
+  Py_DECREF(__pyx_v_cp);
+  __pyx_v_cp = __pyx_1;
+  __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":45 */
+  __pyx_2 = (__pyx_v_msg == 0);
+  if (__pyx_2) {
+
+    /* "/home/mdw/src/chkpath-python/checkpath.pyx":46 */
+    __pyx_v_msg = __pyx_k1;
+    goto __pyx_L2;
+  }
+  __pyx_L2:;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":47 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_cp, __pyx_n_report); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(__pyx_v_what); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; goto __pyx_L1;}
+  __pyx_4 = PyInt_FromLong(__pyx_v_verb); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; goto __pyx_L1;}
+  __pyx_5 = PyString_FromString(__pyx_v_path); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; goto __pyx_L1;}
+  __pyx_6 = PyString_FromString(__pyx_v_msg); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; goto __pyx_L1;}
+  __pyx_7 = PyTuple_New(4); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_7, 0, __pyx_3);
+  PyTuple_SET_ITEM(__pyx_7, 1, __pyx_4);
+  PyTuple_SET_ITEM(__pyx_7, 2, __pyx_5);
+  PyTuple_SET_ITEM(__pyx_7, 3, __pyx_6);
+  __pyx_3 = 0;
+  __pyx_4 = 0;
+  __pyx_5 = 0;
+  __pyx_6 = 0;
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_7); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  Py_DECREF(__pyx_7); __pyx_7 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
+  Py_XDECREF(__pyx_5);
+  Py_XDECREF(__pyx_6);
+  Py_XDECREF(__pyx_7);
+  __Pyx_WriteUnraisable("checkpath.cp_report");
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_cp);
+}
+
+static int __pyx_f_9checkpath_9CheckPath___init__(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_9checkpath_9CheckPath___init__(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  static char *__pyx_argnames[] = {0};
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "", __pyx_argnames)) return -1;
+  Py_INCREF(__pyx_v_me);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":52 */
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_uid = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":53 */
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_gids = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":54 */
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_verbose = 1;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":55 */
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_what = CP_PROBLEMS;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":56 */
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_report = __pyx_f_9checkpath_cp_report;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":57 */
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_arg = ((void (*))__pyx_v_me);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":58 */
+  checkpath_setids((&((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp));
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1:;
+  __Pyx_AddTraceback("checkpath.CheckPath.__init__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_9checkpath_9CheckPath_setids(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_9checkpath_9CheckPath_setids(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_r;
+  static char *__pyx_argnames[] = {0};
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "", __pyx_argnames)) return 0;
+  Py_INCREF(__pyx_v_me);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":60 */
+  checkpath_setids((&((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp));
+
+  __pyx_r = Py_None; Py_INCREF(__pyx_r);
+  goto __pyx_L0;
+  __pyx_L1:;
+  __Pyx_AddTraceback("checkpath.CheckPath.setids");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_9checkpath_9CheckPath_3uid___get__(PyObject *__pyx_v_me); /*proto*/
+static PyObject *__pyx_f_9checkpath_9CheckPath_3uid___get__(PyObject *__pyx_v_me) {
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
+  Py_INCREF(__pyx_v_me);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":63 */
+  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_uid); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; goto __pyx_L1;}
+  __pyx_r = __pyx_1;
+  __pyx_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(__pyx_r);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback("checkpath.CheckPath.uid.__get__");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  return __pyx_r;
+}
+
+static int __pyx_f_9checkpath_9CheckPath_3uid___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_f_9checkpath_9CheckPath_3uid___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  uid_t __pyx_1;
+  Py_INCREF(__pyx_v_me);
+  Py_INCREF(__pyx_v_val);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":65 */
+  __pyx_1 = PyInt_AsLong(__pyx_v_val); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; goto __pyx_L1;}
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_uid = __pyx_1;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1:;
+  __Pyx_AddTraceback("checkpath.CheckPath.uid.__set__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  Py_DECREF(__pyx_v_val);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_9checkpath_9CheckPath_4gids___get__(PyObject *__pyx_v_me); /*proto*/
+static PyObject *__pyx_f_9checkpath_9CheckPath_4gids___get__(PyObject *__pyx_v_me) {
+  PyObject *__pyx_v_g;
+  PyObject *__pyx_v_i;
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
+  long __pyx_2;
+  int __pyx_3;
+  int __pyx_4;
+  Py_INCREF(__pyx_v_me);
+  __pyx_v_g = Py_None; Py_INCREF(__pyx_v_g);
+  __pyx_v_i = Py_None; Py_INCREF(__pyx_v_i);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":68 */
+  __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; goto __pyx_L1;}
+  Py_DECREF(__pyx_v_g);
+  __pyx_v_g = __pyx_1;
+  __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":69 */
+  __pyx_3 = ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_gids;
+  for (__pyx_2 = 0; __pyx_2 < __pyx_3; ++__pyx_2) {
+    __pyx_1 = PyInt_FromLong(__pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; goto __pyx_L1;}
+    Py_DECREF(__pyx_v_i);
+    __pyx_v_i = __pyx_1;
+    __pyx_1 = 0;
+
+    /* "/home/mdw/src/chkpath-python/checkpath.pyx":70 */
+    __pyx_4 = PyInt_AsLong(__pyx_v_i); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; goto __pyx_L1;}
+    __pyx_1 = PyInt_FromLong((((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_gid[__pyx_4])); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; goto __pyx_L1;}
+    if (PyObject_SetItem(__pyx_v_g, __pyx_v_i, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; goto __pyx_L1;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    __pyx_L2:;
+  }
+  __pyx_L3:;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":71 */
+  Py_INCREF(__pyx_v_g);
+  __pyx_r = __pyx_v_g;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(__pyx_r);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback("checkpath.CheckPath.gids.__get__");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_g);
+  Py_DECREF(__pyx_v_i);
+  Py_DECREF(__pyx_v_me);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_n_len;
+static PyObject *__pyx_n_TypeError;
+
+static PyObject *__pyx_k2p;
+
+static char (__pyx_k2[]) = "too many groups";
+
+static int __pyx_f_9checkpath_9CheckPath_4gids___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_f_9checkpath_9CheckPath_4gids___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val) {
+  PyObject *__pyx_v_i;
+  int __pyx_r;
+  PyObject *__pyx_1 = 0;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  int __pyx_4;
+  long __pyx_5;
+  long __pyx_6;
+  gid_t __pyx_7;
+  Py_INCREF(__pyx_v_me);
+  Py_INCREF(__pyx_v_val);
+  __pyx_v_i = Py_None; Py_INCREF(__pyx_v_i);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":73 */
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_len); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; goto __pyx_L1;}
+  Py_INCREF(__pyx_v_val);
+  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_val);
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_1 = PyInt_FromLong((NGROUPS_MAX + 1)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_3, __pyx_1, &__pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; goto __pyx_L1;}
+  __pyx_4 = __pyx_4 >= 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  if (__pyx_4) {
+
+    /* "/home/mdw/src/chkpath-python/checkpath.pyx":74 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_TypeError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 74; goto __pyx_L1;}
+    __Pyx_Raise(__pyx_2, __pyx_k2p, 0);
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 74; goto __pyx_L1;}
+    goto __pyx_L2;
+  }
+  __pyx_L2:;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":75 */
+  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_len); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;}
+  Py_INCREF(__pyx_v_val);
+  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_val);
+  __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  __pyx_6 = PyInt_AsLong(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  for (__pyx_5 = 0; __pyx_5 < __pyx_6; ++__pyx_5) {
+    __pyx_3 = PyInt_FromLong(__pyx_5); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;}
+    Py_DECREF(__pyx_v_i);
+    __pyx_v_i = __pyx_3;
+    __pyx_3 = 0;
+
+    /* "/home/mdw/src/chkpath-python/checkpath.pyx":76 */
+    __pyx_1 = PyObject_GetItem(__pyx_v_val, __pyx_v_i); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; goto __pyx_L1;}
+    __pyx_7 = PyInt_AsLong(__pyx_1); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; goto __pyx_L1;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    __pyx_4 = PyInt_AsLong(__pyx_v_i); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; goto __pyx_L1;}
+    (((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_gid[__pyx_4]) = __pyx_7;
+    __pyx_L3:;
+  }
+  __pyx_L4:;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":77 */
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_len); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; goto __pyx_L1;}
+  Py_INCREF(__pyx_v_val);
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_val);
+  __pyx_1 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_4 = PyInt_AsLong(__pyx_1); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_gids = __pyx_4;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  __Pyx_AddTraceback("checkpath.CheckPath.gids.__set__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_i);
+  Py_DECREF(__pyx_v_me);
+  Py_DECREF(__pyx_v_val);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_9checkpath_9CheckPath_7verbose___get__(PyObject *__pyx_v_me); /*proto*/
+static PyObject *__pyx_f_9checkpath_9CheckPath_7verbose___get__(PyObject *__pyx_v_me) {
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
+  Py_INCREF(__pyx_v_me);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":80 */
+  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_verbose); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; goto __pyx_L1;}
+  __pyx_r = __pyx_1;
+  __pyx_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(__pyx_r);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback("checkpath.CheckPath.verbose.__get__");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  return __pyx_r;
+}
+
+static int __pyx_f_9checkpath_9CheckPath_7verbose___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_f_9checkpath_9CheckPath_7verbose___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  int __pyx_1;
+  Py_INCREF(__pyx_v_me);
+  Py_INCREF(__pyx_v_val);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":82 */
+  __pyx_1 = PyInt_AsLong(__pyx_v_val); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; goto __pyx_L1;}
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_verbose = __pyx_1;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1:;
+  __Pyx_AddTraceback("checkpath.CheckPath.verbose.__set__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  Py_DECREF(__pyx_v_val);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_9checkpath_9CheckPath_4what___get__(PyObject *__pyx_v_me); /*proto*/
+static PyObject *__pyx_f_9checkpath_9CheckPath_4what___get__(PyObject *__pyx_v_me) {
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
+  Py_INCREF(__pyx_v_me);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":85 */
+  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_what); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; goto __pyx_L1;}
+  __pyx_r = __pyx_1;
+  __pyx_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(__pyx_r);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback("checkpath.CheckPath.what.__get__");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  return __pyx_r;
+}
+
+static int __pyx_f_9checkpath_9CheckPath_4what___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_f_9checkpath_9CheckPath_4what___set__(PyObject *__pyx_v_me, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  unsigned int __pyx_1;
+  Py_INCREF(__pyx_v_me);
+  Py_INCREF(__pyx_v_val);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":87 */
+  __pyx_1 = PyInt_AsLong(__pyx_v_val); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; goto __pyx_L1;}
+  ((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp.cp_what = __pyx_1;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1:;
+  __Pyx_AddTraceback("checkpath.CheckPath.what.__set__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  Py_DECREF(__pyx_v_val);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_9checkpath_9CheckPath_check(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_9checkpath_9CheckPath_check(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_path = 0;
+  PyObject *__pyx_r;
+  char (*__pyx_1);
+  int __pyx_2;
+  PyObject *__pyx_3 = 0;
+  static char *__pyx_argnames[] = {"path",0};
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "O", __pyx_argnames, &__pyx_v_path)) return 0;
+  Py_INCREF(__pyx_v_me);
+  Py_INCREF(__pyx_v_path);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":89 */
+  __pyx_1 = PyString_AsString(__pyx_v_path); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; goto __pyx_L1;}
+  __pyx_2 = checkpath(__pyx_1,(&((struct __pyx_obj_9checkpath_CheckPath *)__pyx_v_me)->cp)); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(__pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; goto __pyx_L1;}
+  __pyx_r = __pyx_3;
+  __pyx_3 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(__pyx_r);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_3);
+  __Pyx_AddTraceback("checkpath.CheckPath.check");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  Py_DECREF(__pyx_v_path);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_9checkpath_9CheckPath_report(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_9checkpath_9CheckPath_report(PyObject *__pyx_v_me, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_what = 0;
+  PyObject *__pyx_v_verb = 0;
+  PyObject *__pyx_v_path = 0;
+  PyObject *__pyx_v_msg = 0;
+  PyObject *__pyx_r;
+  static char *__pyx_argnames[] = {"what","verb","path","msg",0};
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OOOO", __pyx_argnames, &__pyx_v_what, &__pyx_v_verb, &__pyx_v_path, &__pyx_v_msg)) return 0;
+  Py_INCREF(__pyx_v_me);
+  Py_INCREF(__pyx_v_what);
+  Py_INCREF(__pyx_v_verb);
+  Py_INCREF(__pyx_v_path);
+  Py_INCREF(__pyx_v_msg);
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":91 */
+
+  __pyx_r = Py_None; Py_INCREF(__pyx_r);
+  goto __pyx_L0;
+  __pyx_L1:;
+  __Pyx_AddTraceback("checkpath.CheckPath.report");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_me);
+  Py_DECREF(__pyx_v_what);
+  Py_DECREF(__pyx_v_verb);
+  Py_DECREF(__pyx_v_path);
+  Py_DECREF(__pyx_v_msg);
+  return __pyx_r;
+}
+
+static __Pyx_InternTabEntry __pyx_intern_tab[] = {
+  {&__pyx_n_ERROR, "ERROR"},
+  {&__pyx_n_PROBLEMS, "PROBLEMS"},
+  {&__pyx_n_REPORT, "REPORT"},
+  {&__pyx_n_STICKYOK, "STICKYOK"},
+  {&__pyx_n_SYMLINK, "SYMLINK"},
+  {&__pyx_n_TypeError, "TypeError"},
+  {&__pyx_n_WRGRP, "WRGRP"},
+  {&__pyx_n_WROTHGRP, "WROTHGRP"},
+  {&__pyx_n_WROTHUSR, "WROTHUSR"},
+  {&__pyx_n_WRWORLD, "WRWORLD"},
+  {&__pyx_n_len, "len"},
+  {&__pyx_n_report, "report"},
+  {0, 0}
+};
+
+static __Pyx_StringTabEntry __pyx_string_tab[] = {
+  {&__pyx_k2p, __pyx_k2, sizeof(__pyx_k2)},
+  {0, 0, 0}
+};
+
+static PyObject *__pyx_tp_new_9checkpath_CheckPath(PyTypeObject *t, PyObject *a, PyObject *k) {
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  struct __pyx_obj_9checkpath_CheckPath *p = (struct __pyx_obj_9checkpath_CheckPath *)o;
+  return o;
+}
+
+static void __pyx_tp_dealloc_9checkpath_CheckPath(PyObject *o) {
+  struct __pyx_obj_9checkpath_CheckPath *p = (struct __pyx_obj_9checkpath_CheckPath *)o;
+  (*o->ob_type->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_9checkpath_CheckPath(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_9checkpath_CheckPath *p = (struct __pyx_obj_9checkpath_CheckPath *)o;
+  return 0;
+}
+
+static int __pyx_tp_clear_9checkpath_CheckPath(PyObject *o) {
+  struct __pyx_obj_9checkpath_CheckPath *p = (struct __pyx_obj_9checkpath_CheckPath *)o;
+  return 0;
+}
+
+static PyObject *__pyx_getprop_9checkpath_9CheckPath_uid(PyObject *o, void *x) {
+  return __pyx_f_9checkpath_9CheckPath_3uid___get__(o);
+}
+
+static int __pyx_setprop_9checkpath_9CheckPath_uid(PyObject *o, PyObject *v, void *x) {
+  if (v) {
+    return __pyx_f_9checkpath_9CheckPath_3uid___set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
+}
+
+static PyObject *__pyx_getprop_9checkpath_9CheckPath_gids(PyObject *o, void *x) {
+  return __pyx_f_9checkpath_9CheckPath_4gids___get__(o);
+}
+
+static int __pyx_setprop_9checkpath_9CheckPath_gids(PyObject *o, PyObject *v, void *x) {
+  if (v) {
+    return __pyx_f_9checkpath_9CheckPath_4gids___set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
+}
+
+static PyObject *__pyx_getprop_9checkpath_9CheckPath_verbose(PyObject *o, void *x) {
+  return __pyx_f_9checkpath_9CheckPath_7verbose___get__(o);
+}
+
+static int __pyx_setprop_9checkpath_9CheckPath_verbose(PyObject *o, PyObject *v, void *x) {
+  if (v) {
+    return __pyx_f_9checkpath_9CheckPath_7verbose___set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
+}
+
+static PyObject *__pyx_getprop_9checkpath_9CheckPath_what(PyObject *o, void *x) {
+  return __pyx_f_9checkpath_9CheckPath_4what___get__(o);
+}
+
+static int __pyx_setprop_9checkpath_9CheckPath_what(PyObject *o, PyObject *v, void *x) {
+  if (v) {
+    return __pyx_f_9checkpath_9CheckPath_4what___set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
+}
+
+static struct PyMethodDef __pyx_methods_9checkpath_CheckPath[] = {
+  {"setids", (PyCFunction)__pyx_f_9checkpath_9CheckPath_setids, METH_VARARGS|METH_KEYWORDS, 0},
+  {"check", (PyCFunction)__pyx_f_9checkpath_9CheckPath_check, METH_VARARGS|METH_KEYWORDS, 0},
+  {"report", (PyCFunction)__pyx_f_9checkpath_9CheckPath_report, METH_VARARGS|METH_KEYWORDS, 0},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_9checkpath_CheckPath[] = {
+  {"uid", __pyx_getprop_9checkpath_9CheckPath_uid, __pyx_setprop_9checkpath_9CheckPath_uid, 0, 0},
+  {"gids", __pyx_getprop_9checkpath_9CheckPath_gids, __pyx_setprop_9checkpath_9CheckPath_gids, 0, 0},
+  {"verbose", __pyx_getprop_9checkpath_9CheckPath_verbose, __pyx_setprop_9checkpath_9CheckPath_verbose, 0, 0},
+  {"what", __pyx_getprop_9checkpath_9CheckPath_what, __pyx_setprop_9checkpath_9CheckPath_what, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_CheckPath = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  0, /*nb_divide*/
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  0, /*nb_coerce*/
+  0, /*nb_int*/
+  0, /*nb_long*/
+  0, /*nb_float*/
+  0, /*nb_oct*/
+  0, /*nb_hex*/
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  0, /*nb_inplace_divide*/
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_CheckPath = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  0, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_CheckPath = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_CheckPath = {
+  0, /*bf_getreadbuffer*/
+  0, /*bf_getwritebuffer*/
+  0, /*bf_getsegcount*/
+  0, /*bf_getcharbuffer*/
+};
+
+statichere PyTypeObject __pyx_type_9checkpath_CheckPath = {
+  PyObject_HEAD_INIT(0)
+  0, /*ob_size*/
+  "checkpath.CheckPath", /*tp_name*/
+  sizeof(struct __pyx_obj_9checkpath_CheckPath), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_9checkpath_CheckPath, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  0, /*tp_compare*/
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_CheckPath, /*tp_as_number*/
+  &__pyx_tp_as_sequence_CheckPath, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_CheckPath, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_CheckPath, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_9checkpath_CheckPath, /*tp_traverse*/
+  __pyx_tp_clear_9checkpath_CheckPath, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_9checkpath_CheckPath, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_9checkpath_CheckPath, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_f_9checkpath_9CheckPath___init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_9checkpath_CheckPath, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+};
+
+static struct PyMethodDef __pyx_methods[] = {
+  {0, 0, 0, 0}
+};
+
+DL_EXPORT(void) initcheckpath(void); /*proto*/
+DL_EXPORT(void) initcheckpath(void) {
+  PyObject *__pyx_1 = 0;
+  __pyx_m = Py_InitModule4("checkpath", __pyx_methods, 0, 0, PYTHON_API_VERSION);
+  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
+  __pyx_b = PyImport_AddModule("__builtin__");
+  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
+  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
+  if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
+  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;};
+  if (PyType_Ready(&__pyx_type_9checkpath_CheckPath) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "CheckPath", (PyObject *)&__pyx_type_9checkpath_CheckPath) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; goto __pyx_L1;}
+  __pyx_ptype_9checkpath_CheckPath = &__pyx_type_9checkpath_CheckPath;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":31 */
+  __pyx_1 = PyInt_FromLong(CP_ERROR); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_ERROR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":32 */
+  __pyx_1 = PyInt_FromLong(CP_WRWORLD); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_WRWORLD, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":33 */
+  __pyx_1 = PyInt_FromLong(CP_WRGRP); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_WRGRP, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":34 */
+  __pyx_1 = PyInt_FromLong(CP_WROTHGRP); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_WROTHGRP, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":35 */
+  __pyx_1 = PyInt_FromLong(CP_WROTHUSR); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_WROTHUSR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":36 */
+  __pyx_1 = PyInt_FromLong(CP_PROBLEMS); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_PROBLEMS, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":37 */
+  __pyx_1 = PyInt_FromLong(CP_SYMLINK); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_SYMLINK, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":38 */
+  __pyx_1 = PyInt_FromLong(CP_REPORT); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_REPORT, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":39 */
+  __pyx_1 = PyInt_FromLong(CP_STICKYOK); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_STICKYOK, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+
+  /* "/home/mdw/src/chkpath-python/checkpath.pyx":90 */
+  return;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback("checkpath");
+}
+
+static char *__pyx_filenames[] = {
+  "checkpath.pyx",
+};
+statichere char **__pyx_f = __pyx_filenames;
+
+/* Runtime support code */
+
+static void __Pyx_WriteUnraisable(char *name) {
+    PyObject *old_exc, *old_val, *old_tb;
+    PyObject *ctx;
+    PyErr_Fetch(&old_exc, &old_val, &old_tb);
+    ctx = PyString_FromString(name);
+    PyErr_Restore(old_exc, old_val, old_tb);
+    if (!ctx)
+        ctx = Py_None;
+    PyErr_WriteUnraisable(ctx);
+}
+
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
+    PyObject *result;
+    result = PyObject_GetAttr(dict, name);
+    if (!result)
+        PyErr_SetObject(PyExc_NameError, name);
+    return result;
+}
+
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
+    Py_XINCREF(type);
+    Py_XINCREF(value);
+    Py_XINCREF(tb);
+    /* First, check the traceback argument, replacing None with NULL. */
+    if (tb == Py_None) {
+        Py_DECREF(tb);
+        tb = 0;
+    }
+    else if (tb != NULL && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto raise_error;
+    }
+    /* Next, replace a missing value with None */
+    if (value == NULL) {
+        value = Py_None;
+        Py_INCREF(value);
+    }
+    /* Next, repeatedly, replace a tuple exception with its first item */
+    while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
+        PyObject *tmp = type;
+        type = PyTuple_GET_ITEM(type, 0);
+        Py_INCREF(type);
+        Py_DECREF(tmp);
+    }
+    if (PyString_Check(type))
+        ;
+    else if (PyClass_Check(type))
+        ; /*PyErr_NormalizeException(&type, &value, &tb);*/
+    else if (PyInstance_Check(type)) {
+        /* Raising an instance.  The value should be a dummy. */
+        if (value != Py_None) {
+            PyErr_SetString(PyExc_TypeError,
+              "instance exception may not have a separate value");
+            goto raise_error;
+        }
+        else {
+            /* Normalize to raise <class>, <instance> */
+            Py_DECREF(value);
+            value = type;
+            type = (PyObject*) ((PyInstanceObject*)type)->in_class;
+            Py_INCREF(type);
+        }
+    }
+    else {
+        /* Not something you can raise.  You get an exception
+           anyway, just not what you specified :-) */
+        PyErr_Format(PyExc_TypeError,
+                 "exceptions must be strings, classes, or "
+                 "instances, not %s", type->ob_type->tp_name);
+        goto raise_error;
+    }
+    PyErr_Restore(type, value, tb);
+    return;
+raise_error:
+    Py_XDECREF(value);
+    Py_XDECREF(type);
+    Py_XDECREF(tb);
+    return;
+}
+
+static int __Pyx_InternStrings(__Pyx_InternTabEntry *t) {
+    while (t->p) {
+        *t->p = PyString_InternFromString(t->s);
+        if (!*t->p)
+            return -1;
+        ++t;
+    }
+    return 0;
+}
+
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
+    while (t->p) {
+        *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
+        if (!*t->p)
+            return -1;
+        ++t;
+    }
+    return 0;
+}
+
+#include "compile.h"
+#include "frameobject.h"
+#include "traceback.h"
+
+static void __Pyx_AddTraceback(char *funcname) {
+    PyObject *py_srcfile = 0;
+    PyObject *py_funcname = 0;
+    PyObject *py_globals = 0;
+    PyObject *empty_tuple = 0;
+    PyObject *empty_string = 0;
+    PyCodeObject *py_code = 0;
+    PyFrameObject *py_frame = 0;
+    
+    py_srcfile = PyString_FromString(__pyx_filename);
+    if (!py_srcfile) goto bad;
+    py_funcname = PyString_FromString(funcname);
+    if (!py_funcname) goto bad;
+    py_globals = PyModule_GetDict(__pyx_m);
+    if (!py_globals) goto bad;
+    empty_tuple = PyTuple_New(0);
+    if (!empty_tuple) goto bad;
+    empty_string = PyString_FromString("");
+    if (!empty_string) goto bad;
+    py_code = PyCode_New(
+        0,            /*int argcount,*/
+        0,            /*int nlocals,*/
+        0,            /*int stacksize,*/
+        0,            /*int flags,*/
+        empty_string, /*PyObject *code,*/
+        empty_tuple,  /*PyObject *consts,*/
+        empty_tuple,  /*PyObject *names,*/
+        empty_tuple,  /*PyObject *varnames,*/
+        empty_tuple,  /*PyObject *freevars,*/
+        empty_tuple,  /*PyObject *cellvars,*/
+        py_srcfile,   /*PyObject *filename,*/
+        py_funcname,  /*PyObject *name,*/
+        __pyx_lineno,   /*int firstlineno,*/
+        empty_string  /*PyObject *lnotab*/
+    );
+    if (!py_code) goto bad;
+    py_frame = PyFrame_New(
+        PyThreadState_Get(), /*PyThreadState *tstate,*/
+        py_code,             /*PyCodeObject *code,*/
+        py_globals,          /*PyObject *globals,*/
+        0                    /*PyObject *locals*/
+    );
+    if (!py_frame) goto bad;
+    py_frame->f_lineno = __pyx_lineno;
+    PyTraceBack_Here(py_frame);
+bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
+    Py_XDECREF(empty_tuple);
+    Py_XDECREF(empty_string);
+    Py_XDECREF(py_code);
+    Py_XDECREF(py_frame);
+}
diff --git a/checkpath.pyx b/checkpath.pyx
new file mode 100644 (file)
index 0000000..609119b
--- /dev/null
@@ -0,0 +1,92 @@
+
+
+cdef extern from *:
+  ctypedef int uid_t
+  ctypedef int gid_t
+  enum:
+    NGROUPS_MAX
+
+cdef extern from "checkpath.h":
+  struct checkpath:
+    uid_t cp_uid
+    gid_t cp_gid[NGROUPS_MAX + 1]
+    int cp_gids
+    int cp_verbose
+    unsigned cp_what
+    void (*cp_report)(unsigned, int, char *, char *, void *)
+    void *cp_arg
+  enum:
+    c_CP_ERROR "CP_ERROR"
+    c_CP_WRWORLD "CP_WRWORLD"
+    c_CP_WRGRP "CP_WRGRP"
+    c_CP_WROTHGRP "CP_WROTHGRP"
+    c_CP_WROTHUSR "CP_WROTHUSR"
+    c_CP_PROBLEMS "CP_PROBLEMS"
+    c_CP_SYMLINK "CP_SYMLINK"
+    c_CP_REPORT "CP_REPORT"
+    c_CP_STICKYOK "CP_STICKYOK"
+  int c_checkpath "checkpath"(char *path, checkpath *cp) except *
+  void c_checkpath_setids "checkpath_setids"(checkpath *cp)
+
+ERROR = c_CP_ERROR
+WRWORLD = c_CP_WRWORLD
+WRGRP = c_CP_WRGRP
+WROTHGRP = c_CP_WROTHGRP
+WROTHUSR = c_CP_WROTHUSR
+PROBLEMS = c_CP_PROBLEMS
+SYMLINK = c_CP_SYMLINK
+REPORT = c_CP_REPORT
+STICKYOK = c_CP_STICKYOK
+
+cdef void cp_report(unsigned what, int verb,
+                    char *path, char *msg, void *arg):
+  cdef object cp
+  cp = <object>arg
+  if msg is NULL:
+    msg = '<null>'
+  cp.report(what, verb, path, msg)
+
+cdef class CheckPath:
+  cdef checkpath cp
+  def __init__(me):
+    me.cp.cp_uid = 0
+    me.cp.cp_gids = 0
+    me.cp.cp_verbose = 1
+    me.cp.cp_what = c_CP_PROBLEMS
+    me.cp.cp_report = cp_report
+    me.cp.cp_arg = <void *>me
+    c_checkpath_setids(&me.cp)
+  def setids(me):
+    c_checkpath_setids(&me.cp)    
+  property uid:
+    def __get__(me):
+      return me.cp.cp_uid
+    def __set__(me, val):
+      me.cp.cp_uid = val
+  property gids:
+    def __get__(me):
+      g = []
+      for i from 0 <= i < me.cp.cp_gids:
+        g[i] = me.cp.cp_gid[i]
+      return g
+    def __set__(me, val):
+      if len(val) >= NGROUPS_MAX + 1:
+        raise TypeError, 'too many groups'
+      for i from 0 <= i < len(val):
+        me.cp.cp_gid[i] = val[i]
+      me.cp.cp_gids = len(val)
+  property verbose:
+    def __get__(me):
+      return me.cp.cp_verbose
+    def __set__(me, val):
+      me.cp.cp_verbose = val
+  property what:
+    def __get__(me):
+      return me.cp.cp_what
+    def __set__(me, val):
+      me.cp.cp_what = val
+  def check(me, path):
+    return c_checkpath(path, &me.cp)
+  def report(me, what, verb, path, msg):
+    pass
+
diff --git a/checkpath.pyx~ b/checkpath.pyx~
new file mode 100644 (file)
index 0000000..46ead15
--- /dev/null
@@ -0,0 +1,14 @@
+cdef extern from "checkpath.h":
+  struct checkpath:
+    ctypedef int uid_t
+    ctypedef int gid_t
+    uid_t cp_uid
+    gid_t cp_gid[]
+    int cp_gids
+    int cp_verbose
+    unsigned cp_what
+    void (*cp_report)(unsigned, int, char *, char *, void *)
+    void *cp_arg
+  int checkpath(char *path, checkpath *cp)
+  void checkpath_setids(checkpath *cp)
+
diff --git a/checkpath.so b/checkpath.so
new file mode 100755 (executable)
index 0000000..2ee1b2c
Binary files /dev/null and b/checkpath.so differ
diff --git a/test.py b/test.py
new file mode 100644 (file)
index 0000000..9eb2d8d
--- /dev/null
+++ b/test.py
@@ -0,0 +1,12 @@
+import checkpath as CP
+
+class VerboseCheck (CP.CheckPath):
+  def __init__(me):
+    CP.CheckPath.__init__(me)
+    me.what |= CP.REPORT
+  def report(me, what, verb, path, msg):
+    print msg
+
+cp = VerboseCheck()
+cp.check('/home/mdw')
+
diff --git a/test.py~ b/test.py~
new file mode 100644 (file)
index 0000000..f0f882a
--- /dev/null
+++ b/test.py~
@@ -0,0 +1,5 @@
+import checkpath as CP
+
+cp = CP.CheckPath()
+cp.check('/home/mdw')
+