Add
authorjbj <devnull@localhost>
Thu, 12 Dec 2002 17:46:22 +0000 (17:46 +0000)
committerjbj <devnull@localhost>
Thu, 12 Dec 2002 17:46:22 +0000 (17:46 +0000)
    PyObject *md_dict; /*!< to look like PyModuleObject */
to all rpmfoo_Type's.

CVS patchset: 5936
CVS date: 2002/12/12 17:46:22

13 files changed:
python/rpmal-py.h
python/rpmbc-py.h
python/rpmdb-py.h
python/rpmdebug-py.c
python/rpmds-py.h
python/rpmfd-py.h
python/rpmfi-py.h
python/rpmfts-py.c
python/rpmfts-py.h
python/rpmmi-py.h
python/rpmrc-py.h
python/rpmte-py.h
python/rpmts-py.h

index ee79fd6..62d69a4 100644 (file)
@@ -9,6 +9,7 @@
 
 typedef struct rpmalObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     rpmal      al;
 } rpmalObject;
 
index 54814c8..787509f 100644 (file)
@@ -11,6 +11,7 @@
  */
 typedef struct rpmbcObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     mp32number n;
 } rpmbcObject;
 
index 87e4a05..377f59e 100644 (file)
@@ -15,6 +15,7 @@ typedef struct rpmdbObject_s rpmdbObject;
  */
 struct rpmdbObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     rpmdb db;
     int offx;
     int noffs;
index 279c090..bd5520c 100644 (file)
@@ -9,15 +9,16 @@ extern PyTypeObject PyFrame_Type;
 #include "rpmbc-py.h"   /* XXX debug only */
 #include <rpmcli.h>    /* XXX debug only */
 
-#include "header-py.h"  /* XXX debug only */
-#include "rpmal-py.h"   /* XXX debug only */
-#include "rpmds-py.h"   /* XXX debug only */
-#include "rpmfd-py.h"   /* XXX debug only */
-#include "rpmfi-py.h"   /* XXX debug only */
-#include "rpmmi-py.h"   /* XXX debug only */
-#include "rpmrc-py.h"   /* XXX debug only */
-#include "rpmte-py.h"   /* XXX debug only */
-#include "rpmts-py.h"   /* XXX debug only */
+#include "header-py.h" /* XXX debug only */
+#include "rpmal-py.h"  /* XXX debug only */
+#include "rpmds-py.h"  /* XXX debug only */
+#include "rpmfd-py.h"  /* XXX debug only */
+#include "rpmfi-py.h"  /* XXX debug only */
+#include "rpmfts-py.h" /* XXX debug only */
+#include "rpmmi-py.h"  /* XXX debug only */
+#include "rpmrc-py.h"  /* XXX debug only */
+#include "rpmte-py.h"  /* XXX debug only */
+#include "rpmts-py.h"  /* XXX debug only */
 
 /**
  */
@@ -63,6 +64,7 @@ static const char * lbl(void * s)
     if (o->ob_type == &rpmds_Type)     return "rpmds";
     if (o->ob_type == &rpmfd_Type)     return "rpmfd";
     if (o->ob_type == &rpmfi_Type)     return "rpmfi";
+    if (o->ob_type == &rpmfts_Type)    return "rpmfts";
     if (o->ob_type == &rpmmi_Type)     return "rpmmi";
     if (o->ob_type == &rpmrc_Type)     return "rpmrc";
     if (o->ob_type == &rpmte_Type)     return "rpmte";
index 56f1b5c..83c8928 100644 (file)
@@ -11,6 +11,7 @@
  */
 typedef struct rpmdsObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     int                active;
 /*@null@*/
     rpmds      ds;
index 5ab81d6..142ff1b 100644 (file)
@@ -7,6 +7,7 @@
 
 typedef struct rpmfdObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     FD_t       fd;
 } rpmfdObject;
 
index f6ce8bc..386b308 100644 (file)
@@ -9,6 +9,7 @@
 
 typedef struct rpmfiObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     int active;
 /*@null@*/
     rpmfi fi;
index c48b502..c59944b 100644 (file)
@@ -5,6 +5,7 @@
 #include "system.h"
 
 #include "Python.h"
+#include "structmember.h"
 #ifdef __LCLINT__
 #undef  PyObject_HEAD
 #define PyObject_HEAD   int _PyObjectHead;
 
 #include <fts.h>
 
-#include <rpmlib.h>    /* XXX _free */
-
 #include "rpmfts-py.h"
 
+#include "rpmdebug-py.c"
+
+#include <rpmlib.h>    /* XXX _free */
+
 #include "debug.h"
 
 /*@unchecked@*/
@@ -52,6 +55,7 @@ static const char * ftsInfoStr(int fts_info)
 
 static void
 rpmfts_initialize(rpmftsObject * s, const char * root, int options, int ignore)
+       /*@modifies s @*/
 {
     int ac = 1;
     char * t;
@@ -82,6 +86,52 @@ fprintf(stderr, "*** initialize: %p[0] %p %s %x %x\n", s->roots, s->roots[0], s-
 
 }
 
+static int
+rpmfts_inactive(rpmftsObject * s)
+       /*@modifies s @*/
+{
+    int rc = 0;
+
+    if (s->ftsp) {
+       Py_BEGIN_ALLOW_THREADS
+       rc = Fts_close(s->ftsp);
+       Py_END_ALLOW_THREADS
+       s->ftsp = NULL;
+       s->fts = NULL;
+       s->active = 0;
+    }
+    return rc;
+}
+
+static PyObject *
+rpmfts_walk(rpmftsObject * s)
+       /*@modifies s @*/
+{
+    PyObject * result = NULL;
+    int xx;
+
+    if (s->ftsp == NULL)
+       return NULL;
+
+    do {
+       Py_BEGIN_ALLOW_THREADS
+       s->fts = Fts_read(s->ftsp);
+       Py_END_ALLOW_THREADS
+    } while (s->fts && (infoBit(s->fts->fts_info) & s->ignore));
+
+    if (s->fts != NULL) {
+       Py_INCREF(s);
+       result = (PyObject *)s;
+    } else {
+       if (s->active == 2)
+           xx = rpmfts_inactive(s);
+       s->active = 0;
+    }
+    return result;
+}
+
+/* ---------- */
+
 /** \ingroup python
  * \name Class: Rpmfts
  * \class Rpmfts
@@ -93,7 +143,8 @@ rpmfts_Debug(/*@unused@*/ rpmftsObject * s, PyObject * args)
        /*@globals _Py_NoneStruct @*/
        /*@modifies _Py_NoneStruct @*/
 {
-    if (!PyArg_ParseTuple(args, "i:Debug", &_rpmfts_debug)) return NULL;
+    if (!PyArg_ParseTuple(args, "i:Debug", &_rpmfts_debug))
+       return NULL;
 
     Py_INCREF(Py_None);
     return Py_None;
@@ -104,8 +155,6 @@ rpmfts_iter(rpmftsObject * s)
        /*@*/
 {
     Py_INCREF(s);
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_iter(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
     return (PyObject *)s;
 }
 
@@ -113,59 +162,15 @@ static PyObject *
 rpmfts_iternext(rpmftsObject * s)
        /*@modifies s @*/
 {
-    PyObject * result = NULL;
-    int xx;
-
     /* Reset loop indices on 1st entry. */
     if (!s->active) {
+       Py_BEGIN_ALLOW_THREADS
        s->ftsp = Fts_open((char *const *)s->roots, s->options, (int (*)())s->compare);
+       Py_END_ALLOW_THREADS
        s->fts = NULL;
        s->active = 2;
     }
-
-    if (s->ftsp != NULL)
-    do {
-       s->fts = Fts_read(s->ftsp);
-    } while (s->fts && (infoBit(s->fts->fts_info) & s->ignore));
-
-    if (s->fts != NULL) {
-       Py_INCREF(s);
-       result = (PyObject *)s;
-    } else {
-       if (s->active == 2) {
-           xx = Fts_close(s->ftsp);
-           s->ftsp = NULL;
-           s->fts = NULL;
-       }
-       s->active = 0;
-    }
-
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_iternext(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
-
-    return result;
-}
-
-static PyObject *
-rpmfts_Next(rpmftsObject * s, PyObject *args)
-       /*@globals _Py_NoneStruct @*/
-       /*@modifies s, _Py_NoneStruct @*/
-{
-    PyObject * result;
-
-if (_rpmfts_debug)
-fprintf(stderr, "*** rpmfts_Next(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
-
-    if (!PyArg_ParseTuple(args, ":Next"))
-       return NULL;
-
-    result = rpmfts_iternext(s);
-
-    if (result == NULL) {
-       Py_INCREF(Py_None);
-        return Py_None;
-    }
-    return result;
+    return rpmfts_walk(s);
 }
 
 static PyObject *
@@ -183,7 +188,9 @@ fprintf(stderr, "*** rpmfts_Open(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s
        return NULL;
     rpmfts_initialize(s, root, options, ignore);
 
+    Py_BEGIN_ALLOW_THREADS
     s->ftsp = Fts_open((char *const *)s->roots, s->options, (int (*)())s->compare);
+    Py_END_ALLOW_THREADS
     s->active = 1;
 
     return (PyObject *)s;
@@ -194,31 +201,18 @@ rpmfts_Read(rpmftsObject * s, PyObject * args)
        /*@globals _Py_NoneStruct @*/
        /*@modifies s, _Py_NoneStruct @*/
 {
-    PyObject * result = NULL;
-    int xx;
+    PyObject * result;
 
 if (_rpmfts_debug)
 fprintf(stderr, "*** rpmfts_Read(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
 
     if (!PyArg_ParseTuple(args, ":Read")) return NULL;
 
-    if (s->ftsp != NULL)
-    do {
-       s->fts = Fts_read(s->ftsp);
-    } while (s->fts && (infoBit(s->fts->fts_info) & s->ignore));
+    result = rpmfts_walk(s);
 
-    if (s->fts != NULL) {
-       Py_INCREF(s);
-       result = (PyObject *)s;
-    } else {
-       if (s->active == 2) {
-           xx = Fts_close(s->ftsp);
-           s->ftsp = NULL;
-           s->fts = NULL;
-       }
-       s->active = 0;
+    if (result == NULL) {
        Py_INCREF(Py_None);
-       result = Py_None;
+        return Py_None;
     }
 
     return result;
@@ -229,17 +223,19 @@ rpmfts_Children(rpmftsObject * s, PyObject * args)
        /*@globals _Py_NoneStruct @*/
        /*@modifies s, _Py_NoneStruct @*/
 {
-    int instr = 0;
+    int instr;
 
 if (_rpmfts_debug)
 fprintf(stderr, "*** rpmfts_Children(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
 
-    if (!PyArg_ParseTuple(args, ":Children")) return NULL;
+    if (!PyArg_ParseTuple(args, "i:Children", &instr)) return NULL;
 
     if (!(s && s->ftsp))
        return NULL;
 
+    Py_BEGIN_ALLOW_THREADS
     s->fts = Fts_children(s->ftsp, instr);
+    Py_END_ALLOW_THREADS
 
     Py_INCREF(Py_None);
     return Py_None;
@@ -249,21 +245,12 @@ static PyObject *
 rpmfts_Close(rpmftsObject * s, PyObject * args)
        /*@modifies s @*/
 {
-    int rc = 0;
-
 if (_rpmfts_debug)
 fprintf(stderr, "*** rpmfts_Close(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
 
     if (!PyArg_ParseTuple(args, ":Close")) return NULL;
 
-    if (s->ftsp) {
-       rc = Fts_close(s->ftsp);
-       s->ftsp = NULL;
-       s->fts = NULL;
-       s->active = 0;
-    }
-
-    return Py_BuildValue("i", rc);
+    return Py_BuildValue("i", rpmfts_inactive(s));
 }
 
 static PyObject *
@@ -276,7 +263,7 @@ rpmfts_Set(rpmftsObject * s, PyObject * args)
 if (_rpmfts_debug)
 fprintf(stderr, "*** rpmfts_Set(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
 
-    if (!PyArg_ParseTuple(args, ":Set")) return NULL;
+    if (!PyArg_ParseTuple(args, "i:Set", &instr)) return NULL;
 
     if (s->ftsp && s->fts)
        rc = Fts_set(s->ftsp, s->fts, instr);
@@ -291,8 +278,6 @@ fprintf(stderr, "*** rpmfts_Set(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s-
 static struct PyMethodDef rpmfts_methods[] = {
     {"Debug",  (PyCFunction)rpmfts_Debug,      METH_VARARGS,
        NULL},
-    {"next",   (PyCFunction)rpmfts_Next,       METH_VARARGS,
-       NULL},
     {"open",   (PyCFunction)rpmfts_Open,       METH_VARARGS,
        NULL},
     {"read",   (PyCFunction)rpmfts_Read,       METH_VARARGS,
@@ -309,56 +294,72 @@ static struct PyMethodDef rpmfts_methods[] = {
 
 /* ---------- */
 
-/** \ingroup python
- */
-static void
-rpmfts_dealloc(/*@only@*/ /*@null@*/ rpmftsObject * s)
-       /*@modifies s @*/
+static PyMemberDef rpmfts_members[] = {
+    {"__dict__",T_OBJECT,offsetof(rpmftsObject, md_dict),      READONLY,
+       NULL},
+    {"callbacks",T_OBJECT,offsetof(rpmftsObject, callbacks),   0,
+"Callback dictionary for FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"}, 
+    {"options",        T_INT,  offsetof(rpmftsObject, options),        0,
+"Option bit(s): FTS_{COMFOLLOW|LOGICAL|NOCHDIR|NOSTAT|PHYSICAL|SEEDOT|XDEV}"},
+    {"ignore", T_INT,  offsetof(rpmftsObject, ignore),         0,
+"Ignore bit(s): (1 << info) with info one of FTS_{D|DC|DEFAULT|DNR|DOT|DP|ERR|F|INIT|NS|NSOK|SL|SLNONE|W}"}, 
+    {NULL, 0, 0, 0}
+};              
+
+static PyObject * rpmfts_getattro(rpmftsObject * s, PyObject * n)
+       /*@*/
 {
-    if (s) {
 
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_dealloc(%p) %d %d ftsp %p fts %p\n", s, s->ob_refcnt, s->active, s->ftsp, s->fts);
-
-       if (s->ftsp) {
-           (void) Fts_close(s->ftsp);
-           s->ftsp = NULL;
-           s->fts = NULL;
-           s->active = 0;
-       }
-       s->roots = _free(s->roots);
-       PyObject_Del(s);
-    }
+if (_rpmfts_debug)
+fprintf(stderr, "*** rpmfts_getattro(%p[%s],%p[%s]) %d %d ftsp %p fts %p\n", s, lbl(s), n, lbl(n), s->ob_refcnt, s->active, s->ftsp, s->fts);
+
+    return PyObject_GenericGetAttr((PyObject *)s, n);
 }
 
-/** \ingroup python
- */
-static int
-rpmfts_print(rpmftsObject * s, FILE * fp, /*@unused@*/ int flags)
-       /*@globals fileSystem @*/
-       /*@modifies fp, fileSystem @*/
+static int rpmfts_setattro(rpmftsObject * s, PyObject * n, PyObject * v)
+       /*@*/
 {
-    static int indent = 2;
 
-    if (!(s && s->ftsp && s->fts))
-       return -1;
-    fprintf(fp, "FTS_%-7s %*s%s", ftsInfoStr(s->fts->fts_info),
-       indent * (s->fts->fts_level < 0 ? 0 : s->fts->fts_level), "",
-       s->fts->fts_name);
-    return 0;
+if (_rpmfts_debug)
+fprintf(stderr, "*** rpmfts_setattro(%p[%s],%p[%s],%p[%s]) %d %d ftsp %p fts %p\n", s, lbl(s), n, lbl(n), v, lbl(v), s->ob_refcnt, s->active, s->ftsp, s->fts);
 
+    return PyObject_GenericSetAttr((PyObject *)s, n, v);
 }
 
-/** \ingroup python
- */
-static PyObject * rpmfts_getattr(rpmftsObject * o, char * name)
+/* ---------- */
+
+static void rpmfts_free(/*@only@*/ PyObject * s)
+       /*@modifies s @*/
+{
+    _PyObject_GC_Del(s);
+}
+
+static PyObject * rpmfts_alloc(PyTypeObject * type, int nitems)
        /*@*/
 {
-    return Py_FindMethod(rpmfts_methods, (PyObject *) o, name);
+    return PyType_GenericAlloc(type, nitems);
+}
+
+static void rpmfts_dealloc(/*@only@*/ rpmftsObject * s)
+       /*@modifies s @*/
+{
+    int xx;
+
+    xx = rpmfts_inactive(s);
+    s->roots = _free(s->roots);
+
+    PyObject_GC_UnTrack((PyObject *)s);
+    if (s->md_dict != NULL) {
+       _PyModule_Clear((PyObject *)s);
+       Py_DECREF(s->md_dict);
+    }
+    if (s->callbacks != NULL) {
+       _PyModule_Clear((PyObject *)s);
+       Py_DECREF(s->callbacks);
+    }
+    _PyObject_GC_Del((PyObject *)s);
 }
 
-/** \ingroup python
- */
 static int rpmfts_init(rpmftsObject * s, PyObject *args, PyObject *kwds)
        /*@*/
 {
@@ -366,9 +367,6 @@ static int rpmfts_init(rpmftsObject * s, PyObject *args, PyObject *kwds)
     int options = -1;
     int ignore = -1;
 
-if (_rpmfts_debug < 0)
-fprintf(stderr, "*** rpmfts_init(%p,%p,%p)\n", s, args, kwds);
-
     if (!PyArg_ParseTuple(args, "|sii:rpmfts_init", &root, &options, &ignore))
        return -1;
     rpmfts_initialize(s, root, options, ignore);
@@ -376,53 +374,113 @@ fprintf(stderr, "*** rpmfts_init(%p,%p,%p)\n", s, args, kwds);
     return 0;
 }
 
-/** \ingroup python
- */
-static void rpmfts_free(/*@only@*/ rpmftsObject * s)
-       /*@modifies s @*/
+static PyObject * rpmfts_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+       /*@*/
 {
-if (_rpmfts_debug < 0)
-fprintf(stderr, "%p -- fts %p\n", s, s->ftsp);
+    rpmftsObject *s;
+    PyObject *o;
+    PyObject *n = NULL;
 
-    if (s->ftsp) {
-       (void) Fts_close(s->ftsp);
-       s->ftsp = NULL;
-       s->fts = NULL;
+    if ((s = PyObject_GC_New(rpmftsObject, type)) == NULL)
+       return NULL;
+
+    s->md_dict = PyDict_New();
+    if (s->md_dict == NULL)
+       goto fail;
+    s->callbacks = PyDict_New();
+    if (s->md_dict == NULL)
+       goto fail;
+    if (type->tp_name) {
+       char * name;
+       if ((name = strrchr(type->tp_name, '.')) != NULL)
+           name++;
+       else
+           name = type->tp_name;
+       n = PyString_FromString(name);
     }
-    s->roots = _free(s->roots);
+    if (n != NULL && PyDict_SetItemString(s->md_dict, "__name__", n) != 0)
+       goto fail;
+    if (PyDict_SetItemString(s->md_dict, "__doc__", Py_None) != 0)
+       goto fail;
+
+#define        CONSTANT(_v) \
+    PyDict_SetItemString(s->md_dict, #_v, o=PyInt_FromLong(_v)); Py_DECREF(o)
+
+    CONSTANT(FTS_ROOTPARENTLEVEL);
+    CONSTANT(FTS_ROOTLEVEL);
+
+    CONSTANT(FTS_COMFOLLOW);
+    CONSTANT(FTS_LOGICAL);
+    CONSTANT(FTS_NOCHDIR);
+    CONSTANT(FTS_NOSTAT);
+    CONSTANT(FTS_PHYSICAL);
+    CONSTANT(FTS_SEEDOT);
+    CONSTANT(FTS_XDEV);
+    CONSTANT(FTS_WHITEOUT);
+    CONSTANT(FTS_OPTIONMASK);
+
+    CONSTANT(FTS_NAMEONLY);
+    CONSTANT(FTS_STOP);
+
+    CONSTANT(FTS_D);
+    CONSTANT(FTS_DC);
+    CONSTANT(FTS_DEFAULT);
+    CONSTANT(FTS_DNR);
+    CONSTANT(FTS_DOT);
+    CONSTANT(FTS_DP);
+    CONSTANT(FTS_ERR);
+    CONSTANT(FTS_F);
+    CONSTANT(FTS_NS);
+    CONSTANT(FTS_NSOK);
+    CONSTANT(FTS_SL);
+    CONSTANT(FTS_SLNONE);
+    CONSTANT(FTS_W);
+
+    CONSTANT(FTS_DONTCHDIR);
+    CONSTANT(FTS_SYMFOLLOW);
+    
+    CONSTANT(FTS_AGAIN);
+    CONSTANT(FTS_FOLLOW);
+    CONSTANT(FTS_NOINSTR);
+    CONSTANT(FTS_SKIP);
 
-    PyObject_Del((PyObject *)s);
-}
+    /* Perform additional initialization. */
+    if (rpmfts_init(s, args, kwds) < 0)
+       goto fail;
 
-/** \ingroup python
- */
-static PyObject * rpmfts_alloc(PyTypeObject * subtype, int nitems)
-       /*@*/
-{
-    PyObject * s = PyType_GenericAlloc(subtype, nitems);
+    Py_XDECREF(n);
+    PyObject_GC_Track((PyObject *)s);
+    return (PyObject *)s;
 
-if (_rpmfts_debug)
-fprintf(stderr, "*** rpmfts_alloc(%p,%d) ret %p\n", subtype, nitems, s);
-    return s;
+ fail:
+    Py_XDECREF(n);
+    Py_DECREF(s);
+    return NULL;
 }
 
-/** \ingroup python
- */
-static rpmftsObject * rpmfts_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
+static int rpmfts_traverse(rpmftsObject * s, visitproc visit, void * arg)
        /*@*/
 {
-    rpmftsObject * s = PyObject_New(rpmftsObject, subtype);
+    if (s->md_dict != NULL)
+       return visit(s->md_dict, arg);
+    if (s->callbacks != NULL)
+       return visit(s->callbacks, arg);
+    return 0;
+}
 
-    /* Perform additional initialization. */
-    if (rpmfts_init(s, args, kwds) < 0) {
-       rpmfts_free(s);
-       return NULL;
-    }
+static int rpmfts_print(rpmftsObject * s, FILE * fp, /*@unused@*/ int flags)
+       /*@globals fileSystem @*/
+       /*@modifies fp, fileSystem @*/
+{
+    static int indent = 2;
 
-if (_rpmfts_debug < 0)
-fprintf(stderr, "%p ++ fts %p\n", s, s->ftsp);
+    if (!(s && s->ftsp && s->fts))
+       return -1;
+    fprintf(fp, "FTS_%-7s %*s%s", ftsInfoStr(s->fts->fts_info),
+       indent * (s->fts->fts_level < 0 ? 0 : s->fts->fts_level), "",
+       s->fts->fts_name);
+    return 0;
 
-    return s;
 }
 
 /**
@@ -443,7 +501,7 @@ PyTypeObject rpmfts_Type = {
        /* methods */
        (destructor) rpmfts_dealloc,    /* tp_dealloc */
        (printfunc) rpmfts_print,       /* tp_print */
-       (getattrfunc) rpmfts_getattr,   /* tp_getattr */
+       (getattrfunc)0,                 /* tp_getattr */
        (setattrfunc)0,                 /* tp_setattr */
        (cmpfunc)0,                     /* tp_compare */
        (reprfunc)0,                    /* tp_repr */
@@ -453,31 +511,30 @@ PyTypeObject rpmfts_Type = {
        (hashfunc)0,                    /* tp_hash */
        (ternaryfunc)0,                 /* tp_call */
        (reprfunc)0,                    /* tp_str */
-       0,                              /* tp_getattro */
-       0,                              /* tp_setattro */
+       (getattrofunc) rpmfts_getattro, /* tp_getattro */
+       (setattrofunc) rpmfts_setattro, /* tp_setattro */
        0,                              /* tp_as_buffer */
-       Py_TPFLAGS_DEFAULT,             /* tp_flags */
+       Py_TPFLAGS_DEFAULT |            /* tp_flags */
+               Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,
        rpmfts_doc,                     /* tp_doc */
-#if Py_TPFLAGS_HAVE_ITER
-       0,                              /* tp_traverse */
+       (traverseproc) rpmfts_traverse, /* tp_traverse */
        0,                              /* tp_clear */
        0,                              /* tp_richcompare */
        0,                              /* tp_weaklistoffset */
        (getiterfunc) rpmfts_iter,      /* tp_iter */
        (iternextfunc) rpmfts_iternext, /* tp_iternext */
        rpmfts_methods,                 /* tp_methods */
-       0,                              /* tp_members */
+       rpmfts_members,                 /* tp_members */
        0,                              /* tp_getset */
        0,                              /* tp_base */
        0,                              /* tp_dict */
        0,                              /* tp_descr_get */
        0,                              /* tp_descr_set */
-       0,                              /* tp_dictoffset */
+       offsetof(rpmftsObject, md_dict),/* tp_dictoffset */
        (initproc) rpmfts_init,         /* tp_init */
-       (allocfunc) rpmfts_alloc,       /* tp_alloc */
-       (newfunc) rpmfts_new,           /* tp_new */
-       (destructor) rpmfts_free,       /* tp_free */
+       rpmfts_alloc,                   /* tp_alloc */
+       rpmfts_new,                     /* tp_new */
+       rpmfts_free,                    /* tp_free */
        0,                              /* tp_is_gc */
-#endif
 };
 /*@=fullinitblock@*/
index a9556b3..56ebfdf 100644 (file)
@@ -9,6 +9,9 @@
 
 typedef struct rpmftsObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
+    PyObject *callbacks;
+
 /*@null@*/
     const char ** roots;
     int                options;
index bfa42fc..9d67721 100644 (file)
@@ -13,6 +13,7 @@ typedef struct rpmmiObject_s rpmmiObject;
  */
 struct rpmmiObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     rpmdbMatchIterator mi;
 } ;
 
index 5025386..4ab1199 100644 (file)
@@ -18,6 +18,7 @@ struct rpmrcObject_s {
 #else
     PyObject_HEAD
 #endif
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
 } ;
 
 /*@unchecked@*/
index 18b6267..3bce935 100644 (file)
@@ -9,6 +9,7 @@
 
 typedef struct rpmteObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     rpmte      te;
 } rpmteObject;
 
index 526b838..9ca496d 100644 (file)
@@ -9,6 +9,7 @@
 
 typedef struct rpmtsObject_s {
     PyObject_HEAD
+    PyObject *md_dict;         /*!< to look like PyModuleObject */
     rpmts      ts;
     PyObject * keyList;                /* keeps reference counts correct */
     FD_t scriptFd;