1c9fae5
changeset:   6176:c0237c16e2e3
1c9fae5
user:        Panu Matilainen <pmatilai@redhat.com>
1c9fae5
date:        Fri Jul 20 10:41:15 2007 +0300
1c9fae5
files:       python/rpmmodule.c
1c9fae5
description:
1c9fae5
Add python methods for checking pending signals from rpmsqCaught.
1c9fae5
- a thin wrapper for rpmdbCheckSignals() from rpm5.org / Jeff Johnson
1c9fae5
- a function taking a list of signals to check and returning list caught
1c9fae5
  signals (python doesn't know about signal sets so rpmsqCaught needs
1c9fae5
  wrapping)
1c9fae5
1c9fae5
1c9fae5
diff -r d8e2ec20c948 -r c0237c16e2e3 python/rpmmodule.c
1c9fae5
--- a/python/rpmmodule.c	Wed Jul 18 16:05:56 2007 +0300
1c9fae5
+++ b/python/rpmmodule.c	Fri Jul 20 10:41:15 2007 +0300
1c9fae5
@@ -7,6 +7,7 @@
1c9fae5
 #include <rpmio_internal.h>
1c9fae5
 #include <rpmcli.h>	/* XXX for rpmCheckSig */
1c9fae5
 #include <rpmdb.h>
1c9fae5
+#include <rpmsq.h>
1c9fae5
 
1c9fae5
 #include "legacy.h"
1c9fae5
 #include "misc.h"
1c9fae5
@@ -58,6 +59,50 @@ static PyObject * archScore(PyObject * s
1c9fae5
 }
1c9fae5
 
1c9fae5
 /**
1c9fae5
+ *  */
1c9fae5
+static PyObject * signalsCaught(PyObject * self, PyObject * check)
1c9fae5
+{
1c9fae5
+    PyObject *caught, *o;
1c9fae5
+    Py_ssize_t llen;
1c9fae5
+    int signum, i;
1c9fae5
+    sigset_t newMask, oldMask;
1c9fae5
+
1c9fae5
+    if (!PyList_Check(check)) {
1c9fae5
+	PyErr_SetString(PyExc_TypeError, "list expected");
1c9fae5
+	return NULL;
1c9fae5
+    }
1c9fae5
+
1c9fae5
+    llen = PyList_Size(check);
1c9fae5
+    caught = PyList_New(0);
1c9fae5
+
1c9fae5
+    /* block signals while checking for them */
1c9fae5
+    (void) sigfillset(&newMask);
1c9fae5
+    (void) sigprocmask(SIG_BLOCK, &newMask, &oldMask);
1c9fae5
+
1c9fae5
+    for (i = 0; i < llen; i++) {
1c9fae5
+	o = PyList_GetItem(check, i);
1c9fae5
+	signum = PyInt_AsLong(o);
1c9fae5
+	if (sigismember(&rpmsqCaught, signum)) {
1c9fae5
+	    PyList_Append(caught, o);
1c9fae5
+	}
1c9fae5
+    }
1c9fae5
+    (void) sigprocmask(SIG_SETMASK, &oldMask, NULL);
1c9fae5
+
1c9fae5
+    return caught;
1c9fae5
+}
1c9fae5
+
1c9fae5
+/**
1c9fae5
+ *  */
1c9fae5
+static PyObject * checkSignals(PyObject * self, PyObject * args)
1c9fae5
+{
1c9fae5
+    if (!PyArg_ParseTuple(args, ":checkSignals")) return NULL;
1c9fae5
+    rpmdbCheckSignals();
1c9fae5
+    Py_INCREF(Py_None);
1c9fae5
+    return Py_None;
1c9fae5
+}
1c9fae5
+
1c9fae5
+
1c9fae5
+/**
1c9fae5
  */
1c9fae5
 static PyObject * setLogFile (PyObject * self, PyObject * args, PyObject *kwds)
1c9fae5
 {
1c9fae5
@@ -145,6 +190,11 @@ static PyMethodDef rpmModuleMethods[] = 
1c9fae5
 
1c9fae5
     { "archscore", (PyCFunction) archScore, METH_VARARGS|METH_KEYWORDS,
1c9fae5
 	NULL },
1c9fae5
+
1c9fae5
+    { "signalsCaught", (PyCFunction) signalsCaught, METH_O, 
1c9fae5
+	NULL },
1c9fae5
+    { "checkSignals", (PyCFunction) checkSignals, METH_VARARGS,
1c9fae5
+        NULL },
1c9fae5
 
1c9fae5
     { "headerLoad", (PyCFunction) hdrLoad, METH_VARARGS|METH_KEYWORDS,
1c9fae5
 	NULL },
1c9fae5