From 8598b22e101201de4d06ea48f2b500f81f2b30d5 Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Tue, 14 Dec 2010 13:56:07 +0100 Subject: a stub for report-python --- src/report-python/Makefile.am | 25 +++++ src/report-python/__init__.py | 1 + src/report-python/crash_dump.c | 200 ++++++++++++++++++++++++++++++++++++ src/report-python/py_crash_dump.h | 30 ++++++ src/report-python/pyreport_common.h | 22 ++++ src/report-python/reportmodule.c | 34 ++++++ 6 files changed, 312 insertions(+) create mode 100644 src/report-python/Makefile.am create mode 100644 src/report-python/__init__.py create mode 100644 src/report-python/crash_dump.c create mode 100644 src/report-python/py_crash_dump.h create mode 100644 src/report-python/pyreport_common.h create mode 100644 src/report-python/reportmodule.c (limited to 'src/report-python') diff --git a/src/report-python/Makefile.am b/src/report-python/Makefile.am new file mode 100644 index 00000000..34ec090c --- /dev/null +++ b/src/report-python/Makefile.am @@ -0,0 +1,25 @@ +pyreportexecdir = $(pyexecdir)/report + +pyreportexec_PYTHON = __init__.py + +pyreportexec_LTLIBRARIES = _pyreport.la + +_pyreport_la_SOURCES = \ + reportmodule.c crash_dump.c py_crash_dump.h pyreport_common.h +_pyreport_la_CPPFLAGS = \ + -I$(srcdir)/../include/report -I$(srcdir)/../include \ + -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ + -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ + -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ + -DLOCALSTATEDIR='"$(localstatedir)"' \ + -DCONF_DIR=\"$(CONF_DIR)\" \ + -DVAR_RUN=\"$(VAR_RUN)\" \ + $(GLIB_CFLAGS) \ + $(PYTHON_CFLAGS) \ + -D_GNU_SOURCE +_pyreport_la_LDFLAGS = \ + -module \ + -avoid-version \ + -export-symbols-regex init_pyreport +_pyreport_la_LIBADD = \ + ../lib/libreport.la diff --git a/src/report-python/__init__.py b/src/report-python/__init__.py new file mode 100644 index 00000000..90109551 --- /dev/null +++ b/src/report-python/__init__.py @@ -0,0 +1 @@ +from _pyreport import * diff --git a/src/report-python/crash_dump.c b/src/report-python/crash_dump.c new file mode 100644 index 00000000..078e96bd --- /dev/null +++ b/src/report-python/crash_dump.c @@ -0,0 +1,200 @@ +/* + Copyright (C) 2009 Abrt team. + Copyright (C) 2009 RedHat inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +#include +#include +#include +#include "crash_dump.h" +#include "pyreport_common.h" + +typedef struct { + PyObject_HEAD + crash_data_t *cd; +} p_crash_data; + +static void +p_crash_data_dealloc(PyObject *pself) +{ + p_crash_data* self = (p_crash_data*)pself; + free_crash_data(self->cd); + self->cd = NULL; + self->ob_type->tp_free((PyObject*)self); +} + +static PyObject * +p_crash_data_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + p_crash_data *self; + + self = (p_crash_data *)type->tp_alloc(type, 0); + if (self != NULL) + self->cd = new_crash_data(); + + return (PyObject *)self; +} + +static int +p_crash_data_init(PyObject *pself, PyObject *args, PyObject *kwds) +{ + return 0; +} + +/* +void add_to_crash_data_ext(crash_data_t *crash_data, + const char *name, + const char *content, + unsigned flags); +*/ + +static PyObject * p_crash_data_add_ext(PyObject *pself, PyObject *args, PyObject *kwds) +{ + p_crash_data* self = (p_crash_data*)pself; + + + const char * name; + const char * content; + int FLAGS; + if(!PyArg_ParseTuple(args, "ssi", &name, &content, &FLAGS)) + { + PyErr_SetString(ReportError, strerror(errno)); + return NULL; + } + add_to_crash_data_ext(self->cd, name, content, FLAGS); + + /* every function returns PyObject to return void we need to do this */ + Py_RETURN_NONE; +} +static PyObject * p_crash_data_add(PyObject *pself, PyObject *args, PyObject *kwds) +{ + p_crash_data* self = (p_crash_data*)pself; + + + const char * name; + const char * content; + if(!PyArg_ParseTuple(args, "ss", &name, &content)) + { + /* PyArg_ParseTuple raises the exception saying why it fails + * eg: TypeError: function takes exactly 2 arguments (1 given) + */ + return NULL; + } + add_to_crash_data(self->cd, name, content); + + /* every function returns PyObject to return void we need to do this */ + Py_RETURN_NONE; +} + +/* +static inline struct crash_item *get_crash_data_item_or_NULL(crash_data_t *crash_data, const char *key) +{ + return (struct crash_item *)g_hash_table_lookup(crash_data, key); +} +*/ + +static PyObject * p_get_crash_data_item(PyObject *pself, PyObject *args, PyObject *kwds) +{ + p_crash_data* self = (p_crash_data*)pself; + + const char *key; + if(!PyArg_ParseTuple(args, "s", &key)) + { + return NULL; + } + struct crash_item *ci = get_crash_data_item_or_NULL(self->cd, key); + return Py_BuildValue("sI", ci->content, ci->flags); +} + + +static PyObject * p_create_crash_dump_dir(PyObject *pself, PyObject *args) +{ + p_crash_data* self = (p_crash_data*)pself; + struct dump_dir *dd = create_crash_dump_dir(self->cd); + if(dd == NULL) + { + PyErr_SetString(ReportError, "Can't create the dump dir"); + return NULL; + } + //FIXME: return a python representation of dump_dir, when we have it.. + Py_RETURN_NONE; +} + +static PyMemberDef p_crash_data_members[] = { + {NULL} /* Sentinel */ +}; + +static PyMethodDef p_crash_data_methods[] = { + {"add", (PyCFunction)p_crash_data_add, METH_VARARGS, + "Adds item to the crash data using default flags" + }, + {"add_ext", (PyCFunction)p_crash_data_add_ext, METH_VARARGS, + "Adds item to the crash data" + }, + {"get", (PyCFunction)p_get_crash_data_item, METH_VARARGS, + "Gets the value of item indexed by the key" + }, + {"to_dump_dir", (PyCFunction)p_create_crash_dump_dir, METH_NOARGS, + "Saves the crash_data to"LOCALSTATEDIR"/run/abrt/tmp--