gdbserver for core files
by Jan Kratochvil
Hi,
with the proposal:
https://fedoraproject.org/wiki/Features/RetraceServer
and its core files upload feature I tried to provide a gdbserver interface for
the core files instead as the upload can be slow. FSF gdbserver cannot load
core files so created a simple new gdbserver for it:
git://git.fedorahosted.org/git/elfutils.git
branch: jankratochvil/gdbserver
src/gdbserver.c
* Currently threading is not supported.
* Currently only x86_64 is supported (the NOTE registers layout).
In my current setup of:
* link RTT (round trip time): 272ms
* uplink speed: 1Mbit
* core file from openoffice.org: 74M
* core file from openoffice.org xz -9e: 8.6M
I get:
1m35.685s: scp upload.
1m31.144s: gdbserver with gdb LINE_SIZE_POWER == 12 (0x1000).
3m55.867s: gdbserver with gdb default LINE_SIZE_POWER == 6 ( 0x40).
Just I guess usually people have lower RTT and lower uplink, don't they?
In such case the results would be much more in the favor of gdbserver.
Still in none of the cases it completes in 60 seconds after which you kill
current GDB. So you are going to be killing even the upload processes.
I can finish the two missing features if there is an interest in it.
Thanks,
Jan
13 years, 4 months
[PATCH 1/4] dump_dir: return unknown files
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/include/abrt_crash_dump.h | 1 +
src/include/report/dump_dir.h | 1 +
src/lib/crash_dump.c | 31 +++++++++++++++++++++++++++++++
src/lib/dump_dir.c | 41 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 74 insertions(+), 0 deletions(-)
diff --git a/src/include/abrt_crash_dump.h b/src/include/abrt_crash_dump.h
index 9ecbf56..aa62000 100644
--- a/src/include/abrt_crash_dump.h
+++ b/src/include/abrt_crash_dump.h
@@ -70,6 +70,7 @@
// (a string with "\n" terminated event names)
#define CD_EVENTS "Events"
+extern const char *abrt_known_files[];
#ifdef __cplusplus
extern "C" {
diff --git a/src/include/report/dump_dir.h b/src/include/report/dump_dir.h
index bf3b120..913eca1 100644
--- a/src/include/report/dump_dir.h
+++ b/src/include/report/dump_dir.h
@@ -58,6 +58,7 @@ char* dd_load_text(const struct dump_dir *dd, const char *name);
void dd_save_text(struct dump_dir *dd, const char *name, const char *data);
void dd_save_binary(struct dump_dir *dd, const char *name, const char *data, unsigned size);
void dd_delete(struct dump_dir *dd);
+char **dd_get_unknown_files(struct dump_dir *dd, const char **known_files);
void delete_dump_dir(const char *dd_dir);
diff --git a/src/lib/crash_dump.c b/src/lib/crash_dump.c
index 189ec9c..c7f44e5 100644
--- a/src/lib/crash_dump.c
+++ b/src/lib/crash_dump.c
@@ -19,6 +19,37 @@
#include "abrtlib.h"
#include "abrt_crash_dump.h"
+const char *abrt_known_files[] = {
+ FILENAME_ANALYZER ,
+ FILENAME_EXECUTABLE ,
+ FILENAME_BINARY ,
+ FILENAME_CMDLINE ,
+ FILENAME_REASON ,
+ FILENAME_COREDUMP ,
+ FILENAME_MEMORYMAP ,
+ FILENAME_DUPHASH ,
+ FILENAME_CRASH_FUNCTION ,
+ FILENAME_ARCHITECTURE ,
+ FILENAME_KERNEL ,
+ FILENAME_TIME ,
+ FILENAME_RELEASE ,
+ FILENAME_PACKAGE ,
+ FILENAME_COMPONENT ,
+ FILENAME_DESCRIPTION ,
+ FILENAME_COMMENT ,
+ FILENAME_REPRODUCE ,
+ FILENAME_RATING ,
+ FILENAME_HOSTNAME ,
+ FILENAME_REMOTE ,
+ FILENAME_TAINTED ,
+ FILENAME_UID ,
+ FILENAME_UUID ,
+ FILENAME_INFORMALL ,
+ FILENAME_COUNT ,
+ FILENAME_MESSAGE ,
+ NULL
+};
+
static void free_crash_item(void *ptr)
{
if (ptr)
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
index 8e1744a..0e0b5f1 100644
--- a/src/lib/dump_dir.c
+++ b/src/lib/dump_dir.c
@@ -503,6 +503,47 @@ int dd_get_next_file(struct dump_dir *dd, char **short_name, char **full_name)
return 0;
}
+/*
+ * return list of unknown files in dump directory
+ */
+char **dd_get_unknown_files(struct dump_dir *dd, const char **known_files)
+{
+ if (!dd->locked)
+ error_msg_and_die("dump_dir is not opened"); /* bug */
+
+ char *short_name = NULL;
+ unsigned size = 16;
+ unsigned idx = 0;
+ char **unknowns = xzalloc(sizeof(char*) * size);
+
+ dd_init_next_file(dd);
+ while (dd_get_next_file(dd, &short_name, NULL))
+ {
+ if (idx + 1 >= size)
+ {
+ size *= 2;
+ unknowns = xrealloc(unknowns, sizeof(char*) * size);
+ }
+
+ const char *const *v = known_files;
+ while (*v)
+ {
+ if (strcmp(*v, short_name) == 0)
+ break;
+ v++;
+ }
+
+ if (*v)
+ continue;
+
+ unknowns[idx++] = short_name;
+ }
+
+ unknowns[idx] = NULL;
+
+ return unknowns;
+}
+
/* Utility function */
void delete_dump_dir(const char *dd_dir)
{
--
1.7.3.3.489.g44430
13 years, 4 months
[PATCH v2] python wrapper for crash_data.h/.c API
by Denys Vlasenko
On Mon, 2010-12-13 at 12:10 +0100, Denys Vlasenko wrote:
> Only compile tested.
Updated patch. Now run tested with the following script:
#!/usr/bin/python
from report import *
cd = crash_data()
print cd
It prints:
HERE1
HERE2
HERE3
HERE4
HERE5
<crash_dump.crash_data object at 0x7f6a5a1600d8>
This patch compiles wrapper into _pyreport.so, and then loads it
from __init__.py via "from _pyreport import *". Currently,
only one of tree modules in reporl library (crash_dump.c)
is wrapped, two other ones (dump_dir.c and run_event.c)
are to be added in the following patches.
__init__.py and _pyreport.so are packaged into report-libs-python
and on package installation they go to
/usr/lib64/python2.6/site-packages/report.
Changes since v1:
- corrected init function name and module name
(and added comments explaining it)
- used more compact and readable static PyTypeObject p_crash_data_type
declaration
--
vda
diff -x '*.po' -d -urpN abrt.7/abrt.spec abrt.8/abrt.spec
--- abrt.7/abrt.spec 2010-12-09 14:14:40.270705183 +0100
+++ abrt.8/abrt.spec 2010-12-13 12:05:09.129593516 +0100
@@ -70,6 +70,14 @@ Group: System Environment/Libraries
Libraries providing API for reporting different problems in applications
to different bug targets like bugzilla, ftp, trac, etc...
+%package -n report-libs-python
+Summary: Python bindings for report-libs.
+# Is group correct here? -
+Group: System Environment/Libraries
+
+%description -n report-libs-python
+Python bindings for report-libs.
+
%package -n report-libs-devel
Summary: Development libraries and headers for report-libs.
Group: Development/Libraries
@@ -365,6 +373,10 @@ fi
%defattr(-,root,root,-)
%{_libdir}/libreport.so.*
+%files -n report-libs-python
+%defattr(-,root,root,-)
+%{python_sitearch}/report/*
+
%files -n report-libs-devel
%defattr(-,root,root,-)
%{_includedir}/report/*
diff -x '*.po' -d -urpN abrt.7/configure.ac abrt.8/configure.ac
--- abrt.7/configure.ac 2010-12-08 15:10:52.000000000 +0100
+++ abrt.8/configure.ac 2010-12-12 07:12:52.880065691 +0100
@@ -119,6 +119,7 @@ AC_CONFIG_FILES([
abrt.pc
src/include/Makefile
src/lib/Makefile
+ src/libpy/Makefile
src/plugins/Makefile
src/Makefile
src/btparser/Makefile
diff -x '*.po' -d -urpN abrt.7/src/libpy/crash_dump.c abrt.8/src/libpy/crash_dump.c
--- abrt.7/src/libpy/crash_dump.c 1970-01-01 01:00:00.000000000 +0100
+++ abrt.8/src/libpy/crash_dump.c 2010-12-14 11:57:38.572165536 +0100
@@ -0,0 +1,153 @@
+/*
+ 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 <Python.h>
+#include <structmember.h>
+
+#include <stdio.h>
+#include "crash_dump.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;
+}
+
+static PyMemberDef p_crash_data_members[] = {
+ {NULL} /* Sentinel */
+};
+
+static PyMethodDef p_crash_data_methods[] = {
+ {NULL} /* Sentinel */
+};
+
+#if 0
+static PyTypeObject p_crash_data_type = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "crash_dump.crash_data", /*tp_name*/
+ sizeof(p_crash_data), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ p_crash_data_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ "crash_data objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ p_crash_data_methods, /* tp_methods */
+ p_crash_data_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ p_crash_data_init, /* tp_init */
+ 0, /* tp_alloc */
+ p_crash_data_new, /* tp_new */
+};
+#else
+static PyTypeObject p_crash_data_type = {
+ PyObject_HEAD_INIT(NULL)
+ .tp_name = "crash_dump.crash_data",
+ .tp_basicsize = sizeof(p_crash_data),
+ .tp_dealloc = p_crash_data_dealloc,
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .tp_doc = "crash_data objects",
+ .tp_methods = p_crash_data_methods,
+ .tp_members = p_crash_data_members,
+ .tp_init = p_crash_data_init,
+ .tp_new = p_crash_data_new,
+};
+#endif
+
+static PyMethodDef module_methods[] = {
+ {NULL} /* Sentinel */
+};
+
+#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
+#define PyMODINIT_FUNC void
+#endif
+/* Name of this function must be initMODULENAME,
+ * where MODULENAME comes from MODULENAME.so
+ */
+PyMODINIT_FUNC
+init_pyreport(void)
+{
+ PyObject* m;
+
+ printf("HERE1\n");
+ if (PyType_Ready(&p_crash_data_type) < 0)
+ return;
+
+ printf("HERE2\n");
+ /* The name here, again, must match MODULENAME from MODULENAME.so */
+ m = Py_InitModule3("_pyreport", module_methods, "Python wrapper around crash_data_t");
+ if (m == NULL)
+ return;
+
+ printf("HERE3\n");
+ Py_INCREF(&p_crash_data_type);
+ printf("HERE4\n");
+ PyModule_AddObject(m, "crash_data", (PyObject *)&p_crash_data_type);
+
+ printf("HERE5\n");
+}
diff -x '*.po' -d -urpN abrt.7/src/libpy/__init__.py abrt.8/src/libpy/__init__.py
--- abrt.7/src/libpy/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ abrt.8/src/libpy/__init__.py 2010-12-10 15:54:21.905603608 +0100
@@ -0,0 +1 @@
+from _pyreport import *
diff -x '*.po' -d -urpN abrt.7/src/libpy/Makefile.am abrt.8/src/libpy/Makefile.am
--- abrt.7/src/libpy/Makefile.am 1970-01-01 01:00:00.000000000 +0100
+++ abrt.8/src/libpy/Makefile.am 2010-12-14 11:55:52.531166433 +0100
@@ -0,0 +1,26 @@
+pyreportexecdir = $(pyexecdir)/report
+
+pyreportexec_PYTHON = __init__.py
+
+pyreportexec_LTLIBRARIES = _pyreport.la
+
+_pyreport_la_SOURCES = \
+ crash_dump.c
+_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) \
+ -I$(PYTHON_PREFIX)/include/python$(PYTHON_VERSION) \
+ -D_GNU_SOURCE \
+ -Wall -Werror
+_pyreport_la_LDFLAGS = \
+ -module \
+ -avoid-version \
+ -export-symbols-regex init_pyreport
+_pyreport_la_LIBADD = \
+ ../lib/libreport.la
diff -x '*.po' -d -urpN abrt.7/src/Makefile.am abrt.8/src/Makefile.am
--- abrt.7/src/Makefile.am 2010-12-08 15:10:52.000000000 +0100
+++ abrt.8/src/Makefile.am 2010-12-12 05:36:01.697681185 +0100
@@ -1 +1 @@
-SUBDIRS = include lib hooks btparser daemon applet gui cli plugins
+SUBDIRS = include lib libpy hooks btparser daemon applet gui cli plugins
13 years, 4 months
[PATCH 1/3] removal of C++isms from libabrt, part 1
by Denys Vlasenko
This patch converts libabrt usage of C++ map<string, string>
to a glib-based container, GHashTable.
It is typedef-ed to map_string_h (we can't typedef it to
map_string_t, since other parts of ABRT (daemon, cli) still use
that name for C++ container.
Also, exceptions are removed everywhere.
Patch compiles, not run tested yet.
--
vda
diff -x '*.po' -d -urpN abrt.7/doc/abrt-plugin/abrt-reporter-hello-world.cpp abrt.8/doc/abrt-plugin/abrt-reporter-hello-world.cpp
--- abrt.7/doc/abrt-plugin/abrt-reporter-hello-world.cpp 2010-11-10 00:12:48.000000000 +0100
+++ abrt.8/doc/abrt-plugin/abrt-reporter-hello-world.cpp 2010-12-07 15:57:20.119343954 +0100
@@ -18,7 +18,6 @@
*/
#include <abrt/abrtlib.h>
-#include <abrt/abrt_exception.h>
#include "abrt-reporter-hello-world.h"
std::string CHelloWorld::Report(const map_crash_data_t& pCrashData,
diff -x '*.po' -d -urpN abrt.7/src/cli/CLI.cpp abrt.8/src/cli/CLI.cpp
--- abrt.7/src/cli/CLI.cpp 2010-12-06 16:36:07.889631611 +0100
+++ abrt.8/src/cli/CLI.cpp 2010-12-07 15:55:33.351344068 +0100
@@ -19,7 +19,6 @@
# include <locale.h>
#endif
#include <getopt.h>
-#include "abrt_exception.h"
#include "abrtlib.h"
#include "abrt_dbus.h"
#include "dbus_common.h"
diff -x '*.po' -d -urpN abrt.7/src/cli/report.cpp abrt.8/src/cli/report.cpp
--- abrt.7/src/cli/report.cpp 2010-12-07 06:36:05.940541011 +0100
+++ abrt.8/src/cli/report.cpp 2010-12-07 14:45:36.171593988 +0100
@@ -521,26 +521,35 @@ static GHashTable *get_reporter_plugin_s
if (homedir)
{
GHashTableIter iter;
- gpointer key, value;
-
+ char *key;
+ map_string_t *value;
g_hash_table_iter_init(&iter, settings);
- while (g_hash_table_iter_next(&iter, &key, &value))
+ while (g_hash_table_iter_next(&iter, (void**)&key, (void**)&value))
{
- map_string_t single_plugin_settings;
-
- char *path = xasprintf("%s/.abrt/%s.conf", homedir, (char *)key);
-
- /* Load plugin config in the home dir. Do not skip lines with empty value (but containing a "key="),
- because user may want to override password from /etc/abrt/plugins/*.conf, but he prefers to
- enter it every time he reports. */
- bool success = LoadPluginSettings(path, single_plugin_settings, false);
+ /* Load plugin config in the home dir. Do not skip lines
+ * with empty value (but containing a "key="),
+ * because user may want to override password
+ * from /etc/abrt/plugins/*.conf, but he prefers to
+ * enter it every time he reports. */
+ map_string_h *single_plugin_settings = new_map_string();
+ char *path = xasprintf("%s/.abrt/%s.conf", homedir, key);
+ bool success = load_conf_file(path, single_plugin_settings, /*skip key w/o values:*/ false);
free(path);
if (!success)
+ {
+ free_map_string(single_plugin_settings);
continue;
- // Merge user's plugin settings into already loaded settings.
- map_string_t::const_iterator valit, valitend = single_plugin_settings.end();
- for (valit = single_plugin_settings.begin(); valit != valitend; ++valit)
- (*(map_string_t*)value)[valit->first] = valit->second;
+ }
+
+ /* Merge user's plugin settings into already loaded settings */
+ GHashTableIter iter2;
+ char *key2;
+ char *value2;
+ g_hash_table_iter_init(&iter2, single_plugin_settings);
+ while (g_hash_table_iter_next(&iter2, (void**)&key2, (void**)&value2))
+ (*value)[key2] = xstrdup(value2);
+
+ free_map_string(single_plugin_settings);
}
}
return settings;
diff -x '*.po' -d -urpN abrt.7/src/daemon/CommLayerServerDBus.cpp abrt.8/src/daemon/CommLayerServerDBus.cpp
--- abrt.7/src/daemon/CommLayerServerDBus.cpp 2010-12-06 16:36:07.884632170 +0100
+++ abrt.8/src/daemon/CommLayerServerDBus.cpp 2010-12-07 15:55:38.471344557 +0100
@@ -19,7 +19,6 @@
#include <dbus/dbus.h>
#include "abrtlib.h"
#include "abrt_dbus.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
#include "dbus_common.h"
#include "MiddleWare.h"
@@ -275,20 +274,7 @@ static int handle_Report(DBusMessage* ca
}
unix_uid = get_remote_uid(call);
- try
- {
- argout1 = Report(crash_data, events, user_conf_data, unix_uid);
- }
- catch (CABRTException &e)
- {
- dbus_message_unref(reply);
- reply = dbus_message_new_error(call, DBUS_ERROR_FAILED, e.what());
- if (!reply)
- die_out_of_memory();
- send_flush_and_unref(reply);
- r = 0;
- goto ret;
- }
+ argout1 = Report(crash_data, events, user_conf_data, unix_uid);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
@@ -353,12 +339,13 @@ static int handle_GetPluginSettings(DBus
//long unix_uid = get_remote_uid(call);
//VERB1 log("got %s('%s') call from uid %ld", "GetPluginSettings", PluginName, unix_uid);
- map_plugin_settings_t plugin_settings;
- GetPluginSettings(PluginName, plugin_settings);
+ map_string_h *plugin_settings = GetPluginSettings(PluginName);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
- store_val(&out_iter, plugin_settings);
+ store_map_string(&out_iter, plugin_settings);
+
+ free_map_string(plugin_settings);
send_flush_and_unref(reply);
return 0;
diff -x '*.po' -d -urpN abrt.7/src/daemon/Daemon.cpp abrt.8/src/daemon/Daemon.cpp
--- abrt.7/src/daemon/Daemon.cpp 2010-12-06 16:35:38.605643977 +0100
+++ abrt.8/src/daemon/Daemon.cpp 2010-12-07 15:55:41.221593894 +0100
@@ -27,7 +27,6 @@
#include <sys/ioctl.h> /* ioctl(FIONREAD) */
#include <glib.h>
#include "abrtlib.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
#include "Settings.h"
#include "CommLayerServerDBus.h"
@@ -543,63 +542,49 @@ static gboolean handle_inotify_cb(GIOCha
char *fullname = NULL;
crash_data_t *crash_data = NULL;
- try
+ fullname = concat_path_file(DEBUG_DUMPS_DIR, name);
+ mw_result_t res = LoadDebugDump(fullname, &crash_data);
+ switch (res)
{
- fullname = concat_path_file(DEBUG_DUMPS_DIR, name);
- mw_result_t res = LoadDebugDump(fullname, &crash_data);
- switch (res)
- {
- case MW_OK:
- log("New crash %s, processing", fullname);
- /* Fall through */
+ case MW_OK:
+ log("New crash %s, processing", fullname);
+ /* Fall through */
- case MW_OCCURRED: /* dup */
+ case MW_OCCURRED: /* dup */
+ {
+ if (res != MW_OK)
{
- if (res != MW_OK)
- {
- const char *first = get_crash_item_content_or_NULL(crash_data, CD_DUMPDIR);
- log("Deleting crash %s (dup of %s), sending dbus signal",
- strrchr(fullname, '/') + 1,
- strrchr(first, '/') + 1);
- delete_crash_dump_dir(fullname);
- }
+ const char *first = get_crash_item_content_or_NULL(crash_data, CD_DUMPDIR);
+ log("Deleting crash %s (dup of %s), sending dbus signal",
+ strrchr(fullname, '/') + 1,
+ strrchr(first, '/') + 1);
+ delete_crash_dump_dir(fullname);
+ }
- const char *uid_str = get_crash_item_content_or_NULL(crash_data, FILENAME_UID);
- const char *inform_all = get_crash_item_content_or_NULL(crash_data, FILENAME_INFORMALL);
+ const char *uid_str = get_crash_item_content_or_NULL(crash_data, FILENAME_UID);
+ const char *inform_all = get_crash_item_content_or_NULL(crash_data, FILENAME_INFORMALL);
- if (inform_all && string_to_bool(inform_all))
- uid_str = NULL;
- char *crash_id = xasprintf("%s:%s",
- get_crash_item_content_or_NULL(crash_data, FILENAME_UID),
- get_crash_item_content_or_NULL(crash_data, FILENAME_UUID)
- );
- /* Send dbus signal */
- g_pCommLayer->Crash(get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE),
- crash_id, //TODO: stop passing this param, it is unused
- fullname,
- uid_str
- );
- free(crash_id);
- break;
- }
- case MW_CORRUPTED:
- case MW_GPG_ERROR:
- default:
- log("Corrupted or bad crash %s (res:%d), deleting", fullname, (int)res);
- delete_crash_dump_dir(fullname);
- break;
+ if (inform_all && string_to_bool(inform_all))
+ uid_str = NULL;
+ char *crash_id = xasprintf("%s:%s",
+ get_crash_item_content_or_NULL(crash_data, FILENAME_UID),
+ get_crash_item_content_or_NULL(crash_data, FILENAME_UUID)
+ );
+ /* Send dbus signal */
+ g_pCommLayer->Crash(get_crash_item_content_or_NULL(crash_data, FILENAME_PACKAGE),
+ crash_id, //TODO: stop passing this param, it is unused
+ fullname,
+ uid_str
+ );
+ free(crash_id);
+ break;
}
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
- }
- catch (...)
- {
- free(fullname);
- free(buf);
- free_crash_data(crash_data);
- throw;
+ case MW_CORRUPTED:
+ case MW_GPG_ERROR:
+ default:
+ log("Corrupted or bad crash %s (res:%d), deleting", fullname, (int)res);
+ delete_crash_dump_dir(fullname);
+ break;
}
free(fullname);
free_crash_data(crash_data);
@@ -899,19 +884,8 @@ int main(int argc, char** argv)
s_signal_pipe_write = s_signal_pipe[1];
/* Enter the event loop */
- try
- {
- log("Init complete, entering main loop");
- run_main_loop(pMainloop);
- }
- catch (CABRTException& e)
- {
- error_msg("Error: %s", e.what());
- }
- catch (std::exception& e)
- {
- error_msg("Error: %s", e.what());
- }
+ log("Init complete, entering main loop");
+ run_main_loop(pMainloop);
cleanup:
/* Error or INT/TERM. Clean up, in reverse order.
diff -x '*.po' -d -urpN abrt.7/src/daemon/MiddleWare.cpp abrt.8/src/daemon/MiddleWare.cpp
--- abrt.7/src/daemon/MiddleWare.cpp 2010-12-06 16:35:38.623646076 +0100
+++ abrt.8/src/daemon/MiddleWare.cpp 2010-12-07 15:59:34.409344061 +0100
@@ -21,7 +21,6 @@
#include "abrtlib.h"
#include "Daemon.h"
#include "Settings.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
#include "CommLayerServer.h"
#include "MiddleWare.h"
@@ -127,6 +126,8 @@ static mw_result_t CreateCrashReport(con
if (!dd)
return MW_NOENT_ERROR;
+ struct run_event_state *run_state;
+ int res;
mw_result_t r = MW_OK;
if (caller_uid != 0) /* not called by root */
@@ -151,37 +152,24 @@ static mw_result_t CreateCrashReport(con
}
dd_close(dd);
- try
+ run_state = new_run_event_state();
+ run_state->logging_callback = do_log_and_update_client;
+ res = run_event(run_state, dump_dir_name, force ? "reanalyze" : "analyze");
+ free_run_event_state(run_state);
+ if (res != 0 && res != -1) /* -1 is "nothing was done", here it is ok */
{
- struct run_event_state *run_state = new_run_event_state();
- run_state->logging_callback = do_log_and_update_client;
- int res = run_event(run_state, dump_dir_name, force ? "reanalyze" : "analyze");
- free_run_event_state(run_state);
- if (res != 0 && res != -1) /* -1 is "nothing was done", here it is ok */
- {
- r = MW_PLUGIN_ERROR;
- goto ret;
- }
-
- /* Do a load_crash_data_from_crash_dump_dir from (possibly updated)
- * crash dump dir
- */
- *crash_data = DebugDumpToCrashReport(dump_dir_name);
- if (!*crash_data)
- {
- error_msg("Error loading crash data");
- r = MW_ERROR;
- goto ret;
- }
+ r = MW_PLUGIN_ERROR;
+ goto ret;
}
- catch (CABRTException& e)
+
+ /* Do a load_crash_data_from_crash_dump_dir from (possibly updated)
+ * crash dump dir
+ */
+ *crash_data = DebugDumpToCrashReport(dump_dir_name);
+ if (!*crash_data)
{
- r = MW_CORRUPTED;
- error_msg("%s", e.what());
- if (e.type() == EXCEP_PLUGIN)
- {
- r = MW_PLUGIN_ERROR;
- }
+ error_msg("Error loading crash data");
+ r = MW_ERROR;
}
ret:
@@ -199,14 +187,7 @@ void RunAction(const char *pActionDir,
/* GetAction() already complained */
return;
}
- try
- {
- action->Run(pActionDir, pPluginArgs, /*force:*/ 0);
- }
- catch (CABRTException& e)
- {
- error_msg("Execution of '%s' was not successful: %s", pPluginName, e.what());
- }
+ action->Run(pActionDir, pPluginArgs, /*force:*/ 0);
}
struct logging_state {
@@ -231,12 +212,14 @@ report_status_t Report(crash_data_t *cli
const map_map_string_t& settings,
long caller_uid)
{
- // Get ID fields
- const char *UID = get_crash_item_content_or_NULL(client_report, FILENAME_UID);
+ report_status_t ret;
const char *dump_dir_name = get_crash_item_content_or_NULL(client_report, CD_DUMPDIR);
- if (!UID || !dump_dir_name)
+ if (!dump_dir_name)
{
- throw CABRTException(EXCEP_ERROR, "Report(): UID or DUMPDIR is missing in client's report data");
+ update_client("Reporting error: %s", "DUMPDIR is missing in client's report data");
+ ret[""].push_back("0"); // REPORT_STATUS_IDX_FLAG
+ ret[""].push_back("DUMPDIR is missing in client's report data"); // REPORT_STATUS_IDX_MSG
+ return ret;
}
// Retrieve corresponding stored record
@@ -248,14 +231,18 @@ report_status_t Report(crash_data_t *cli
// Is it allowed for this user to report?
if (caller_uid != 0 // not called by root
- && strcmp(to_string(caller_uid).c_str(), UID) != 0
+ && strcmp(to_string(caller_uid).c_str(), get_crash_item_content_or_die(stored_report, FILENAME_UID)) != 0
) {
const char *inform_all = get_crash_item_content_or_NULL(stored_report, FILENAME_INFORMALL);
if (!inform_all || !string_to_bool(inform_all))
{
free_crash_data(stored_report);
- throw CABRTException(EXCEP_ERROR, "Report(): user with uid %ld can't report crash %s",
- caller_uid, dump_dir_name);
+ char *errmsg = xasprintf("user with uid %ld can't report crash %s", caller_uid, dump_dir_name);
+ update_client("Reporting error: %s", errmsg);
+ ret[""].push_back("0"); // REPORT_STATUS_IDX_FLAG
+ ret[""].push_back(errmsg); // REPORT_STATUS_IDX_MSG
+ free(errmsg);
+ return ret;
}
}
@@ -335,7 +322,6 @@ report_status_t Report(crash_data_t *cli
// Run events
bool at_least_one_reporter_succeeded = false;
- report_status_t ret;
std::string message;
struct logging_state l_state;
struct run_event_state *run_state = new_run_event_state();
@@ -620,68 +606,61 @@ vector_of_crash_data_t *GetCrashInfos(lo
DIR *dir = opendir(DEBUG_DUMPS_DIR);
if (dir != NULL)
{
- try
+ struct dirent *dent;
+ while ((dent = readdir(dir)) != NULL)
{
- struct dirent *dent;
- while ((dent = readdir(dir)) != NULL)
- {
- if (dot_or_dotdot(dent->d_name))
- continue; /* skip "." and ".." */
+ if (dot_or_dotdot(dent->d_name))
+ continue; /* skip "." and ".." */
- char *dump_dir_name = concat_path_file(DEBUG_DUMPS_DIR, dent->d_name);
+ char *dump_dir_name = concat_path_file(DEBUG_DUMPS_DIR, dent->d_name);
- struct stat statbuf;
- if (stat(dump_dir_name, &statbuf) != 0
- || !S_ISDIR(statbuf.st_mode)
- ) {
- goto next; /* not a dir, skip */
- }
+ struct stat statbuf;
+ if (stat(dump_dir_name, &statbuf) != 0
+ || !S_ISDIR(statbuf.st_mode)
+ ) {
+ goto next; /* not a dir, skip */
+ }
- /* Skip directories which are not for this uid */
- if (caller_uid != 0) /* not called by root? */
- {
- char *uid;
- char caller_uid_str[sizeof(long) * 3 + 2];
+ /* Skip directories which are not for this uid */
+ if (caller_uid != 0) /* not called by root? */
+ {
+ char *uid;
+ char caller_uid_str[sizeof(long) * 3 + 2];
- struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
- if (!dd)
- goto next;
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ goto next;
- sprintf(caller_uid_str, "%ld", caller_uid);
- uid = dd_load_text(dd, FILENAME_UID);
- if (strcmp(uid, caller_uid_str) != 0)
+ sprintf(caller_uid_str, "%ld", caller_uid);
+ uid = dd_load_text(dd, FILENAME_UID);
+ if (strcmp(uid, caller_uid_str) != 0)
+ {
+ char *inform_all = dd_load_text_ext(dd, FILENAME_INFORMALL, DD_FAIL_QUIETLY);
+ bool for_all = string_to_bool(inform_all);
+ free(inform_all);
+ if (!for_all)
{
- char *inform_all = dd_load_text_ext(dd, FILENAME_INFORMALL, DD_FAIL_QUIETLY);
- bool for_all = string_to_bool(inform_all);
- free(inform_all);
- if (!for_all)
- {
- dd_close(dd);
- goto next;
- }
+ dd_close(dd);
+ goto next;
}
- dd_close(dd);
}
+ dd_close(dd);
+ }
+ {
+ crash_data_t *crash_data = FillCrashInfo(dump_dir_name);
+ if (!crash_data)
{
- crash_data_t *crash_data = FillCrashInfo(dump_dir_name);
- if (!crash_data)
- {
- error_msg("Dump directory %s doesn't exist or misses crucial files, deleting", dump_dir_name);
- delete_crash_dump_dir(dump_dir_name);
- }
- else
- {
- g_ptr_array_add(retval, crash_data);
- }
+ error_msg("Dump directory %s doesn't exist or misses crucial files, deleting", dump_dir_name);
+ delete_crash_dump_dir(dump_dir_name);
+ }
+ else
+ {
+ g_ptr_array_add(retval, crash_data);
}
- next:
- free(dump_dir_name);
}
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
+ next:
+ free(dump_dir_name);
}
closedir(dir);
}
@@ -736,18 +715,10 @@ static void* create_report(void* arg)
/* Client name is per-thread, need to set it */
set_client_name(thread_data->peer);
- try
- {
- log("Creating report...");
- crash_data_t *crash_data = NULL;
- CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, &crash_data);
- g_pCommLayer->JobDone(thread_data->peer);
- }
- catch (CABRTException& e)
- {
- error_msg("%s", e.what());
- }
- catch (...) {}
+ log("Creating report...");
+ crash_data_t *crash_data = NULL;
+ CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, &crash_data);
+ g_pCommLayer->JobDone(thread_data->peer);
set_client_name(NULL);
/* free strduped strings */
@@ -874,10 +845,12 @@ void GetPluginsInfo(map_map_string_t &ma
closedir(dir);
}
-void GetPluginSettings(const char *plugin_name, map_plugin_settings_t &plugin_settings)
+map_string_h *GetPluginSettings(const char *plugin_name)
{
char *conf_file = xasprintf(PLUGINS_CONF_DIR"/%s.conf", plugin_name);
- if (LoadPluginSettings(conf_file, plugin_settings, /*skip w/o value:*/ false))
+ map_string_h *settings = new_map_string();
+ if (load_conf_file(conf_file, settings, /*skip w/o value:*/ false))
VERB3 log("Loaded %s.conf", plugin_name);
free(conf_file);
+ return settings;
}
diff -x '*.po' -d -urpN abrt.7/src/daemon/MiddleWare.h abrt.8/src/daemon/MiddleWare.h
--- abrt.7/src/daemon/MiddleWare.h 2010-12-03 12:52:34.624912221 +0100
+++ abrt.8/src/daemon/MiddleWare.h 2010-12-07 11:48:43.756343386 +0100
@@ -91,6 +91,6 @@ void CreateReport(const char* dump_dir_n
int DeleteDebugDump(const char *dump_dir_name, long caller_uid);
void GetPluginsInfo(map_map_string_t &map_of_plugin_info);
-void GetPluginSettings(const char *plugin_name, map_plugin_settings_t &plugin_settings);
+map_string_h *GetPluginSettings(const char *plugin_name);
#endif /*MIDDLEWARE_H_*/
diff -x '*.po' -d -urpN abrt.7/src/daemon/PluginManager.cpp abrt.8/src/daemon/PluginManager.cpp
--- abrt.7/src/daemon/PluginManager.cpp 2010-12-07 06:35:18.871542187 +0100
+++ abrt.8/src/daemon/PluginManager.cpp 2010-12-07 15:55:44.054593964 +0100
@@ -20,7 +20,6 @@
*/
#include <dlfcn.h>
#include "abrtlib.h"
-#include "abrt_exception.h"
#include "PluginManager.h"
using namespace std;
@@ -132,18 +131,14 @@ CPlugin* CPluginManager::LoadPlugin(cons
/* Kerneloops{,Scanner,Reporter} share the same .conf file */
conf_name = "Kerneloops";
}
- map_plugin_settings_t pluginSettings;
string conf_fullname = ssprintf(PLUGINS_CONF_DIR"/%s."PLUGINS_CONF_EXTENSION, conf_name);
- LoadPluginSettings(conf_fullname.c_str(), pluginSettings);
- m_map_plugin_settings[pName] = pluginSettings;
- /* If settings are empty, most likely .conf file does not exist.
- * Don't mislead the user: */
- VERB3 if (!pluginSettings.empty()) log("Loaded %s.conf", conf_name);
+ map_string_h *pluginSettings = new_map_string();
+ if (load_conf_file(conf_fullname.c_str(), pluginSettings, /*skip key w/o values:*/ true))
+ VERB3 log("Loaded %s.conf", conf_name);
if (enabled_only)
{
- map_plugin_settings_t::iterator it = pluginSettings.find("Enabled");
- if (it == pluginSettings.end() || !string_to_bool(it->second.c_str()))
+ if (!string_to_bool(get_map_string_item_or_empty(pluginSettings, "Enabled")))
{
plugin_info["Enabled"] = "no";
string empty;
@@ -163,6 +158,7 @@ CPlugin* CPluginManager::LoadPlugin(cons
if (!handle)
{
error_msg("Can't load '%s': %s", libPath.c_str(), dlerror());
+ free_map_string(pluginSettings);
return NULL; /* error */
}
CLoadedModule *module = new CLoadedModule(handle, pName);
@@ -175,27 +171,17 @@ CPlugin* CPluginManager::LoadPlugin(cons
module->GetMagicNumber(), PLUGINS_MAGIC_NUMBER,
module->GetType(), MAX_PLUGIN_TYPE);
delete module;
+ free_map_string(pluginSettings);
return NULL; /* error */
}
VERB3 log("Loaded plugin %s v.%s", pName, module->GetVersion());
CPlugin *plugin = NULL;
- try
- {
- plugin = module->PluginNew();
- plugin->Init();
- plugin->SetSettings(pluginSettings);
- }
- catch (CABRTException& e)
- {
- error_msg("Can't initialize plugin %s: %s",
- pName,
- e.what()
- );
- delete plugin;
- delete module;
- return NULL; /* error */
- }
+ plugin = module->PluginNew();
+ plugin->Init();
+///vda:todo
+// plugin->SetSettings(pluginSettings);
+ free_map_string(pluginSettings);
plugin_info["Enabled"] = "yes";
plugin_info["Type"] = plugin_type_str[module->GetType()];
@@ -252,7 +238,7 @@ plugin_type_t CPluginManager::GetPluginT
CPlugin *plugin = LoadPlugin(pName);
if (!plugin)
{
- throw CABRTException(EXCEP_PLUGIN, "Plugin '%s' is not registered", pName);
+ return INVALID_PLUGIN_TYPE;
}
map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
return it_module->second->GetType();
diff -x '*.po' -d -urpN abrt.7/src/daemon/PluginManager.h abrt.8/src/daemon/PluginManager.h
--- abrt.7/src/daemon/PluginManager.h 2010-11-23 15:49:33.000000000 +0100
+++ abrt.8/src/daemon/PluginManager.h 2010-12-07 14:34:54.564343909 +0100
@@ -48,10 +48,6 @@ class CPluginManager
* Registered plugins. A key is a plugin name.
*/
map_plugin_t m_mapPlugins;
- /**
- * List of all possible plugins (loaded or not), with some attributes.
- */
- map_map_string_t m_map_plugin_settings;
public:
/**
diff -x '*.po' -d -urpN abrt.7/src/hooks/dumpoops.cpp abrt.8/src/hooks/dumpoops.cpp
--- abrt.7/src/hooks/dumpoops.cpp 2010-11-10 00:12:48.000000000 +0100
+++ abrt.8/src/hooks/dumpoops.cpp 2010-12-07 15:55:23.014344323 +0100
@@ -22,7 +22,6 @@
*/
#include "abrtlib.h"
-#include "abrt_exception.h"
#include "KerneloopsScanner.h"
#include <dlfcn.h>
#include <glib.h>
diff -x '*.po' -d -urpN abrt.7/src/include/abrt_exception.h abrt.8/src/include/abrt_exception.h
--- abrt.7/src/include/abrt_exception.h 2010-11-10 00:12:48.000000000 +0100
+++ abrt.8/src/include/abrt_exception.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,57 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 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.
-*/
-#ifndef ABRTEXCEPTION_H_
-#define ABRTEXCEPTION_H_
-
-#include "abrtlib.h"
-
-typedef enum {
- EXCEP_UNKNOW,
- EXCEP_DD_OPEN,
- EXCEP_DD_LOAD,
- EXCEP_DD_SAVE,
- EXCEP_DD_DELETE,
- EXCEP_DL,
- EXCEP_PLUGIN,
- EXCEP_ERROR,
-} abrt_exception_t;
-
-/* std::exception is a class with virtual members.
- * deriving from it makes our ctor/dtor much more heavy,
- * and those are inlined in every throw and catch site!
- */
-class CABRTException /*: public std::exception*/
-{
- private:
- abrt_exception_t m_type;
- char *m_what;
-
- /* Not defined. You can't use it */
- CABRTException& operator= (const CABRTException&);
-
- public:
- ~CABRTException() { free(m_what); }
- CABRTException(abrt_exception_t type, const char* fmt, ...);
- CABRTException(const CABRTException& rhs);
-
- abrt_exception_t type() { return m_type; }
- const char* what() const { return m_what; }
-};
-
-#endif
diff -x '*.po' -d -urpN abrt.7/src/include/abrtlib.h abrt.8/src/include/abrtlib.h
--- abrt.7/src/include/abrtlib.h 2010-12-07 06:34:23.407290487 +0100
+++ abrt.8/src/include/abrtlib.h 2010-12-07 13:09:13.052344147 +0100
@@ -224,6 +224,20 @@ char* make_description_mailx(crash_data_
void parse_release(const char *pRelease, char **product, char **version);
+/**
+ * Loads settings and stores it in second parameter. On success it
+ * returns true, otherwise returns false.
+ *
+ * @param path A path of config file.
+ * Config file consists of "key=value" lines.
+ * @param settings A read plugin's settings.
+ * @param skipKeysWithoutValue
+ * If true, lines in format "key=" (without value) are skipped.
+ * Otherwise empty value "" is inserted into pSettings.
+ * @return if it success it returns true, otherwise it returns false.
+ */
+bool load_conf_file(const char *pPath, map_string_h *settings, bool skipKeysWithoutValue);
+
#ifdef __cplusplus
}
#endif
@@ -241,22 +255,6 @@ std::string to_string(T x)
return unsigned_to_string(x);
}
-/**
- * Loads settings and stores it in second parameter. On success it
- * returns true, otherwise returns false.
- *
- * @param path A path of config file.
- * Config file consists of "key=value" lines.
- * @param settings A readed plugin's settings.
- * @param skipKeysWithoutValue
- * If true, lines in format "key=" (without value) are skipped.
- * Otherwise empty value "" is inserted into pSettings.
- * @return if it success it returns true, otherwise it returns false.
- */
-extern bool LoadPluginSettings(const char *pPath,
- map_plugin_settings_t& pSettings,
- bool skipKeysWithoutValue = true);
-
// TODO: npajkovs: full rewrite ssprintf -> xasprintf
static inline std::string ssprintf(const char *format, ...)
{
diff -x '*.po' -d -urpN abrt.7/src/include/abrt_types.h abrt.8/src/include/abrt_types.h
--- abrt.7/src/include/abrt_types.h 2010-11-10 00:12:48.000000000 +0100
+++ abrt.8/src/include/abrt_types.h 2010-12-07 14:48:57.165594456 +0100
@@ -19,6 +19,29 @@
#ifndef ABRT_TYPES_H_
#define ABRT_TYPES_H_
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef GHashTable map_string_h;
+
+map_string_h *new_map_string(void);
+void free_map_string(map_string_h *ms);
+const char *get_map_string_item_or_empty(map_string_h *ms, const char *key);
+static inline
+const char *get_map_string_item_or_NULL(map_string_h *ms, const char *key)
+{
+ return (const char*)g_hash_table_lookup(ms, key);
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
#ifdef __cplusplus
#include <map>
diff -x '*.po' -d -urpN abrt.7/src/include/Makefile.am abrt.8/src/include/Makefile.am
--- abrt.7/src/include/Makefile.am 2010-12-01 17:39:43.000000000 +0100
+++ abrt.8/src/include/Makefile.am 2010-12-07 15:55:30.261344172 +0100
@@ -3,7 +3,6 @@ HEADER_FILES = \
dump_dir.h \
run_event.h \
\
- abrt_exception.h \
abrtlib.h \
abrt_types.h \
comm_layer_inner.h \
diff -x '*.po' -d -urpN abrt.7/src/include/plugin.h abrt.8/src/include/plugin.h
--- abrt.7/src/include/plugin.h 2010-11-26 17:51:36.000000000 +0100
+++ abrt.8/src/include/plugin.h 2010-12-07 15:49:17.938344441 +0100
@@ -76,6 +76,7 @@ typedef enum {
REPORTER, /**< A reporter plugin*/
DATABASE, /**< A database plugin*/
MAX_PLUGIN_TYPE = DATABASE,
+ INVALID_PLUGIN_TYPE
} plugin_type_t;
/**
diff -x '*.po' -d -urpN abrt.7/src/lib/abrt_dbus.c abrt.8/src/lib/abrt_dbus.c
--- abrt.7/src/lib/abrt_dbus.c 2010-12-03 18:52:37.978268460 +0100
+++ abrt.8/src/lib/abrt_dbus.c 2010-12-07 14:57:31.622593808 +0100
@@ -156,6 +156,34 @@ void store_string(DBusMessageIter* iter,
free((char*)sanitized);
}
+/* Helper for storing map_string */
+void store_map_string(DBusMessageIter* dbus_iter, map_string_h *val)
+{
+ DBusMessageIter sub_iter;
+ /* map_string is a map. map in dbus is an array of two element structs "({...})":
+ * "s" (string) for key and "s" for value (in this case, also string) */
+ if (!dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY, "{ss}", &sub_iter))
+ die_out_of_memory();
+
+ GHashTableIter iter;
+ char *name;
+ char *value;
+ g_hash_table_iter_init(&iter, val);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
+ {
+ DBusMessageIter sub_sub_iter;
+ if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter))
+ die_out_of_memory();
+ store_string(&sub_sub_iter, name);
+ store_string(&sub_sub_iter, value);
+ if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter))
+ die_out_of_memory();
+ }
+
+ if (!dbus_message_iter_close_container(dbus_iter, &sub_iter))
+ die_out_of_memory();
+}
+
/* Helpers for storing crash_data */
static void store_crash_item(DBusMessageIter* iter, struct crash_item *val)
diff -x '*.po' -d -urpN abrt.7/src/lib/abrt_dbus.h abrt.8/src/lib/abrt_dbus.h
--- abrt.7/src/lib/abrt_dbus.h 2010-12-03 16:01:43.871804759 +0100
+++ abrt.8/src/lib/abrt_dbus.h 2010-12-07 14:50:59.646594188 +0100
@@ -85,6 +85,7 @@ void store_uint64(DBusMessageIter* iter,
void store_string(DBusMessageIter* iter, const char* val);
void store_crash_data(DBusMessageIter* iter, crash_data_t *val);
void store_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t *val);
+void store_map_string(DBusMessageIter* iter, map_string_h *val);
/*
* Helpers for parsing DBus messages
diff -x '*.po' -d -urpN abrt.7/src/lib/ABRTException.cpp abrt.8/src/lib/ABRTException.cpp
--- abrt.7/src/lib/ABRTException.cpp 2010-11-10 00:12:48.000000000 +0100
+++ abrt.8/src/lib/ABRTException.cpp 1970-01-01 01:00:00.000000000 +0100
@@ -1,33 +0,0 @@
-/*
- Copyright (C) 2010 ABRT team
- Copyright (C) 2010 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 "abrt_exception.h"
-
-CABRTException::CABRTException(abrt_exception_t type, const char* fmt, ...)
-{
- m_type = type;
- va_list ap;
- va_start(ap, fmt);
- m_what = xvasprintf(fmt, ap);
- va_end(ap);
-}
-
-CABRTException::CABRTException(const CABRTException& rhs):
- m_type(rhs.m_type),
- m_what(xstrdup(rhs.m_what))
-{}
diff -x '*.po' -d -urpN abrt.7/src/lib/abrt_types.c abrt.8/src/lib/abrt_types.c
--- abrt.7/src/lib/abrt_types.c 1970-01-01 01:00:00.000000000 +0100
+++ abrt.8/src/lib/abrt_types.c 2010-12-07 12:05:38.741343262 +0100
@@ -0,0 +1,37 @@
+/*
+ Copyright (C) 2010 ABRT Team
+ Copyright (C) 2010 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 "abrtlib.h"
+
+map_string_h *new_map_string(void)
+{
+ return g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
+}
+
+void free_map_string(map_string_h *ms)
+{
+ if (ms)
+ g_hash_table_destroy(ms);
+}
+
+const char *get_map_string_item_or_empty(map_string_h *ms, const char *key)
+{
+ const char *v = (const char*)g_hash_table_lookup(ms, key);
+ if (!v) v = "";
+ return v;
+}
diff -x '*.po' -d -urpN abrt.7/src/lib/abrt_xmlrpc.cpp abrt.8/src/lib/abrt_xmlrpc.cpp
--- abrt.7/src/lib/abrt_xmlrpc.cpp 2010-11-10 00:12:48.000000000 +0100
+++ abrt.8/src/lib/abrt_xmlrpc.cpp 2010-12-07 15:55:26.695344100 +0100
@@ -18,15 +18,13 @@
*/
#include "abrtlib.h"
#include "abrt_xmlrpc.h"
-#include "abrt_exception.h"
void throw_xml_fault(xmlrpc_env *env)
{
std::string errmsg = ssprintf("XML-RPC Fault(%d): %s", env->fault_code, env->fault_string);
xmlrpc_env_clean(env); // this is needed ONLY if fault_occurred
xmlrpc_env_init(env); // just in case user catches ex and _continues_ to use env
- error_msg("%s", errmsg.c_str()); // show error in daemon log
- throw CABRTException(EXCEP_PLUGIN, errmsg.c_str());
+ error_msg_and_die("%s", errmsg.c_str()); // show error in daemon log
}
void throw_if_xml_fault_occurred(xmlrpc_env *env)
diff -x '*.po' -d -urpN abrt.7/src/lib/load_plugin_settings.cpp abrt.8/src/lib/load_plugin_settings.cpp
--- abrt.7/src/lib/load_plugin_settings.cpp 2010-12-07 06:34:23.408291379 +0100
+++ abrt.8/src/lib/load_plugin_settings.cpp 2010-12-07 16:33:23.247352237 +0100
@@ -18,8 +18,10 @@
*/
#include "abrtlib.h"
-bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings,
- bool skipKeysWithoutValue /*= true*/)
+/* Returns NULL if open failed.
+ * Returns empty hash if conf file is empty.
+ */
+bool load_conf_file(const char *pPath, map_string_h *settings, bool skipKeysWithoutValue)
{
FILE *fp = stdin;
if (strcmp(pPath, "-") != 0)
@@ -36,8 +38,13 @@ bool LoadPluginSettings(const char *pPat
bool is_value = false;
bool valid = false;
bool in_quote = false;
- std::string key;
- std::string value;
+ /* We are reusing line buffer to form temporary
+ * "key\0value\0..." in its beginning
+ */
+ char *key = line;
+ char *value = line;
+ char *cur = line;
+
for (ii = 0; line[ii] != '\0'; ii++)
{
if (line[ii] == '"')
@@ -48,7 +55,7 @@ bool LoadPluginSettings(const char *pPat
{
continue;
}
- if (line[ii] == '#' && !in_quote && key == "")
+ if (line[ii] == '#' && !in_quote && cur == line)
{
break;
}
@@ -56,39 +63,36 @@ bool LoadPluginSettings(const char *pPat
{
is_value = true;
valid = true;
+ *cur++ = '\0'; /* terminate key */
+ value = cur; /* remember where value starts */
continue;
}
- if (!is_value)
- {
- key += line[ii];
- }
- else
- {
- value += line[ii];
- }
+ *cur++ = line[ii]; /* store next key or value char */
}
+ *cur++ = '\0'; /* terminate value */
/* Skip broken or empty lines. */
if (!valid)
goto free_line;
/* Skip lines with empty key. */
- if (key.length() == 0)
+ if (key[0] == '\0')
goto free_line;
- if (skipKeysWithoutValue && value.length() == 0)
+ if (skipKeysWithoutValue && value[0] == '\0')
goto free_line;
/* Skip lines with unclosed quotes. */
if (in_quote)
goto free_line;
- pSettings[key] = value;
+ g_hash_table_replace(settings, xstrdup(key), xstrdup(value));
free_line:
free(line);
}
if (fp != stdin)
fclose(fp);
+
return true;
}
diff -x '*.po' -d -urpN abrt.7/src/lib/Makefile.am abrt.8/src/lib/Makefile.am
--- abrt.7/src/lib/Makefile.am 2010-12-07 06:02:45.418253696 +0100
+++ abrt.8/src/lib/Makefile.am 2010-12-07 15:57:09.288344481 +0100
@@ -40,7 +40,7 @@ libabrt_la_SOURCES = \
run_event.c \
crash_dump.cpp \
create_crash_dump_dir.cpp \
- ABRTException.cpp \
+ abrt_types.c \
hooklib.c hooklib.h \
parse_release.cpp \
parse_options.c parse_options.h
diff -x '*.po' -d -urpN abrt.7/src/plugins/abrt-action-bugzilla.cpp abrt.8/src/plugins/abrt-action-bugzilla.cpp
--- abrt.7/src/plugins/abrt-action-bugzilla.cpp 2010-12-07 06:34:23.409291226 +0100
+++ abrt.8/src/plugins/abrt-action-bugzilla.cpp 2010-12-07 15:55:57.606594146 +0100
@@ -19,7 +19,6 @@
#include "abrtlib.h"
#include "abrt_xmlrpc.h"
#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define XML_RPC_SUFFIX "/xmlrpc.cgi"
#define MAX_HOPS 5
@@ -612,15 +611,10 @@ int ctx::get_bug_info(struct bug_info* b
void ctx::login(const char* login, const char* passwd)
{
xmlrpc_value* result = call("User.login", "({s:s,s:s})", "login", login, "password", passwd);
-
if (!result)
- {
- char *errmsg = xasprintf("Can't login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/Bugzilla.conf. Server said: %s", env.fault_string);
- error_msg("%s", errmsg); // show error in daemon log
- CABRTException e(EXCEP_PLUGIN, errmsg);
- free(errmsg);
- throw e;
- }
+ error_msg_and_die("Can't login. Check Edit->Plugins->Bugzilla "
+ "and /etc/abrt/plugins/Bugzilla.conf. Server said: %s",
+ env.fault_string);
xmlrpc_DECREF(result);
}
@@ -638,13 +632,11 @@ void ctx::logout()
static void report_to_bugzilla(
const char *dump_dir_name,
- /*const*/ map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- {
- throw CABRTException(EXCEP_PLUGIN, _("Can't open '%s'"), dump_dir_name);
- }
+ xfunc_die(); /* dd_opendir already emitted error msg */
crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
dd_close(dd);
@@ -656,23 +648,23 @@ static void report_to_bugzilla(
bool ssl_verify;
env = getenv("Bugzilla_Login");
- login = env ? env : settings["Login"].c_str();
+ login = env ? env : get_map_string_item_or_empty(settings, "Login");
env = getenv("Bugzilla_Password");
- password = env ? env : settings["Password"].c_str();
+ password = env ? env : get_map_string_item_or_empty(settings, "Password");
if (!login[0] || !password[0])
{
VERB3 log("Empty login and password");
- throw CABRTException(EXCEP_PLUGIN, _("Empty login or password, please check %s"), PLUGINS_CONF_DIR"/Bugzilla.conf");
+ error_msg_and_die(_("Empty login or password, please check %s"), PLUGINS_CONF_DIR"/Bugzilla.conf");
}
env = getenv("Bugzilla_BugzillaURL");
- bugzilla_url = env ? env : settings["BugzillaURL"].c_str();
+ bugzilla_url = env ? env : get_map_string_item_or_empty(settings, "BugzillaURL");
if (!bugzilla_url[0])
bugzilla_url = "https://bugzilla.redhat.com";
bugzilla_xmlrpc = xasprintf("%s"XML_RPC_SUFFIX, bugzilla_url);
env = getenv("Bugzilla_SSLVerify");
- ssl_verify = string_to_bool(env ? env : settings["SSLVerify"].c_str());
+ ssl_verify = string_to_bool(env ? env : get_map_string_item_or_empty(settings, "SSLVerify"));
const char *component = get_crash_item_content_or_NULL(crash_data, FILENAME_COMPONENT);
const char *duphash = get_crash_item_content_or_NULL(crash_data, FILENAME_DUPHASH);
@@ -704,7 +696,7 @@ static void report_to_bugzilla(
if (!all_bugs)
{
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("Missing mandatory member 'bugs'"));
+ error_msg_and_die(_("Missing mandatory member 'bugs'"));
}
xmlrpc_int32 bug_id = -1;
@@ -723,7 +715,7 @@ static void report_to_bugzilla(
{
bug_info_destroy(&bz);
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ error_msg_and_die(_("get_bug_info() failed. Could not collect all mandatory information"));
}
if (strcmp(bz.bug_product, product) != 0)
@@ -740,7 +732,7 @@ static void report_to_bugzilla(
if (!all_bugs)
{
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("Missing mandatory member 'bugs'"));
+ error_msg_and_die(_("Missing mandatory member 'bugs'"));
}
all_bugs_size = bz_server.get_array_size(all_bugs);
@@ -756,7 +748,7 @@ static void report_to_bugzilla(
{
bug_info_destroy(&bz);
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ error_msg_and_die(_("get_bug_info() failed. Could not collect all mandatory information"));
}
}
else
@@ -777,7 +769,7 @@ static void report_to_bugzilla(
if (bug_id < 0)
{
throw_if_xml_fault_occurred(&bz_server.env);
- throw CABRTException(EXCEP_PLUGIN, _("Bugzilla entry creation failed"));
+ error_msg_and_die(_("Bugzilla entry creation failed"));
}
log("Adding attachments to bug %d...", bug_id);
@@ -816,7 +808,7 @@ static void report_to_bugzilla(
{
VERB3 log("Bugzilla could not find a parent of bug %d", (int)original_bug_id);
bug_info_destroy(&bz);
- throw CABRTException(EXCEP_PLUGIN, _("Bugzilla couldn't find parent of bug %d"), (int)original_bug_id);
+ error_msg_and_die(_("Bugzilla couldn't find parent of bug %d"), (int)original_bug_id);
}
log("Bug %d is a duplicate, using parent bug %d", bug_id, (int)bz.bug_dup_id);
@@ -831,7 +823,7 @@ static void report_to_bugzilla(
{
throw_if_xml_fault_occurred(&bz_server.env);
}
- throw CABRTException(EXCEP_PLUGIN, _("get_bug_info() failed. Could not collect all mandatory information"));
+ error_msg_and_die(_("get_bug_info() failed. Could not collect all mandatory information"));
}
// found a bug which is not CLOSED as DUPLICATE
@@ -905,8 +897,7 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- map_plugin_settings_t settings;
-
+ map_string_h *settings = new_map_string();
const char *dump_dir_name = ".";
enum {
OPT_s = (1 << 0),
@@ -919,7 +910,7 @@ int main(int argc, char **argv)
{
case 'c':
VERB1 log("Loading settings from '%s'", optarg);
- LoadPluginSettings(optarg, settings);
+ load_conf_file(optarg, settings, /*skip key w/o values:*/ true);
VERB3 log("Loaded '%s'", optarg);
break;
case 'd':
@@ -966,14 +957,8 @@ int main(int argc, char **argv)
error_msg_and_die("XML-RPC Fault: %s(%d)", env.fault_string, env.fault_code);
xmlrpc_env_clean(&env);
- try
- {
- report_to_bugzilla(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ report_to_bugzilla(dump_dir_name, settings);
+ free_map_string(settings);
return 0;
}
diff -x '*.po' -d -urpN abrt.7/src/plugins/abrt-action-kerneloops.cpp abrt.8/src/plugins/abrt-action-kerneloops.cpp
--- abrt.7/src/plugins/abrt-action-kerneloops.cpp 2010-12-07 06:35:04.172542744 +0100
+++ abrt.8/src/plugins/abrt-action-kerneloops.cpp 2010-12-07 15:56:07.382594026 +0100
@@ -20,7 +20,6 @@
#include <curl/curl.h>
#include "abrtlib.h"
#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-kerneloops"
@@ -85,7 +84,7 @@ static CURLcode http_post_to_kerneloops_
static void report_to_kerneloops(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
@@ -98,12 +97,8 @@ static void report_to_kerneloops(
if (!backtrace)
error_msg_and_die("Error sending kernel oops due to missing backtrace");
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
-
const char *env = getenv("KerneloopsReporter_SubmitURL");
- it = settings.find("SubmitURL");
- const char *submitURL = (env ? env : it == end ? "" : it->second.c_str());
+ const char *submitURL = (env ? env : get_map_string_item_or_empty(settings, "SubmitURL"));
if (!submitURL[0])
submitURL = "http://submit.kerneloops.org/submitoops.php";
@@ -129,8 +124,7 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- map_plugin_settings_t settings;
-
+ map_string_h *settings = new_map_string();
const char *dump_dir_name = ".";
enum {
OPT_s = (1 << 0),
@@ -143,7 +137,7 @@ int main(int argc, char **argv)
{
case 'c':
VERB1 log("Loading settings from '%s'", optarg);
- LoadPluginSettings(optarg, settings);
+ load_conf_file(optarg, settings, /*skip key w/o values:*/ true);
VERB3 log("Loaded '%s'", optarg);
break;
case 'd':
@@ -182,14 +176,8 @@ int main(int argc, char **argv)
logmode = LOGMODE_SYSLOG;
}
- try
- {
- report_to_kerneloops(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ report_to_kerneloops(dump_dir_name, settings);
+ free_map_string(settings);
return 0;
}
diff -x '*.po' -d -urpN abrt.7/src/plugins/abrt-action-mailx.cpp abrt.8/src/plugins/abrt-action-mailx.cpp
--- abrt.7/src/plugins/abrt-action-mailx.cpp 2010-12-07 06:35:04.173542368 +0100
+++ abrt.8/src/plugins/abrt-action-mailx.cpp 2010-12-07 15:56:02.395068743 +0100
@@ -22,7 +22,6 @@
#include "abrtlib.h"
#include "parse_options.h"
#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-mailx"
@@ -60,7 +59,7 @@ static char** append_str_to_vector(char
static void create_and_send_email(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
@@ -70,20 +69,14 @@ static void create_and_send_email(
dd_close(dd);
char* env;
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
env = getenv("Mailx_Subject");
- it = settings.find("Subject");
- const char *subject = xstrdup(env ? env : (it != end ? it->second.c_str() : "[abrt] full crash report"));
+ const char *subject = (env ? env : get_map_string_item_or_NULL(settings, "Subject") ? : "[abrt] full crash report");
env = getenv("Mailx_EmailFrom");
- it = settings.find("EmailFrom");
- const char *email_from = (env ? env : (it != end ? it->second.c_str() : "user@localhost"));
+ const char *email_from = (env ? env : get_map_string_item_or_NULL(settings, "EmailFrom") ? : "user@localhost");
env = getenv("Mailx_EmailTo");
- it = settings.find("EmailTo");
- const char *email_to = (env ? env : (it != end ? it->second.c_str() : "root@localhost"));
+ const char *email_to = (env ? env : get_map_string_item_or_NULL(settings, "EmailTo") ? : "root@localhost");
env = getenv("Mailx_SendBinaryData");
- it = settings.find("SendBinaryData");
- bool send_binary_data = string_to_bool(env ? env : (it != end ? it->second.c_str() : "0"));
+ bool send_binary_data = string_to_bool(env ? env : get_map_string_item_or_empty(settings, "SendBinaryData"));
char **args = NULL;
unsigned arg_size = 0;
@@ -166,18 +159,12 @@ int main(int argc, char **argv)
// logmode = LOGMODE_SYSLOG;
//}
- map_plugin_settings_t settings;
+ map_string_h *settings = new_map_string();
if (conf_file)
- LoadPluginSettings(conf_file, settings);
+ load_conf_file(conf_file, settings, /*skip key w/o values:*/ true);
- try
- {
- create_and_send_email(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ create_and_send_email(dump_dir_name, settings);
+ free_map_string(settings);
return 0;
}
diff -x '*.po' -d -urpN abrt.7/src/plugins/abrt-action-print.cpp abrt.8/src/plugins/abrt-action-print.cpp
--- abrt.7/src/plugins/abrt-action-print.cpp 2010-12-03 12:49:26.723622173 +0100
+++ abrt.8/src/plugins/abrt-action-print.cpp 2010-12-07 15:56:09.766594133 +0100
@@ -21,7 +21,6 @@
#include "abrtlib.h"
#include "parse_options.h"
#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-print"
@@ -75,25 +74,17 @@ int main(int argc, char **argv)
}
}
- try
- {
- struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
- if (!dd)
- return 1; /* error message is already logged */
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ return 1; /* error message is already logged */
- crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
- dd_close(dd);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
+ dd_close(dd);
- char *dsc = make_description_logger(crash_data);
- fputs(dsc, stdout);
- free(dsc);
- free_crash_data(crash_data);
- }
- catch (CABRTException& e)
- {
- log("%s", e.what());
- return 1;
- }
+ char *dsc = make_description_logger(crash_data);
+ fputs(dsc, stdout);
+ free(dsc);
+ free_crash_data(crash_data);
if (output_file)
{
diff -x '*.po' -d -urpN abrt.7/src/plugins/abrt-action-rhtsupport.cpp abrt.8/src/plugins/abrt-action-rhtsupport.cpp
--- abrt.7/src/plugins/abrt-action-rhtsupport.cpp 2010-12-07 06:35:04.174541850 +0100
+++ abrt.8/src/plugins/abrt-action-rhtsupport.cpp 2010-12-07 15:56:00.008344589 +0100
@@ -23,13 +23,12 @@
#include "abrt_xmlrpc.h"
#include "abrt_rh_support.h"
#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-rhtsupport"
static void report_to_rhtsupport(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
@@ -53,24 +52,17 @@ static void report_to_rhtsupport(
const char* package;
char* env;
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
-
env = getenv("RHTSupport_URL");
- it = settings.find("URL");
- char *url = xstrdup(env ? env : it == end ? "https://api.access.redhat.com/rs" : it->second.c_str());
+ char *url = xstrdup(env ? env : (get_map_string_item_or_NULL(settings, "URL") ? : "https://api.access.redhat.com/rs"));
env = getenv("RHTSupport_Login");
- it = settings.find("Login");
- char *login = xstrdup(env ? env : it == end ? "" : it->second.c_str());
+ char *login = xstrdup(env ? env : get_map_string_item_or_empty(settings, "Login"));
env = getenv("RHTSupport_Password");
- it = settings.find("Password");
- char *password = xstrdup(env ? env : it == end ? "" : it->second.c_str());
+ char *password = xstrdup(env ? env : get_map_string_item_or_empty(settings, "Password"));
env = getenv("RHTSupport_SSLVerify");
- it = settings.find("SSLVerify");
- bool ssl_verify = string_to_bool(env ? env : it == end ? "1" : it->second.c_str());
+ bool ssl_verify = string_to_bool(env ? env : get_map_string_item_or_empty(settings, "SSLVerify"));
if (!login[0] || !password[0])
{
@@ -262,8 +254,7 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
- map_plugin_settings_t settings;
-
+ map_string_h *settings = new_map_string();
const char *dump_dir_name = ".";
enum {
OPT_s = (1 << 0),
@@ -276,7 +267,7 @@ int main(int argc, char **argv)
{
case 'c':
VERB1 log("Loading settings from '%s'", optarg);
- LoadPluginSettings(optarg, settings);
+ load_conf_file(optarg, settings, /*skip key w/o values:*/ true);
VERB3 log("Loaded '%s'", optarg);
break;
case 'd':
@@ -323,14 +314,8 @@ int main(int argc, char **argv)
error_msg_and_die("XML-RPC Fault: %s(%d)", env.fault_string, env.fault_code);
xmlrpc_env_clean(&env);
- try
- {
- report_to_rhtsupport(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ report_to_rhtsupport(dump_dir_name, settings);
+ free_map_string(settings);
return 0;
}
diff -x '*.po' -d -urpN abrt.7/src/plugins/abrt-action-upload.cpp abrt.8/src/plugins/abrt-action-upload.cpp
--- abrt.7/src/plugins/abrt-action-upload.cpp 2010-12-07 06:35:04.175542029 +0100
+++ abrt.8/src/plugins/abrt-action-upload.cpp 2010-12-07 15:56:12.053353675 +0100
@@ -22,7 +22,6 @@
#include "abrtlib.h"
#include "parse_options.h"
#include "abrt_crash_dump.h"
-#include "abrt_exception.h"
#define PROGNAME "abrt-action-upload"
@@ -104,7 +103,7 @@ static int send_file(const char *url, co
static int create_and_upload_archive(
const char *dump_dir_name,
- const map_plugin_settings_t& settings)
+ map_string_h *settings)
{
int result = 0;
@@ -125,12 +124,8 @@ static int create_and_upload_archive(
//ArchiveType = .tar.bz2
//ExcludeFiles = foo,bar*,b*z
char* env;
- map_plugin_settings_t::const_iterator end = settings.end();
- map_plugin_settings_t::const_iterator it;
-
env = getenv("Upload_URL");
- it = settings.find("URL");
- const char *url = (env ? env : (it == end ? NULL : it->second.c_str()));
+ const char *url = (env ? env : get_map_string_item_or_empty(settings, "URL"));
/* Create a child gzip which will compress the data */
/* SELinux guys are not happy with /tmp, using /var/run/abrt */
@@ -279,21 +274,14 @@ int main(int argc, char **argv)
// logmode = LOGMODE_SYSLOG;
//}
- map_plugin_settings_t settings;
+ map_string_h *settings = new_map_string();
if (url)
- settings["URL"] = url;
+ g_hash_table_replace(settings, xstrdup("URL"), xstrdup(url));
if (conf_file)
- LoadPluginSettings(conf_file, settings);
+ load_conf_file(conf_file, settings, /*skip key w/o values:*/ true);
- int result = 0;
- try
- {
- result = create_and_upload_archive(dump_dir_name, settings);
- }
- catch (CABRTException& e)
- {
- error_msg_and_die("%s", e.what());
- }
+ int result = create_and_upload_archive(dump_dir_name, settings);
+ free_map_string(settings);
return result;
}
diff -x '*.po' -d -urpN abrt.7/src/plugins/CCpp.cpp abrt.8/src/plugins/CCpp.cpp
--- abrt.7/src/plugins/CCpp.cpp 2010-11-23 13:35:00.000000000 +0100
+++ abrt.8/src/plugins/CCpp.cpp 2010-12-07 15:56:05.030344083 +0100
@@ -21,7 +21,6 @@
#include <set>
#include "abrtlib.h"
#include "CCpp.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
using namespace std;
diff -x '*.po' -d -urpN abrt.7/src/plugins/KerneloopsScanner.cpp abrt.8/src/plugins/KerneloopsScanner.cpp
--- abrt.7/src/plugins/KerneloopsScanner.cpp 2010-11-25 13:29:39.000000000 +0100
+++ abrt.8/src/plugins/KerneloopsScanner.cpp 2010-12-07 15:56:14.456362047 +0100
@@ -24,7 +24,6 @@
#include <asm/unistd.h> /* __NR_syslog */
#include <glib.h>
#include "abrtlib.h"
-#include "abrt_exception.h"
#include "comm_layer_inner.h"
#include "KerneloopsSysLog.h"
#include "KerneloopsScanner.h"
13 years, 4 months
[PATCH] Compute duplication hash from component and backtrace
by Karel Klic
Hi,
David Tardon pointed out several duplicate bugs reported on
OpenOffice.org component. The problem is in the way how the top-level
duplicate hash is computed: package + executable + backtrace. ABRT is
supposed to merge all crashes with the same backtrace within one
component into single Bugzilla bug, because identical backtrace implies
that the problem is in shared code. So the duplicate hash should be
computed from component + backtrace.
Do you see any issues with the new way?
Thanks.
Karel
13 years, 5 months
[PATCH] convert C++ map_crash_data_t to glib-based C data structure
by Denys Vlasenko
This patch changes crash data to use C structures.
The smallest data element is:
struct crash_item {
char *content;
unsigned flags;
};
where content is, eh, content, and flags is a bit flag field:
enum {
CD_FLAG_SYS = (1 << 0),
CD_FLAG_BIN = (1 << 1),
CD_FLAG_TXT = (1 << 2),
CD_FLAG_ISEDITABLE = (1 << 3),
CD_FLAG_ISNOTEDITABLE = (1 << 4),
};
crash_data_t is a map of crash_item's, implemented as a pointer
to heap-allocated GHashTable.
vector_of_crash_data_t is a vector of crash_data_t's, implemented
as a pointer to heap-allocated GPtrArray.
Most operations have light wrappers around them to hide the nature
of the containers. For example, to free vector_of_crash_data,
you need to use free_vector_of_crash_data(ptr) instead of
open-coding g_ptr_array_free. The wrapper is thin:
static inline void free_vector_of_crash_data(vector_of_crash_data_t *vector)
{
if (vector)
g_ptr_array_free(vector, TRUE);
}
The goal is not so much to hide the implementation, but more
to make it easier to use the correct function.
dbus (un)marshalling functions convert crash_item to three-element
array of strings, in order to keep compatibility with abrt-gui (python).
This can be changed later to use native representation.
crash_data_t and vector_of_crash_data_t are represented in
"natural" way, no funny stuff there.
Lightly run-tested.
Please review.
--
vda
diff -x '*.po' -d -urpN abrt.5/src/applet/test_report.cpp abrt.6/src/applet/test_report.cpp
--- abrt.5/src/applet/test_report.cpp 2010-12-01 17:39:43.000000000 +0100
+++ abrt.6/src/applet/test_report.cpp 2010-12-03 12:52:21.051148671 +0100
@@ -34,12 +34,13 @@ static char *do_log(char *log_line, void
int main(int argc, char** argv)
{
- map_crash_data_t cd;
+ crash_data_t *crash_data = new_crash_data();
- add_to_crash_data(cd, "analyzer", "wow");
+ add_to_crash_data(crash_data, "analyzer", "wow");
const char *event = "report";
- struct dump_dir *dd = create_crash_dump_dir(cd);
+ struct dump_dir *dd = create_crash_dump_dir(crash_data);
+ free_crash_data(crash_data);
if (!dd)
return 1;
char *dir_name = strdup(dd->dd_dir);
diff -x '*.po' -d -urpN abrt.5/src/cli/CLI.cpp abrt.6/src/cli/CLI.cpp
--- abrt.5/src/cli/CLI.cpp 2010-12-03 18:53:39.868519915 +0100
+++ abrt.6/src/cli/CLI.cpp 2010-12-03 18:47:08.493519151 +0100
@@ -38,10 +38,10 @@ static char *localize_crash_time(const c
}
/** Prints basic information about a crash to stdout. */
-static void print_crash(const map_crash_data_t &crash)
+static void print_crash(crash_data_t *crash_data)
{
/* Create a localized string from crash time. */
- const char *timestr = get_crash_data_item_content(crash, FILENAME_TIME).c_str();
+ const char *timestr = get_crash_data_item_content(crash_data, FILENAME_TIME);
const char *timeloc = localize_crash_time(timestr);
printf(_("\tCrash dump : %s\n"
@@ -50,17 +50,18 @@ static void print_crash(const map_crash_
"\tExecutable : %s\n"
"\tCrash Time : %s\n"
"\tCrash Count: %s\n"),
- get_crash_data_item_content(crash, CD_DUMPDIR).c_str(),
- get_crash_data_item_content(crash, FILENAME_UID).c_str(),
- get_crash_data_item_content(crash, FILENAME_PACKAGE).c_str(),
- get_crash_data_item_content(crash, FILENAME_EXECUTABLE).c_str(),
+ get_crash_data_item_content(crash_data, CD_DUMPDIR),
+ get_crash_data_item_content(crash_data, FILENAME_UID),
+ get_crash_data_item_content(crash_data, FILENAME_PACKAGE),
+ get_crash_data_item_content(crash_data, FILENAME_EXECUTABLE),
timeloc,
- get_crash_data_item_content(crash, FILENAME_COUNT).c_str());
+ get_crash_data_item_content(crash_data, FILENAME_COUNT)
+ );
free((void *)timeloc);
/* Print the hostname if it's available. */
- const char *hostname = get_crash_data_item_content_or_NULL(crash, FILENAME_HOSTNAME);
+ const char *hostname = get_crash_data_item_content_or_NULL(crash_data, FILENAME_HOSTNAME);
if (hostname)
printf(_("\tHostname : %s\n"), hostname);
}
@@ -70,11 +71,11 @@ static void print_crash(const map_crash_
* @param include_reported
* Do not skip entries marked as already reported.
*/
-static void print_crash_list(const vector_map_crash_data_t& crash_list, bool include_reported)
+static void print_crash_list(vector_of_crash_data_t *crash_list, bool include_reported)
{
- for (unsigned i = 0; i < crash_list.size(); ++i)
+ for (unsigned i = 0; i < crash_list->len; ++i)
{
- const map_crash_data_t& crash = crash_list[i];
+ crash_data_t *crash = get_crash_data(crash_list, i);
if (!include_reported)
{
const char *msg = get_crash_data_item_content_or_NULL(crash, FILENAME_MESSAGE);
@@ -90,9 +91,9 @@ static void print_crash_list(const vecto
/**
* Prints full information about a crash
*/
-static void print_crash_info(const map_crash_data_t& crash, bool show_backtrace)
+static void print_crash_info(crash_data_t *crash_data, bool show_backtrace)
{
- const char *timestr = get_crash_data_item_content(crash, FILENAME_TIME).c_str();
+ const char *timestr = get_crash_data_item_content(crash_data, FILENAME_TIME);
const char *timeloc = localize_crash_time(timestr);
printf(_("Dump directory: %s\n"
@@ -104,50 +105,51 @@ static void print_crash_info(const map_c
"Executable: %s\n"
"System: %s, kernel %s\n"
"Reason: %s\n"),
- get_crash_data_item_content(crash, CD_DUMPDIR).c_str(),
+ get_crash_data_item_content(crash_data, CD_DUMPDIR),
timeloc,
- get_crash_data_item_content(crash, FILENAME_ANALYZER).c_str(),
- get_crash_data_item_content(crash, FILENAME_COMPONENT).c_str(),
- get_crash_data_item_content(crash, FILENAME_PACKAGE).c_str(),
- get_crash_data_item_content(crash, FILENAME_CMDLINE).c_str(),
- get_crash_data_item_content(crash, FILENAME_EXECUTABLE).c_str(),
- get_crash_data_item_content(crash, FILENAME_RELEASE).c_str(),
- get_crash_data_item_content(crash, FILENAME_KERNEL).c_str(),
- get_crash_data_item_content(crash, FILENAME_REASON).c_str());
+ get_crash_data_item_content(crash_data, FILENAME_ANALYZER),
+ get_crash_data_item_content(crash_data, FILENAME_COMPONENT),
+ get_crash_data_item_content(crash_data, FILENAME_PACKAGE),
+ get_crash_data_item_content(crash_data, FILENAME_CMDLINE),
+ get_crash_data_item_content(crash_data, FILENAME_EXECUTABLE),
+ get_crash_data_item_content(crash_data, FILENAME_RELEASE),
+ get_crash_data_item_content(crash_data, FILENAME_KERNEL),
+ get_crash_data_item_content(crash_data, FILENAME_REASON)
+ );
free((void *)timeloc);
/* Print optional fields only if they are available */
/* Coredump is not present in kerneloopses and Python exceptions. */
- const char *coredump = get_crash_data_item_content_or_NULL(crash, FILENAME_COREDUMP);
+ const char *coredump = get_crash_data_item_content_or_NULL(crash_data, FILENAME_COREDUMP);
if (coredump)
printf(_("Coredump file: %s\n"), coredump);
- const char *rating = get_crash_data_item_content_or_NULL(crash, FILENAME_RATING);
+ const char *rating = get_crash_data_item_content_or_NULL(crash_data, FILENAME_RATING);
if (rating)
printf(_("Rating: %s\n"), rating);
/* Crash function is not present in kerneloopses, and before the full report is created.*/
- const char *crash_function = get_crash_data_item_content_or_NULL(crash, FILENAME_CRASH_FUNCTION);
+ const char *crash_function = get_crash_data_item_content_or_NULL(crash_data, FILENAME_CRASH_FUNCTION);
if (crash_function)
printf(_("Crash function: %s\n"), crash_function);
- const char *hostname = get_crash_data_item_content_or_NULL(crash, FILENAME_HOSTNAME);
+ const char *hostname = get_crash_data_item_content_or_NULL(crash_data, FILENAME_HOSTNAME);
if (hostname)
printf(_("Hostname: %s\n"), hostname);
- const char *reproduce = get_crash_data_item_content_or_NULL(crash, FILENAME_REPRODUCE);
+ const char *reproduce = get_crash_data_item_content_or_NULL(crash_data, FILENAME_REPRODUCE);
if (reproduce)
printf(_("\nHow to reproduce:\n%s\n"), reproduce);
- const char *comment = get_crash_data_item_content_or_NULL(crash, FILENAME_COMMENT);
+ const char *comment = get_crash_data_item_content_or_NULL(crash_data, FILENAME_COMMENT);
if (comment)
printf(_("\nComment:\n%s\n"), comment);
if (show_backtrace)
{
- const char *backtrace = get_crash_data_item_content_or_NULL(crash, FILENAME_BACKTRACE);
+ const char *backtrace = get_crash_data_item_content_or_NULL(crash_data, FILENAME_BACKTRACE);
if (backtrace)
printf(_("\nBacktrace:\n%s\n"), backtrace);
}
@@ -159,15 +161,17 @@ static void print_crash_info(const map_c
*/
static char *guess_crash_id(const char *str)
{
- vector_map_crash_data_t ci = call_GetCrashInfos();
- unsigned num_crashinfos = ci.size();
+ vector_of_crash_data_t *ci = call_GetCrashInfos();
+ unsigned num_crashinfos = ci->len;
if (str[0] == '@') /* "--report @N" syntax */
{
unsigned position = xatoi_u(str + 1);
if (position >= num_crashinfos)
error_msg_and_die("There are only %u crash infos", num_crashinfos);
- map_crash_data_t& info = ci[position];
- return xstrdup(get_crash_data_item_content(info, CD_DUMPDIR).c_str());
+ crash_data_t *info = get_crash_data(ci, position);
+ char *res = xstrdup(get_crash_data_item_content(info, CD_DUMPDIR));
+ free_vector_of_crash_data(ci);
+ return res;
}
unsigned len = strlen(str);
@@ -175,8 +179,8 @@ static char *guess_crash_id(const char *
char *result = NULL;
for (ii = 0; ii < num_crashinfos; ii++)
{
- map_crash_data_t& info = ci[ii];
- const char *this_dir = get_crash_data_item_content(info, CD_DUMPDIR).c_str();
+ crash_data_t *info = get_crash_data(ci, ii);
+ const char *this_dir = get_crash_data_item_content(info, CD_DUMPDIR);
if (strncmp(str, this_dir, len) == 0)
{
if (result)
@@ -184,6 +188,7 @@ static char *guess_crash_id(const char *
result = xstrdup(this_dir);
}
}
+ free_vector_of_crash_data(ci);
if (!result)
error_msg_and_die("Crash dump directory '%s' not found", str);
return result;
@@ -353,8 +358,9 @@ int main(int argc, char** argv)
{
case OPT_GET_LIST:
{
- vector_map_crash_data_t ci = call_GetCrashInfos();
+ vector_of_crash_data_t *ci = call_GetCrashInfos();
print_crash_list(ci, full);
+ free_vector_of_crash_data(ci);
break;
}
case OPT_REPORT:
@@ -403,12 +409,12 @@ int main(int argc, char** argv)
int old_logmode = logmode;
logmode = 0;
- map_crash_data_t crashData = call_CreateReport(crash_id);
- if (crashData.empty()) /* no such crash_id */
+ crash_data_t *crash_data = call_CreateReport(crash_id);
+ if (!crash_data) /* no such crash_id */
{
crash_id = guess_crash_id(crash_id);
- crashData = call_CreateReport(crash_id);
- if (crashData.empty())
+ crash_data = call_CreateReport(crash_id);
+ if (!crash_data)
{
error_msg("Crash '%s' not found", crash_id);
free((void *)crash_id);
@@ -420,7 +426,8 @@ int main(int argc, char** argv)
logmode = old_logmode;
- print_crash_info(crashData, backtrace);
+ print_crash_info(crash_data, backtrace);
+ free_crash_data(crash_data);
break;
}
diff -x '*.po' -d -urpN abrt.5/src/cli/dbus.cpp abrt.6/src/cli/dbus.cpp
--- abrt.5/src/cli/dbus.cpp 2010-12-01 16:45:33.000000000 +0100
+++ abrt.6/src/cli/dbus.cpp 2010-12-03 16:18:14.288804274 +0100
@@ -121,7 +121,7 @@ static DBusMessage* send_get_reply_and_u
}
}
-vector_map_crash_data_t call_GetCrashInfos()
+vector_of_crash_data_t *call_GetCrashInfos()
{
DBusMessage* msg = new_call_msg(__func__ + 5);
DBusMessage *reply = send_get_reply_and_unref(msg);
@@ -129,8 +129,8 @@ vector_map_crash_data_t call_GetCrashInf
DBusMessageIter in_iter;
dbus_message_iter_init(reply, &in_iter);
- vector_map_crash_data_t argout;
- int r = load_val(&in_iter, argout);
+ vector_of_crash_data_t *argout = NULL;
+ int r = load_vector_of_crash_data(&in_iter, &argout);
if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
@@ -138,7 +138,7 @@ vector_map_crash_data_t call_GetCrashInf
return argout;
}
-map_crash_data_t call_CreateReport(const char* crash_id)
+crash_data_t *call_CreateReport(const char* crash_id)
{
DBusMessage* msg = new_call_msg(__func__ + 5);
dbus_message_append_args(msg,
@@ -150,8 +150,8 @@ map_crash_data_t call_CreateReport(const
DBusMessageIter in_iter;
dbus_message_iter_init(reply, &in_iter);
- map_crash_data_t argout;
- int r = load_val(&in_iter, argout);
+ crash_data_t *argout = NULL;
+ int r = load_crash_data(&in_iter, &argout);
if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
@@ -159,7 +159,7 @@ map_crash_data_t call_CreateReport(const
return argout;
}
-report_status_t call_Report(const map_crash_data_t& report,
+report_status_t call_Report(crash_data_t *report,
const vector_string_t& reporters,
GHashTable *plugins)
{
@@ -168,7 +168,7 @@ report_status_t call_Report(const map_cr
dbus_message_iter_init_append(msg, &out_iter);
/* parameter #1: report data */
- store_val(&out_iter, report);
+ store_crash_data(&out_iter, report);
/* parameter #2: reporters to use */
store_val(&out_iter, reporters);
/* parameter #3 (opt): plugin config */
diff -x '*.po' -d -urpN abrt.5/src/cli/dbus.h abrt.6/src/cli/dbus.h
--- abrt.5/src/cli/dbus.h 2010-12-01 16:45:33.000000000 +0100
+++ abrt.6/src/cli/dbus.h 2010-12-03 12:54:41.549157674 +0100
@@ -24,9 +24,9 @@
extern DBusConnection* s_dbus_conn;
-vector_map_crash_data_t call_GetCrashInfos();
+vector_of_crash_data_t *call_GetCrashInfos();
-map_crash_data_t call_CreateReport(const char *crash_id);
+crash_data_t *call_CreateReport(const char *crash_id);
/** Sends report using enabled Reporter plugins.
* @param report
@@ -40,7 +40,7 @@ map_crash_data_t call_CreateReport(const
* obtained by call_GetPluginSettings, otherwise the plugin might ignore
* the settings.
*/
-report_status_t call_Report(const map_crash_data_t& report,
+report_status_t call_Report(crash_data_t *report,
const vector_string_t& reporters,
GHashTable *plugins);
diff -x '*.po' -d -urpN abrt.5/src/cli/report.cpp abrt.6/src/cli/report.cpp
--- abrt.5/src/cli/report.cpp 2010-12-03 16:18:48.695992945 +0100
+++ abrt.6/src/cli/report.cpp 2010-12-03 16:18:30.284054655 +0100
@@ -142,30 +142,30 @@ static void remove_comments_and_unescape
* Writes a field of crash report to a file.
* Field must be writable.
*/
-static void write_crash_report_field(FILE *fp, const map_crash_data_t &report,
+static void write_crash_report_field(FILE *fp, crash_data_t *crash_data,
const char *field, const char *description)
{
- const map_crash_data_t::const_iterator it = report.find(field);
- if (it == report.end())
+ const struct crash_item *value = get_crash_data_item_or_NULL(crash_data, field);
+ if (!value)
{
// exit silently, all fields are optional for now
//error_msg("Field %s not found", field);
return;
}
- if (it->second[CD_TYPE] == CD_SYS)
+ if (value->flags & CD_FLAG_SYS)
{
error_msg("Cannot update field %s because it is a system value", field);
return;
}
- fprintf(fp, "%s%s\n", FIELD_SEP, it->first.c_str());
+ fprintf(fp, "%s%s\n", FIELD_SEP, field);
fprintf(fp, "%s\n", description);
- if (it->second[CD_EDITABLE] != CD_ISEDITABLE)
+ if (!(value->flags & CD_FLAG_ISEDITABLE))
fprintf(fp, _("# This field is read only\n"));
- char *escaped_content = escape(it->second[CD_CONTENT].c_str());
+ char *escaped_content = escape(value->content);
fprintf(fp, "%s\n", escaped_content);
free(escaped_content);
}
@@ -177,7 +177,7 @@ static void write_crash_report_field(FIL
* If the report is successfully stored to the file, a zero value is returned.
* On failure, nonzero value is returned.
*/
-static void write_crash_report(const map_crash_data_t &report, FILE *fp)
+static void write_crash_report(crash_data_t *report, FILE *fp)
{
fprintf(fp, "# Please check this report. Lines starting with '#' will be ignored.\n"
"# Lines starting with '%%----' separate fields, please do not delete them.\n\n");
@@ -208,7 +208,7 @@ static void write_crash_report(const map
* 1 if the field was changed.
* Changes to read-only fields are ignored.
*/
-static int read_crash_report_field(const char *text, map_crash_data_t &report,
+static int read_crash_report_field(const char *text, crash_data_t *report,
const char *field)
{
char separator[sizeof("\n" FIELD_SEP)-1 + strlen(field) + 2]; // 2 = '\n\0'
@@ -225,21 +225,21 @@ static int read_crash_report_field(const
else
length = end - textfield;
- const map_crash_data_t::iterator it = report.find(field);
- if (it == report.end())
+ struct crash_item *value = get_crash_data_item_or_NULL(report, field);
+ if (!value)
{
error_msg("Field %s not found", field);
return 0;
}
- if (it->second[CD_TYPE] == CD_SYS)
+ if (value->flags & CD_FLAG_SYS)
{
error_msg("Cannot update field %s because it is a system value", field);
return 0;
}
// Do not change noneditable fields.
- if (it->second[CD_EDITABLE] != CD_ISEDITABLE)
+ if (!(value->flags & CD_FLAG_ISEDITABLE))
return 0;
// Compare the old field contents with the new field contents.
@@ -248,16 +248,16 @@ static int read_crash_report_field(const
newvalue[length] = '\0';
trim(newvalue);
- char oldvalue[it->second[CD_CONTENT].length() + 1];
- strcpy(oldvalue, it->second[CD_CONTENT].c_str());
+ char oldvalue[strlen(value->content) + 1];
+ strcpy(oldvalue, value->content);
trim(oldvalue);
// Return if no change in the contents detected.
- int cmp = strcmp(newvalue, oldvalue);
- if (!cmp)
+ if (strcmp(newvalue, oldvalue) == 0)
return 0;
- it->second[CD_CONTENT].assign(newvalue);
+ free(value->content);
+ value->content = xstrdup(newvalue);
return 1;
}
@@ -269,7 +269,7 @@ static int read_crash_report_field(const
* 1 if any field was changed.
* Changes to read-only fields are ignored.
*/
-static int read_crash_report(map_crash_data_t &report, const char *text)
+static int read_crash_report(crash_data_t *report, const char *text)
{
int result = 0;
result |= read_crash_report_field(text, report, FILENAME_COMMENT);
@@ -292,13 +292,13 @@ static int read_crash_report(map_crash_d
* Ensures that the fields needed for editor are present in the crash data.
* Fields: comments, how to reproduce.
*/
-static void create_fields_for_editor(map_crash_data_t &crash_data)
+static void create_fields_for_editor(crash_data_t *crash_data)
{
- if (crash_data.find(FILENAME_COMMENT) == crash_data.end())
- add_to_crash_data_ext(crash_data, FILENAME_COMMENT, CD_TXT, CD_ISEDITABLE, "");
+ if (!get_crash_data_item_or_NULL(crash_data, FILENAME_COMMENT))
+ add_to_crash_data_ext(crash_data, FILENAME_COMMENT, "", CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
- if (crash_data.find(FILENAME_REPRODUCE) == crash_data.end())
- add_to_crash_data_ext(crash_data, FILENAME_REPRODUCE, CD_TXT, CD_ISEDITABLE, "1. \n2. \n3. \n");
+ if (!get_crash_data_item_or_NULL(crash_data, FILENAME_REPRODUCE))
+ add_to_crash_data_ext(crash_data, FILENAME_REPRODUCE, "1. \n2. \n3. \n", CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
/**
@@ -342,7 +342,7 @@ static int launch_editor(const char *pat
* 2 on failure, unable to create, open, or close temporary file
* 3 on failure, cannot launch text editor
*/
-static int run_report_editor(map_crash_data_t &cr)
+static int run_report_editor(crash_data_t *crash_data)
{
/* Open a temporary file and write the crash report to it. */
char filename[] = "/tmp/abrt-report.XXXXXX";
@@ -360,7 +360,7 @@ static int run_report_editor(map_crash_d
return 2;
}
- write_crash_report(cr, fp);
+ write_crash_report(crash_data, fp);
if (fclose(fp)) /* errno is set */
{
@@ -405,7 +405,7 @@ static int run_report_editor(map_crash_d
remove_comments_and_unescape(text);
// Updates the crash report from the file text.
- int report_changed = read_crash_report(cr, text);
+ int report_changed = read_crash_report(crash_data, text);
free(text);
if (report_changed)
puts(_("\nThe report has been updated"));
@@ -587,27 +587,31 @@ int report(const char *crash_id, int fla
if (flags & CLI_REPORT_SILENT_IF_NOT_FOUND)
logmode = 0;
// Ask for an initial report.
- map_crash_data_t cr = call_CreateReport(crash_id);
+ crash_data_t *crash_data = call_CreateReport(crash_id);
logmode = old_logmode;
- if (cr.size() == 0)
+ if (!crash_data || g_hash_table_size(crash_data) == 0)
{
+ free_crash_data(crash_data);
return -1;
}
- const char *rating_str = get_crash_data_item_content_or_NULL(cr, FILENAME_RATING);
+ const char *rating_str = get_crash_data_item_content_or_NULL(crash_data, FILENAME_RATING);
unsigned rating = rating_str ? xatou(rating_str) : 4;
/* Open text editor and give a chance to review the backtrace etc. */
if (!(flags & CLI_REPORT_BATCH))
{
- create_fields_for_editor(cr);
- int result = run_report_editor(cr);
+ create_fields_for_editor(crash_data);
+ int result = run_report_editor(crash_data);
if (result != 0)
+ {
+ free_crash_data(crash_data);
return result;
+ }
}
/* Get possible reporters associated with this particular crash. */
- const char *events = get_crash_data_item_content_or_NULL(cr, CD_EVENTS);
+ const char *events = get_crash_data_item_content_or_NULL(crash_data, CD_EVENTS);
vector_string_t reporters;
if (events) while (*events)
{
@@ -633,7 +637,7 @@ int report(const char *crash_id, int fla
if (flags & CLI_REPORT_BATCH)
{
puts(_("Reporting..."));
- report_status_t r = call_Report(cr, reporters, reporters_settings);
+ report_status_t r = call_Report(crash_data, reporters, reporters_settings);
report_status_t::iterator it = r.begin();
while (it != r.end())
{
@@ -668,7 +672,7 @@ int report(const char *crash_id, int fla
{
puts(_("Reporting disabled because the backtrace is unusable"));
- const char *package = get_crash_data_item_content_or_NULL(cr, FILENAME_PACKAGE);
+ const char *package = get_crash_data_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
if (package && package[0])
printf(_("Please try to install debuginfo manually using the command: \"debuginfo-install %s\" and try again\n"), package);
@@ -688,7 +692,7 @@ int report(const char *crash_id, int fla
ask_for_missing_settings(it->c_str(), *settings);
vector_string_t cur_reporter(1, *it);
- report_status_t r = call_Report(cr, cur_reporter, reporters_settings);
+ report_status_t r = call_Report(crash_data, cur_reporter, reporters_settings);
assert(r.size() == 1); /* one reporter --> one report status */
vector_string_t &v = r.begin()->second;
printf("%s: %s\n", r.begin()->first.c_str(), v[REPORT_STATUS_IDX_MSG].c_str());
@@ -699,6 +703,7 @@ int report(const char *crash_id, int fla
}
g_hash_table_destroy(reporters_settings);
+ free_crash_data(crash_data);
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors);
return errors != 0;
}
diff -x '*.po' -d -urpN abrt.5/src/daemon/CommLayerServerDBus.cpp abrt.6/src/daemon/CommLayerServerDBus.cpp
--- abrt.5/src/daemon/CommLayerServerDBus.cpp 2010-11-23 13:35:00.000000000 +0100
+++ abrt.6/src/daemon/CommLayerServerDBus.cpp 2010-12-03 14:04:59.169754796 +0100
@@ -144,11 +144,12 @@ static long get_remote_uid(DBusMessage*
static int handle_GetCrashInfos(DBusMessage* call, DBusMessage* reply)
{
long unix_uid = get_remote_uid(call);
- vector_map_crash_data_t argout1 = GetCrashInfos(unix_uid);
+ vector_of_crash_data_t *argout1 = GetCrashInfos(unix_uid);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
- store_val(&out_iter, argout1);
+ store_vector_of_crash_data(&out_iter, argout1);
+ free_vector_of_crash_data(argout1);
send_flush_and_unref(reply);
return 0;
@@ -197,12 +198,12 @@ static int handle_CreateReport(DBusMessa
}
long unix_uid = get_remote_uid(call);
- map_crash_data_t report;
- CreateReport(crash_id, unix_uid, /*force:*/ 0, report);
+ crash_data_t *report = NULL;
+ CreateReport(crash_id, unix_uid, /*force:*/ 0, &report);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
- store_val(&out_iter, report);
+ store_crash_data(&out_iter, report);
send_flush_and_unref(reply);
return 0;
@@ -211,19 +212,28 @@ static int handle_CreateReport(DBusMessa
static int handle_Report(DBusMessage* call, DBusMessage* reply)
{
int r;
+ long unix_uid;
+ report_status_t argout1;
+ map_map_string_t user_conf_data;
+ vector_string_t events;
+ const char* comment = NULL;
+ const char* reproduce = NULL;
+ const char* errmsg = NULL;
DBusMessageIter in_iter;
+
dbus_message_iter_init(call, &in_iter);
- map_crash_data_t argin1;
- r = load_val(&in_iter, argin1);
+ crash_data_t *crash_data = NULL;
+ r = load_crash_data(&in_iter, &crash_data);
if (r != ABRT_DBUS_MORE_FIELDS)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
- return -1;
+ r = -1;
+ goto ret;
}
- const char* comment = get_crash_data_item_content_or_NULL(argin1, FILENAME_COMMENT) ? : "";
- const char* reproduce = get_crash_data_item_content_or_NULL(argin1, FILENAME_REPRODUCE) ? : "";
- const char* errmsg = NULL;
+//TODO? get_crash_data_item_content_or_empty?
+ comment = get_crash_data_item_content_or_NULL(crash_data, FILENAME_COMMENT) ? : "";
+ reproduce = get_crash_data_item_content_or_NULL(crash_data, FILENAME_REPRODUCE) ? : "";
if (strlen(comment) > LIMIT_MESSAGE)
{
errmsg = _("Comment is too long");
@@ -239,35 +249,35 @@ static int handle_Report(DBusMessage* ca
if (!reply)
die_out_of_memory();
send_flush_and_unref(reply);
- return 0;
+ r = 0;
+ goto ret;
}
/* Second parameter: list of events to run */
- vector_string_t events;
r = load_val(&in_iter, events);
if (r == ABRT_DBUS_ERROR)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
- return -1;
+ r = -1;
+ goto ret;
}
/* Third parameter (optional): configuration data for plugins */
- map_map_string_t user_conf_data;
if (r == ABRT_DBUS_MORE_FIELDS)
{
r = load_val(&in_iter, user_conf_data);
if (r != ABRT_DBUS_LAST_FIELD)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
- return -1;
+ r = -1;
+ goto ret;
}
}
- long unix_uid = get_remote_uid(call);
- report_status_t argout1;
+ unix_uid = get_remote_uid(call);
try
{
- argout1 = Report(argin1, events, user_conf_data, unix_uid);
+ argout1 = Report(crash_data, events, user_conf_data, unix_uid);
}
catch (CABRTException &e)
{
@@ -276,7 +286,8 @@ static int handle_Report(DBusMessage* ca
if (!reply)
die_out_of_memory();
send_flush_and_unref(reply);
- return 0;
+ r = 0;
+ goto ret;
}
DBusMessageIter out_iter;
@@ -284,7 +295,10 @@ static int handle_Report(DBusMessage* ca
store_val(&out_iter, argout1);
send_flush_and_unref(reply);
- return 0;
+ r = 0;
+ ret:
+ free_crash_data(crash_data);
+ return r;
}
static int handle_DeleteDebugDump(DBusMessage* call, DBusMessage* reply)
diff -x '*.po' -d -urpN abrt.5/src/daemon/Daemon.cpp abrt.6/src/daemon/Daemon.cpp
--- abrt.5/src/daemon/Daemon.cpp 2010-11-26 17:51:35.000000000 +0100
+++ abrt.6/src/daemon/Daemon.cpp 2010-12-03 12:52:30.081898182 +0100
@@ -55,15 +55,15 @@ using namespace std;
* - signal: we got SIGTERM or SIGINT
*
* DBus methods we have:
- * - GetCrashInfos(): returns a vector_map_crash_data_t (vector_map_vector_string_t)
+ * - GetCrashInfos(): returns a vector_of_crash_data
* of crashes for given uid
* v[N]["executable"/"uid"/"kernel"/"backtrace"][N] = "contents"
* - StartJob(crash_id,force): starts creating a report for /var/spool/abrt/DIR with this UID:UUID.
* Returns job id (uint64).
* After thread returns, when report creation thread has finished,
* JobDone() dbus signal is emitted.
- * - CreateReport(crash_id): returns map_crash_data_t (map_vector_string_t)
- * - Report(map_crash_data_t (map_vector_string_t[, map_map_string_t])):
+ * - CreateReport(crash_id): returns crash data (hash table of struct crash_item)
+ * - Report(crash_data[, map_map_string_t]):
* "Please report this crash": calls Report() of all registered reporter plugins.
* Returns report_status_t (map_vector_string_t) - the status of each call.
* 2nd parameter is the contents of user's abrt.conf.
@@ -542,11 +542,11 @@ static gboolean handle_inotify_cb(GIOCha
}
char *fullname = NULL;
+ crash_data_t *crash_data = NULL;
try
{
fullname = concat_path_file(DEBUG_DUMPS_DIR, name);
- map_crash_data_t crashinfo;
- mw_result_t res = LoadDebugDump(fullname, crashinfo);
+ mw_result_t res = LoadDebugDump(fullname, &crash_data);
switch (res)
{
case MW_OK:
@@ -557,24 +557,24 @@ static gboolean handle_inotify_cb(GIOCha
{
if (res != MW_OK)
{
- const char *first = get_crash_data_item_content_or_NULL(crashinfo, CD_DUMPDIR);
+ const char *first = get_crash_data_item_content_or_NULL(crash_data, CD_DUMPDIR);
log("Deleting crash %s (dup of %s), sending dbus signal",
strrchr(fullname, '/') + 1,
strrchr(first, '/') + 1);
delete_crash_dump_dir(fullname);
}
- const char *uid_str = get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UID);
- const char *inform_all = get_crash_data_item_content_or_NULL(crashinfo, FILENAME_INFORMALL);
+ const char *uid_str = get_crash_data_item_content_or_NULL(crash_data, FILENAME_UID);
+ const char *inform_all = get_crash_data_item_content_or_NULL(crash_data, FILENAME_INFORMALL);
if (inform_all && string_to_bool(inform_all))
uid_str = NULL;
char *crash_id = xasprintf("%s:%s",
- get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UID),
- get_crash_data_item_content_or_NULL(crashinfo, FILENAME_UUID)
+ get_crash_data_item_content_or_NULL(crash_data, FILENAME_UID),
+ get_crash_data_item_content_or_NULL(crash_data, FILENAME_UUID)
);
/* Send dbus signal */
- g_pCommLayer->Crash(get_crash_data_item_content_or_NULL(crashinfo, FILENAME_PACKAGE),
+ g_pCommLayer->Crash(get_crash_data_item_content_or_NULL(crash_data, FILENAME_PACKAGE),
crash_id, //TODO: stop passing this param, it is unused
fullname,
uid_str
@@ -598,9 +598,11 @@ static gboolean handle_inotify_cb(GIOCha
{
free(fullname);
free(buf);
+ free_crash_data(crash_data);
throw;
}
free(fullname);
+ free_crash_data(crash_data);
} /* while */
free(buf);
diff -x '*.po' -d -urpN abrt.5/src/daemon/Makefile.am abrt.6/src/daemon/Makefile.am
--- abrt.5/src/daemon/Makefile.am 2010-11-26 13:20:34.000000000 +0100
+++ abrt.6/src/daemon/Makefile.am 2010-12-03 14:06:53.985502869 +0100
@@ -52,6 +52,7 @@ abrt_server_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_server_LDADD = \
@@ -71,6 +72,7 @@ abrt_handle_crashdump_CPPFLAGS = \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
-DLIBEXEC_DIR=\"$(LIBEXEC_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_handle_crashdump_LDADD = \
diff -x '*.po' -d -urpN abrt.5/src/daemon/MiddleWare.cpp abrt.6/src/daemon/MiddleWare.cpp
--- abrt.5/src/daemon/MiddleWare.cpp 2010-12-02 08:07:09.322335644 +0100
+++ abrt.6/src/daemon/MiddleWare.cpp 2010-12-03 13:25:43.345337249 +0100
@@ -43,8 +43,7 @@ CPluginManager* g_pPluginManager;
* @param pCrashData A crash info.
* @return It return results of operation. See mw_result_t.
*/
-static mw_result_t FillCrashInfo(const char *dump_dir_name,
- map_crash_data_t& pCrashData);
+static crash_data_t *FillCrashInfo(const char *dump_dir_name);
/**
* Transforms a debugdump directory to inner crash
@@ -52,13 +51,13 @@ static mw_result_t FillCrashInfo(const c
* @param dump_dir_name A debugdump dir containing all necessary data.
* @param pCrashData A created crash report.
*/
-static bool DebugDumpToCrashReport(const char *dump_dir_name, map_crash_data_t& pCrashData)
+static crash_data_t *DebugDumpToCrashReport(const char *dump_dir_name)
{
VERB3 log(" DebugDumpToCrashReport('%s')", dump_dir_name);
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- return false;
+ return NULL;
static const char *const must_have_files[] = {
FILENAME_ARCHITECTURE,
@@ -76,21 +75,21 @@ static bool DebugDumpToCrashReport(const
{
dd_close(dd);
log("Important file '%s/%s' is missing", dump_dir_name, *v);
- return false;
+ return NULL;
}
v++;
}
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
char *events = list_possible_events(dd, NULL, "");
dd_close(dd);
- add_to_crash_data_ext(pCrashData, CD_EVENTS, CD_SYS, CD_ISNOTEDITABLE, events);
+ add_to_crash_data_ext(crash_data, CD_EVENTS, events, CD_FLAG_SYS + CD_FLAG_ISNOTEDITABLE);
free(events);
- add_to_crash_data_ext(pCrashData, CD_DUMPDIR, CD_SYS, CD_ISNOTEDITABLE, dump_dir_name);
+ add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_SYS + CD_FLAG_ISNOTEDITABLE);
- return true;
+ return crash_data;
}
static char *do_log_and_update_client(char *log_line, void *param)
@@ -118,9 +117,11 @@ static char *do_log_and_update_client(ch
static mw_result_t CreateCrashReport(const char *dump_dir_name,
long caller_uid,
int force,
- map_crash_data_t& pCrashData)
+ crash_data_t **crash_data)
{
- VERB2 log("CreateCrashReport('%s',%ld,result)", dump_dir_name, caller_uid);
+ VERB2 log("CreateCrashReport('%s',%ld)", dump_dir_name, caller_uid);
+
+ *crash_data = NULL;
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
@@ -165,7 +166,8 @@ static mw_result_t CreateCrashReport(con
/* Do a load_crash_data_from_crash_dump_dir from (possibly updated)
* crash dump dir
*/
- if (!DebugDumpToCrashReport(dump_dir_name, pCrashData))
+ *crash_data = DebugDumpToCrashReport(dump_dir_name);
+ if (!*crash_data)
{
error_msg("Error loading crash data");
r = MW_ERROR;
@@ -224,7 +226,7 @@ static char *do_log_and_save_line(char *
// Do not trust client_report here!
// dbus handler passes it from user without checking
-report_status_t Report(const map_crash_data_t& client_report,
+report_status_t Report(crash_data_t *client_report,
const vector_string_t& events,
const map_map_string_t& settings,
long caller_uid)
@@ -238,9 +240,8 @@ report_status_t Report(const map_crash_d
}
// Retrieve corresponding stored record
- map_crash_data_t stored_report;
- mw_result_t r = FillCrashInfo(dump_dir_name, stored_report);
- if (r != MW_OK)
+ crash_data_t *stored_report = FillCrashInfo(dump_dir_name);
+ if (!stored_report)
{
return report_status_t();
}
@@ -251,8 +252,11 @@ report_status_t Report(const map_crash_d
) {
const char *inform_all = get_crash_data_item_content_or_NULL(stored_report, FILENAME_INFORMALL);
if (!inform_all || !string_to_bool(inform_all))
+ {
+ free_crash_data(stored_report);
throw CABRTException(EXCEP_ERROR, "Report(): user with uid %ld can't report crash %s",
caller_uid, dump_dir_name);
+ }
}
// Save comment, "how to reproduce", backtrace
@@ -269,45 +273,47 @@ report_status_t Report(const map_crash_d
if (comment)
{
dd_save_text(dd, FILENAME_COMMENT, comment);
- add_to_crash_data_ext(stored_report, FILENAME_COMMENT, CD_TXT, CD_ISEDITABLE, comment);
+ add_to_crash_data_ext(stored_report, FILENAME_COMMENT, comment, CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
if (reproduce)
{
dd_save_text(dd, FILENAME_REPRODUCE, reproduce);
- add_to_crash_data_ext(stored_report, FILENAME_REPRODUCE, CD_TXT, CD_ISEDITABLE, reproduce);
+ add_to_crash_data_ext(stored_report, FILENAME_REPRODUCE, reproduce, CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
if (backtrace)
{
dd_save_text(dd, FILENAME_BACKTRACE, backtrace);
- add_to_crash_data_ext(stored_report, FILENAME_BACKTRACE, CD_TXT, CD_ISEDITABLE, backtrace);
+ add_to_crash_data_ext(stored_report, FILENAME_BACKTRACE, backtrace, CD_FLAG_TXT + CD_FLAG_ISEDITABLE);
}
dd_close(dd);
}
}
/* Remove BIN filenames from stored_report if they are not present in client's data */
- map_crash_data_t::const_iterator its = stored_report.begin();
- while (its != stored_report.end())
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, stored_report);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (its->second[CD_TYPE] == CD_BIN)
+ if (value->flags & CD_FLAG_BIN)
{
- std::string key = its->first;
- if (get_crash_data_item_content_or_NULL(client_report, key.c_str()) == NULL)
+ if (get_crash_data_item_content_or_NULL(client_report, name) == NULL)
{
/* client does not have it -> does not want it passed to events */
- VERB3 log("Won't report BIN file %s:'%s'", key.c_str(), its->second[CD_CONTENT].c_str());
- its++; /* move off the element we will erase */
- stored_report.erase(key);
+ VERB3 log("Won't report BIN file %s:'%s'", name, value->content);
+ g_hash_table_iter_remove(&iter);
continue;
}
}
- its++;
}
VERB3 {
log_map_crash_data(client_report, " client_report");
log_map_crash_data(stored_report, " stored_report");
}
+ free_crash_data(stored_report);
+#define stored_report stored_report_must_not_be_used_below
#define client_report client_report_must_not_be_used_below
// Export overridden settings as environment variables
@@ -409,6 +415,7 @@ report_status_t Report(const map_crash_d
}
return ret;
+#undef stored_report
#undef client_report
}
@@ -489,8 +496,7 @@ static char *do_log(char *log_line, void
return log_line;
}
-mw_result_t LoadDebugDump(const char *dump_dir_name,
- map_crash_data_t& pCrashData)
+mw_result_t LoadDebugDump(const char *dump_dir_name, crash_data_t **crash_data)
{
mw_result_t res;
@@ -546,7 +552,7 @@ mw_result_t LoadDebugDump(const char *du
dump_dir_name = state.crash_dump_dup_name;
}
- /* Loads pCrashData (from the *first debugdump dir* if this one is a dup)
+ /* Loads crash_data (from the *first debugdump dir* if this one is a dup)
* Returns:
* MW_OCCURRED: "crash count is != 1" (iow: it is > 1 - dup)
* MW_OK: "crash count is 1" (iow: this is a new crash, not a dup)
@@ -567,9 +573,10 @@ mw_result_t LoadDebugDump(const char *du
dd_save_text(dd, FILENAME_COUNT, new_count_str);
dd_close(dd);
- res = FillCrashInfo(dump_dir_name, pCrashData);
- if (res == MW_OK)
+ *crash_data = FillCrashInfo(dump_dir_name);
+ if (*crash_data != NULL)
{
+ res = MW_OK;
if (count > 1)
{
log("Crash dump is a duplicate of %s", dump_dir_name);
@@ -587,28 +594,27 @@ mw_result_t LoadDebugDump(const char *du
return res;
}
-static mw_result_t FillCrashInfo(const char *dump_dir_name,
- map_crash_data_t& pCrashData)
+static crash_data_t *FillCrashInfo(const char *dump_dir_name)
{
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
- return MW_ERROR;
+ return NULL;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
char *events = list_possible_events(dd, NULL, "");
dd_close(dd);
- add_to_crash_data_ext(pCrashData, CD_EVENTS, CD_SYS, CD_ISNOTEDITABLE, events);
+ add_to_crash_data_ext(crash_data, CD_EVENTS, events, CD_FLAG_SYS + CD_FLAG_ISNOTEDITABLE);
free(events);
- add_to_crash_data_ext(pCrashData, CD_DUMPDIR, CD_SYS, CD_ISNOTEDITABLE, dump_dir_name);
+ add_to_crash_data_ext(crash_data, CD_DUMPDIR, dump_dir_name, CD_FLAG_SYS + CD_FLAG_ISNOTEDITABLE);
- return MW_OK;
+ return crash_data;
}
-vector_map_crash_data_t GetCrashInfos(long caller_uid)
+vector_of_crash_data_t *GetCrashInfos(long caller_uid)
{
- vector_map_crash_data_t retval;
+ vector_of_crash_data_t *retval = new_vector_of_crash_data();
log("Getting crash infos...");
DIR *dir = opendir(DEBUG_DUMPS_DIR);
@@ -658,19 +664,15 @@ vector_map_crash_data_t GetCrashInfos(lo
}
{
- map_crash_data_t info;
- mw_result_t res = FillCrashInfo(dump_dir_name, info);
- switch (res)
+ crash_data_t *crash_data = FillCrashInfo(dump_dir_name);
+ if (!crash_data)
{
- case MW_OK:
- retval.push_back(info);
- break;
- case MW_ERROR:
- error_msg("Dump directory %s doesn't exist or misses crucial files, deleting", dump_dir_name);
- delete_crash_dump_dir(dump_dir_name);
- break;
- default:
- break;
+ error_msg("Dump directory %s doesn't exist or misses crucial files, deleting", dump_dir_name);
+ delete_crash_dump_dir(dump_dir_name);
+ }
+ else
+ {
+ g_ptr_array_add(retval, crash_data);
}
}
next:
@@ -695,14 +697,14 @@ vector_map_crash_data_t GetCrashInfos(lo
* StartJob dbus call already did all the processing, and we just retrieve
* the result from dump directory, which is fast.
*/
-void CreateReport(const char* crash_id, long caller_uid, int force, map_crash_data_t& crashReport)
+void CreateReport(const char* crash_id, long caller_uid, int force, crash_data_t **crash_data)
{
/* FIXME: starting from here, any shared data must be protected with a mutex. */
- mw_result_t res = CreateCrashReport(crash_id, caller_uid, force, crashReport);
+ mw_result_t res = CreateCrashReport(crash_id, caller_uid, force, crash_data);
switch (res)
{
case MW_OK:
- VERB2 log_map_crash_data(crashReport, "crashReport");
+ VERB2 log_map_crash_data(*crash_data, "crashReport");
break;
case MW_NOENT_ERROR:
error_msg("Can't find crash with id '%s'", crash_id);
@@ -737,8 +739,8 @@ static void* create_report(void* arg)
try
{
log("Creating report...");
- map_crash_data_t crashReport;
- CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, crashReport);
+ crash_data_t *crash_data = NULL;
+ CreateReport(thread_data->crash_id, thread_data->caller_uid, thread_data->force, &crash_data);
g_pCommLayer->JobDone(thread_data->peer);
}
catch (CABRTException& e)
diff -x '*.po' -d -urpN abrt.5/src/daemon/MiddleWare.h abrt.6/src/daemon/MiddleWare.h
--- abrt.5/src/daemon/MiddleWare.h 2010-12-02 08:06:55.839336168 +0100
+++ abrt.6/src/daemon/MiddleWare.h 2010-12-03 12:52:34.624912221 +0100
@@ -71,7 +71,7 @@ void RunAction(const char *pActionDir,
* @return
* A report status, which reporters ends successfuly with messages.
*/
-report_status_t Report(const map_crash_data_t& crash_data,
+report_status_t Report(crash_data_t *crash_data,
const vector_string_t& events,
const map_map_string_t& settings,
long caller_uid);
@@ -83,12 +83,11 @@ report_status_t Report(const map_crash_d
* @param pCrashData A crash info.
* @return It return results of operation. See mw_result_t.
*/
-mw_result_t LoadDebugDump(const char *dump_dir_name,
- map_crash_data_t& pCrashData);
+mw_result_t LoadDebugDump(const char *dump_dir_name, crash_data_t **crash_data);
-vector_map_crash_data_t GetCrashInfos(long caller_uid);
+vector_of_crash_data_t *GetCrashInfos(long caller_uid);
int CreateReportThread(const char* dump_dir_name, long caller_uid, int force, const char* pSender);
-void CreateReport(const char* dump_dir_name, long caller_uid, int force, map_crash_data_t&);
+void CreateReport(const char* dump_dir_name, long caller_uid, int force, crash_data_t **crash_data);
int DeleteDebugDump(const char *dump_dir_name, long caller_uid);
void GetPluginsInfo(map_map_string_t &map_of_plugin_info);
diff -x '*.po' -d -urpN abrt.5/src/hooks/Makefile.am abrt.6/src/hooks/Makefile.am
--- abrt.5/src/hooks/Makefile.am 2010-11-26 13:20:34.000000000 +0100
+++ abrt.6/src/hooks/Makefile.am 2010-12-03 13:57:10.535752736 +0100
@@ -10,6 +10,7 @@ abrt_hook_ccpp_CPPFLAGS = \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE
abrt_hook_ccpp_LDADD = \
../lib/libabrt.la
@@ -31,8 +32,7 @@ dumpoops_CPPFLAGS = \
# build will succeed, but at runtime plugins do need ABRT*d*Utils
dumpoops_LDADD = \
../lib/libabrt_daemon.la \
- ../lib/libabrt.la \
- $(GLIB_FLAGS)
+ ../lib/libabrt.la
python_PYTHON = abrt.pth abrt_exception_handler.py
EXTRA_DIST = abrt_exception_handler.py.in $(man_MANS)
diff -x '*.po' -d -urpN abrt.5/src/include/abrt_crash_dump.h abrt.6/src/include/abrt_crash_dump.h
--- abrt.5/src/include/abrt_crash_dump.h 2010-12-01 17:39:43.000000000 +0100
+++ abrt.6/src/include/abrt_crash_dump.h 2010-12-03 12:54:00.017147801 +0100
@@ -77,18 +77,10 @@ extern "C" {
bool is_editable_file(const char *file_name);
+void log_map_crash_data(crash_data_t *crash_data, const char *pfx);
+
#ifdef __cplusplus
}
#endif
-
-#ifdef __cplusplus
-
-typedef std::vector<map_crash_data_t> vector_map_crash_data_t;
-
-void log_map_crash_data(const map_crash_data_t& data, const char *name);
-
-#endif /* __cplusplus */
-
-
#endif
diff -x '*.po' -d -urpN abrt.5/src/include/abrtlib.h abrt.6/src/include/abrtlib.h
--- abrt.5/src/include/abrtlib.h 2010-12-01 17:39:43.000000000 +0100
+++ abrt.6/src/include/abrtlib.h 2010-12-03 12:54:04.528897804 +0100
@@ -237,10 +237,10 @@ std::string to_string(T x)
void parse_args(const char *psArgs, vector_string_t& pArgs, int quote = -1);
void parse_release(const char *pRelease, char **product, char **version);
-char* make_description_bz(const map_crash_data_t& pCrashData);
-char* make_description_reproduce_comment(const map_crash_data_t& pCrashData);
-char* make_description_logger(const map_crash_data_t& pCrashData);
-char* make_description_mailx(const map_crash_data_t& pCrashData);
+char* make_description_bz(crash_data_t *crash_data);
+char* make_description_reproduce_comment(crash_data_t *crash_data);
+char* make_description_logger(crash_data_t *crash_data);
+char* make_description_mailx(crash_data_t *crash_data);
/**
* Loads settings and stores it in second parameter. On success it
diff -x '*.po' -d -urpN abrt.5/src/include/crash_dump.h abrt.6/src/include/crash_dump.h
--- abrt.5/src/include/crash_dump.h 2010-12-01 17:39:43.000000000 +0100
+++ abrt.6/src/include/crash_dump.h 2010-12-03 18:55:40.296268689 +0100
@@ -19,54 +19,82 @@
#ifndef CRASH_DUMP_H_
#define CRASH_DUMP_H_
+#include <glib.h>
-// Crash data is a map of 3-element vectors of strings: type, editable, content
-#define CD_TYPE 0
-#define CD_EDITABLE 1
-#define CD_CONTENT 2
-
-// SYS - system value, should not be displayed
-// BIN - binary data
-// TXT - text data, can be displayed
-#define CD_SYS "s"
-#define CD_BIN "b"
-#define CD_TXT "t"
-
-#define CD_ISEDITABLE "y"
-#define CD_ISNOTEDITABLE "n"
+#ifdef __cplusplus
+extern "C" {
+#endif
struct dump_dir;
-#ifdef __cplusplus
+enum {
+ CD_FLAG_SYS = (1 << 0),
+ CD_FLAG_BIN = (1 << 1),
+ CD_FLAG_TXT = (1 << 2),
+ CD_FLAG_ISEDITABLE = (1 << 3),
+ CD_FLAG_ISNOTEDITABLE = (1 << 4),
+};
-#include <map>
-#include <vector>
-#include <string>
+struct crash_item {
+ char *content;
+ unsigned flags;
+};
+typedef struct crash_item crash_item;
/* In-memory crash data structure and accessors */
-typedef std::map<std::string, std::vector<std::string> > map_crash_data_t;
+typedef GHashTable crash_data_t;
-void add_to_crash_data_ext(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pType,
- const char *pEditable,
- const char *pContent);
-/* Uses type:CD_TXT, editable:CD_ISNOTEDITABLE */
-void add_to_crash_data(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pContent);
+crash_data_t *new_crash_data(void);
-const char *get_crash_data_item_content_or_NULL(const map_crash_data_t& crash_data, const char *key);
+static inline void free_crash_data(crash_data_t *crash_data)
+{
+ if (crash_data)
+ g_hash_table_destroy(crash_data);
+}
+
+void add_to_crash_data_ext(crash_data_t *crash_data,
+ const char *name,
+ const char *content,
+ unsigned flags);
+/* Uses CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE flags */
+void add_to_crash_data(crash_data_t *crash_data,
+ const char *name,
+ const char *content);
+
+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);
+}
+const char *get_crash_data_item_content_or_NULL(crash_data_t *crash_data, const char *key);
/* Aborts if key is not found: */
-const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key);
+const char *get_crash_data_item_content(crash_data_t *crash_data, const char *key);
+
+
+/* Vector of these structures */
+
+typedef GPtrArray vector_of_crash_data_t;
+
+static inline crash_data_t *get_crash_data(vector_of_crash_data_t *vector, unsigned i)
+{
+ return (crash_data_t *)g_ptr_array_index(vector, i);
+}
+
+vector_of_crash_data_t *new_vector_of_crash_data(void);
+static inline void free_vector_of_crash_data(vector_of_crash_data_t *vector)
+{
+ if (vector)
+ g_ptr_array_free(vector, TRUE);
+}
/* Conversions between in-memory and on-disk formats */
-void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t& data);
-struct dump_dir *create_crash_dump_dir(const map_crash_data_t& crash_data);
+crash_data_t *load_crash_data_from_crash_dump_dir(struct dump_dir *dd);
+struct dump_dir *create_crash_dump_dir(crash_data_t *crash_data);
+#ifdef __cplusplus
+}
#endif
#endif
diff -x '*.po' -d -urpN abrt.5/src/lib/abrt_dbus.c abrt.6/src/lib/abrt_dbus.c
--- abrt.5/src/lib/abrt_dbus.c 2010-11-10 00:12:48.000000000 +0100
+++ abrt.6/src/lib/abrt_dbus.c 2010-12-03 18:52:37.978268460 +0100
@@ -156,6 +156,70 @@ void store_string(DBusMessageIter* iter,
free((char*)sanitized);
}
+/* Helpers for storing crash_data */
+
+static void store_crash_item(DBusMessageIter* iter, struct crash_item *val)
+{
+ DBusMessageIter sub_iter;
+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "s", &sub_iter))
+ die_out_of_memory();
+
+ /* Compat with python/cli:
+ * Crash item is represented in dbus as 3-element vector of strings:
+ * type, editable, content.
+ * This doesn't match daemon-side representation: { content, flags } struct
+ */
+ store_string(&sub_iter, (val->flags & CD_FLAG_SYS ? "s" : (val->flags & CD_FLAG_BIN ? "b" : "t")));
+ store_string(&sub_iter, (val->flags & CD_FLAG_ISEDITABLE ? "y" : "n"));
+ store_string(&sub_iter, val->content);
+
+ if (!dbus_message_iter_close_container(iter, &sub_iter))
+ die_out_of_memory();
+}
+void store_crash_data(DBusMessageIter* dbus_iter, crash_data_t *val)
+{
+ DBusMessageIter sub_iter;
+ /* crash_data is a map. map in dbus is an array of two element structs "({...})":
+ * "s" (string) for key and "as" for value (in this case, array of strings) */
+ if (!dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY, "{sas}", &sub_iter))
+ die_out_of_memory();
+
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, val);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
+ {
+ DBusMessageIter sub_sub_iter;
+ if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter))
+ die_out_of_memory();
+ store_string(&sub_sub_iter, name);
+ store_crash_item(&sub_sub_iter, value);
+ if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter))
+ die_out_of_memory();
+ }
+
+ if (!dbus_message_iter_close_container(dbus_iter, &sub_iter))
+ die_out_of_memory();
+}
+void store_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t *val)
+{
+ DBusMessageIter sub_iter;
+ /* "array of maps". map in dbus is an array ("a") of two element structs "({...})":
+ * "s" (string) for key and "as" for value (in this case, array of strings) */
+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "a{sas}", &sub_iter))
+ die_out_of_memory();
+
+ for (unsigned i = 0; i < val->len; i++)
+ {
+ crash_data_t *crash_data = get_crash_data(val, i);
+ store_crash_data(&sub_iter, crash_data);
+ }
+
+ if (!dbus_message_iter_close_container(iter, &sub_iter))
+ die_out_of_memory();
+}
+
/*
* Helpers for parsing DBus messages
@@ -217,6 +281,8 @@ int load_uint64(DBusMessageIter* iter, u
}
int load_charp(DBusMessageIter* iter, const char** val)
{
+ *val = NULL;
+
int type = dbus_message_iter_get_arg_type(iter);
if (type != DBUS_TYPE_STRING)
{
@@ -228,6 +294,158 @@ int load_charp(DBusMessageIter* iter, co
return dbus_message_iter_next(iter);
}
+/* Helpers for loading crash_data */
+
+static int load_crash_item(DBusMessageIter* iter, struct crash_item *item)
+{
+ int type = dbus_message_iter_get_arg_type(iter);
+ if (type != DBUS_TYPE_ARRAY)
+ {
+ error_msg("array expected in dbus message, but not found ('%c')", type);
+ return -1;
+ }
+
+ /* Compat with python/cli:
+ * Crash item is represented in dbus as 3-element vector of strings:
+ * type, editable, content.
+ * This doesn't match daemon-side representation: { content, flags } struct
+ */
+
+ DBusMessageIter sub_iter;
+ dbus_message_iter_recurse(iter, &sub_iter);
+
+ const char *typestr;
+ int r = load_charp(&sub_iter, &typestr);
+ if (r != ABRT_DBUS_MORE_FIELDS)
+ {
+ error_msg("malformed crash_item element in dbus message");
+ return -1;
+ }
+ const char *editable;
+ r = load_charp(&sub_iter, &editable);
+ if (r != ABRT_DBUS_MORE_FIELDS)
+ {
+ error_msg("malformed crash_item element in dbus message");
+ return -1;
+ }
+ const char *content;
+ r = load_charp(&sub_iter, &content);
+ if (r != ABRT_DBUS_LAST_FIELD)
+ {
+ error_msg("malformed crash_item element in dbus message");
+ return -1;
+ }
+ item->flags = 0;
+ if (typestr[0] == 's') item->flags |= CD_FLAG_SYS;
+ if (typestr[0] == 'b') item->flags |= CD_FLAG_BIN;
+ if (typestr[0] == 't') item->flags |= CD_FLAG_TXT;
+ if (editable[0] == 'y') item->flags |= CD_FLAG_ISEDITABLE;
+ if (editable[0] == 'n') item->flags |= CD_FLAG_ISNOTEDITABLE;
+ item->content = xstrdup(content);
+ return 0;
+}
+int load_crash_data(DBusMessageIter* iter, crash_data_t **val)
+{
+ *val = NULL;
+
+ int type = dbus_message_iter_get_arg_type(iter);
+ if (type != DBUS_TYPE_ARRAY)
+ {
+ error_msg("array expected in dbus message, but not found ('%c')", type);
+ return -1;
+ }
+
+ crash_data_t *result = new_crash_data();
+
+ DBusMessageIter sub_iter;
+ dbus_message_iter_recurse(iter, &sub_iter);
+
+ bool next_exists;
+ int r;
+//int cnt = 0;
+ do {
+ type = dbus_message_iter_get_arg_type(&sub_iter);
+ if (type != DBUS_TYPE_DICT_ENTRY)
+ {
+ /* When the map has 0 elements, we see DBUS_TYPE_INVALID (on the first iteration) */
+ if (type == DBUS_TYPE_INVALID)
+ break;
+ error_msg("sub_iter type is not DBUS_TYPE_DICT_ENTRY (%c)!", type);
+ free_crash_data(result);
+ return -1;
+ }
+
+ DBusMessageIter sub_sub_iter;
+ dbus_message_iter_recurse(&sub_iter, &sub_sub_iter);
+
+ const char *key;
+ r = load_charp(&sub_sub_iter, &key);
+ if (r != ABRT_DBUS_MORE_FIELDS)
+ {
+ if (r == ABRT_DBUS_LAST_FIELD)
+ error_msg("malformed map element in dbus message");
+ free_crash_data(result);
+ return -1;
+ }
+ struct crash_item *value = xzalloc(sizeof(*value));
+ r = load_crash_item(&sub_sub_iter, value);
+ if (r != ABRT_DBUS_LAST_FIELD)
+ {
+ if (r == ABRT_DBUS_MORE_FIELDS)
+ error_msg("malformed map element in dbus message");
+ free(value);
+ free_crash_data(result);
+ return -1;
+ }
+ g_hash_table_replace(result, xstrdup(key), value);
+//cnt++;
+ next_exists = dbus_message_iter_next(&sub_iter);
+ } while (next_exists);
+//log("%s: %d elems", __func__, cnt);
+
+ *val = result;
+ return dbus_message_iter_next(iter); /* note: this can't fail (returns bool, thus never < 0) */
+}
+int load_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t **val)
+{
+ *val = NULL;
+
+ int type = dbus_message_iter_get_arg_type(iter);
+ if (type != DBUS_TYPE_ARRAY)
+ {
+ error_msg("array expected in dbus message, but not found ('%c')", type);
+ return -1;
+ }
+
+ DBusMessageIter sub_iter;
+ dbus_message_iter_recurse(iter, &sub_iter);
+
+ vector_of_crash_data_t *result = new_vector_of_crash_data();
+
+ int r;
+//int cnt = 0;
+ /* When the vector has 0 elements, we see DBUS_TYPE_INVALID here */
+ type = dbus_message_iter_get_arg_type(&sub_iter);
+ if (type != DBUS_TYPE_INVALID)
+ {
+ do {
+ crash_data_t *cd = NULL;
+//cnt++;
+ r = load_crash_data(&sub_iter, &cd);
+ if (r < 0)
+ {
+ free_vector_of_crash_data(result);
+ return r;
+ }
+ g_ptr_array_add(result, cd);
+ } while (r == ABRT_DBUS_MORE_FIELDS);
+ }
+//log("%s: %d elems", __func__, cnt);
+
+ *val = result;
+ return dbus_message_iter_next(iter); /* note: this can't fail (returns bool, thus never < 0) */
+}
+
/*
* Glib integration machinery
diff -x '*.po' -d -urpN abrt.5/src/lib/abrt_dbus.h abrt.6/src/lib/abrt_dbus.h
--- abrt.5/src/lib/abrt_dbus.h 2010-12-01 16:45:33.000000000 +0100
+++ abrt.6/src/lib/abrt_dbus.h 2010-12-03 16:01:43.871804759 +0100
@@ -83,6 +83,8 @@ void store_uint32(DBusMessageIter* iter,
void store_int64(DBusMessageIter* iter, int64_t val);
void store_uint64(DBusMessageIter* iter, uint64_t val);
void store_string(DBusMessageIter* iter, const char* val);
+void store_crash_data(DBusMessageIter* iter, crash_data_t *val);
+void store_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t *val);
/*
* Helpers for parsing DBus messages
@@ -104,6 +106,8 @@ int load_uint32(DBusMessageIter* iter, u
int load_int64(DBusMessageIter* iter, int64_t *val);
int load_uint64(DBusMessageIter* iter, uint64_t *val);
int load_charp(DBusMessageIter* iter, const char **val);
+int load_crash_data(DBusMessageIter* iter, crash_data_t **val);
+int load_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t **val);
#ifdef __cplusplus
}
diff -x '*.po' -d -urpN abrt.5/src/lib/crash_dump.cpp abrt.6/src/lib/crash_dump.cpp
--- abrt.5/src/lib/crash_dump.cpp 2010-12-01 17:39:43.000000000 +0100
+++ abrt.6/src/lib/crash_dump.cpp 2010-12-03 13:41:23.946503762 +0100
@@ -19,6 +19,70 @@
#include "abrtlib.h"
#include "abrt_crash_dump.h"
+static void free_crash_item(void *ptr)
+{
+ if (ptr)
+ {
+ struct crash_item *item = (struct crash_item *)ptr;
+ free(item->content);
+ free(item);
+ }
+}
+
+
+/* crash_data["name"] = { "content", CD_FLAG_foo_bits } */
+
+crash_data_t *new_crash_data(void)
+{
+ return g_hash_table_new_full(g_str_hash, g_str_equal,
+ free, free_crash_item);
+}
+
+void add_to_crash_data_ext(crash_data_t *crash_data,
+ const char *name,
+ const char *content,
+ unsigned flags)
+{
+ struct crash_item *item = (struct crash_item *)xzalloc(sizeof(*item));
+ item->content = xstrdup(content);
+ item->flags = flags;
+ g_hash_table_replace(crash_data, xstrdup(name), item);
+}
+
+void add_to_crash_data(crash_data_t *crash_data,
+ const char *name,
+ const char *content)
+{
+ add_to_crash_data_ext(crash_data, name, content, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE);
+}
+
+const char *get_crash_data_item_content(crash_data_t *crash_data, const char *key)
+{
+ struct crash_item *item = get_crash_data_item_or_NULL(crash_data, key);
+ if (!item)
+ error_msg_and_die("Error accessing crash data: no ['%s']", key);
+ return item->content;
+}
+
+const char *get_crash_data_item_content_or_NULL(crash_data_t *crash_data, const char *key)
+{
+ struct crash_item *item = get_crash_data_item_or_NULL(crash_data, key);
+ if (!item)
+ return NULL;
+ return item->content;
+}
+
+
+/* crash_data_vector[i] = { "name" = { "content", CD_FLAG_foo_bits } } */
+
+vector_of_crash_data_t *new_vector_of_crash_data(void)
+{
+ return g_ptr_array_new_with_free_func((void (*)(void*)) &free_crash_data);
+}
+
+
+/* Miscellaneous helpers */
+
static const char *const editable_files[] = {
FILENAME_DESCRIPTION,
FILENAME_COMMENT ,
@@ -42,36 +106,6 @@ bool is_editable_file(const char *file_n
return is_editable(file_name, editable_files);
}
-
-void add_to_crash_data_ext(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pType,
- const char *pEditable,
- const char *pContent)
-{
- map_crash_data_t::iterator it = pCrashData.find(pItem);
- if (it == pCrashData.end()) {
- vector_string_t& v = pCrashData[pItem]; /* create empty vector */
- v.push_back(pType);
- v.push_back(pEditable);
- v.push_back(pContent);
- return;
- }
- vector_string_t& v = it->second;
- while (v.size() < 3)
- v.push_back("");
- v[CD_TYPE] = pType;
- v[CD_EDITABLE] = pEditable;
- v[CD_CONTENT] = pContent;
-}
-
-void add_to_crash_data(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pContent)
-{
- add_to_crash_data_ext(pCrashData, pItem, CD_TXT, CD_ISNOTEDITABLE, pContent);
-}
-
static char* is_text_file(const char *name, ssize_t *sz)
{
/* We were using magic.h API to check for file being text, but it thinks
@@ -146,10 +180,11 @@ static char* is_text_file(const char *na
return NULL; /* it's binary */
}
-void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t& data)
+crash_data_t *load_crash_data_from_crash_dump_dir(struct dump_dir *dd)
{
char *short_name;
char *full_name;
+ crash_data_t *crash_data = new_crash_data();
dd_init_next_file(dd);
while (dd_get_next_file(dd, &short_name, &full_name))
@@ -163,11 +198,10 @@ void load_crash_data_from_crash_dump_dir
text = is_text_file(full_name, &sz);
if (!text)
{
- add_to_crash_data_ext(data,
+ add_to_crash_data_ext(crash_data,
short_name,
- CD_BIN,
- CD_ISNOTEDITABLE,
- full_name
+ full_name,
+ CD_FLAG_BIN + CD_FLAG_ISNOTEDITABLE
);
free(short_name);
@@ -183,62 +217,30 @@ void load_crash_data_from_crash_dump_dir
content = dd_load_text(dd, short_name);
free(text);
- add_to_crash_data_ext(data,
+ add_to_crash_data_ext(crash_data,
short_name,
- CD_TXT,
- editable ? CD_ISEDITABLE : CD_ISNOTEDITABLE,
- content
+ content,
+ (editable ? CD_FLAG_TXT + CD_FLAG_ISEDITABLE : CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE)
);
free(short_name);
free(full_name);
free(content);
}
+ return crash_data;
}
-static const std::string* helper_get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key)
-{
- map_crash_data_t::const_iterator it = crash_data.find(key);
- if (it == crash_data.end()) {
- return NULL;
- }
- if (it->second.size() <= CD_CONTENT) {
- return NULL;
- }
- return &it->second[CD_CONTENT];
-}
-
-const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key)
-{
- const std::string* sp = helper_get_crash_data_item_content(crash_data, key);
- if (sp == NULL) {
- if (crash_data.find(key) == crash_data.end())
- error_msg_and_die("Error accessing crash data: no ['%s']", key);
- error_msg_and_die("Error accessing crash data: no ['%s'][%d]", key, CD_CONTENT);
- }
- return *sp;
-}
-
-const char *get_crash_data_item_content_or_NULL(const map_crash_data_t& crash_data, const char *key)
-{
- const std::string* sp = helper_get_crash_data_item_content(crash_data, key);
- if (!sp) {
- return NULL;
- }
- return sp->c_str();
-}
-
-void log_map_crash_data(const map_crash_data_t& data, const char *name)
+void log_map_crash_data(crash_data_t *crash_data, const char *pfx)
{
- map_crash_data_t::const_iterator it = data.begin();
- while (it != data.end())
- {
- ssize_t sz = it->second.size();
- log("%s[%s]:%s/%s/'%.20s'",
- name, it->first.c_str(),
- sz > 0 ? it->second[0].c_str() : "<NO [0]>",
- sz > 1 ? it->second[1].c_str() : "<NO [1]>",
- sz > 2 ? it->second[2].c_str() : "<NO [2]>"
- );
- it++;
- }
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
+ {
+ log("%s[%s]:'%s' 0x%x",
+ pfx, name,
+ value->content,
+ value->flags
+ );
+ }
}
diff -x '*.po' -d -urpN abrt.5/src/lib/create_crash_dump_dir.cpp abrt.6/src/lib/create_crash_dump_dir.cpp
--- abrt.5/src/lib/create_crash_dump_dir.cpp 2010-12-01 17:39:43.000000000 +0100
+++ abrt.6/src/lib/create_crash_dump_dir.cpp 2010-12-03 13:41:23.947503614 +0100
@@ -21,7 +21,7 @@
using namespace std;
-struct dump_dir *create_crash_dump_dir(const map_crash_data_t& crash_data)
+struct dump_dir *create_crash_dump_dir(crash_data_t *crash_data)
{
char *path = xasprintf(LOCALSTATEDIR"/run/abrt/tmp-%lu-%lu", (long)getpid(), (long)time(NULL));
struct dump_dir *dd = dd_create(path, getuid());
@@ -29,28 +29,24 @@ struct dump_dir *create_crash_dump_dir(c
if (!dd)
return NULL;
- map_crash_data_t::const_iterator its = crash_data.begin();
- while (its != crash_data.end())
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- const char *name, *value;
- name = its->first.c_str();
-
if (name[0] == '.' || strchr(name, '/'))
{
error_msg("Crash data field name contains disallowed chars: '%s'", name);
goto next;
}
-//FIXME: what to do with CD_BINs??
- /* Fields: CD_TYPE (is CD_SYS, CD_BIN or CD_TXT),
- * CD_EDITABLE, CD_CONTENT */
- if (its->second[CD_TYPE] == CD_BIN)
+//FIXME: what to do with CD_FLAG_BINs??
+ if (value->flags & CD_FLAG_BIN)
goto next;
- value = its->second[CD_CONTENT].c_str();
- dd_save_text(dd, name, value);
- next:
- its++;
+ dd_save_text(dd, name, value->content);
+ next: ;
}
return dd;
diff -x '*.po' -d -urpN abrt.5/src/lib/make_descr.cpp abrt.6/src/lib/make_descr.cpp
--- abrt.5/src/lib/make_descr.cpp 2010-12-02 09:34:33.361972386 +0100
+++ abrt.6/src/lib/make_descr.cpp 2010-12-03 13:41:23.948503535 +0100
@@ -75,30 +75,32 @@ static const char *const blacklisted_ite
NULL
};
-char* make_description_mailx(const map_crash_data_t & crash_data)
+char* make_description_mailx(crash_data_t *crash_data)
{
struct strbuf *buf_dsc = strbuf_new();
struct strbuf *buf_additional_files = strbuf_new();
struct strbuf *buf_duphash_file = strbuf_new();
struct strbuf *buf_common_files = strbuf_new();
- map_crash_data_t::const_iterator it;
- for (it = crash_data.begin(); it != crash_data.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (it->second[CD_TYPE] == CD_TXT)
+ if (value->flags & CD_FLAG_TXT)
{
- const char *itemname = it->first.c_str();
- if ((strcmp(itemname, FILENAME_DUPHASH) != 0)
- && (strcmp(itemname, FILENAME_ARCHITECTURE) != 0)
- && (strcmp(itemname, FILENAME_KERNEL) != 0)
- && (strcmp(itemname, FILENAME_PACKAGE) != 0)
+ if ((strcmp(name, FILENAME_DUPHASH) != 0)
+ && (strcmp(name, FILENAME_ARCHITECTURE) != 0)
+ && (strcmp(name, FILENAME_KERNEL) != 0)
+ && (strcmp(name, FILENAME_PACKAGE) != 0)
) {
- strbuf_append_strf(buf_additional_files, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ strbuf_append_strf(buf_additional_files, "%s\n-----\n%s\n\n", name, value->content);
}
- else if (strcmp(itemname, FILENAME_DUPHASH) == 0)
- strbuf_append_strf(buf_duphash_file, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ else if (strcmp(name, FILENAME_DUPHASH) == 0)
+ strbuf_append_strf(buf_duphash_file, "%s\n-----\n%s\n\n", name, value->content);
else
- strbuf_append_strf(buf_common_files, "%s\n-----\n%s\n\n", itemname, it->second[CD_CONTENT].c_str());
+ strbuf_append_strf(buf_common_files, "%s\n-----\n%s\n\n", name, value->content);
}
}
@@ -117,24 +119,26 @@ char* make_description_mailx(const map_c
return strbuf_free_nobuf(buf_dsc);
}
-char* make_description_bz(const map_crash_data_t& pCrashData)
+char* make_description_bz(crash_data_t *crash_data)
{
struct strbuf *buf_dsc = strbuf_new();
struct strbuf *buf_long_dsc = strbuf_new();
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- const char *itemname = it->first.c_str();
- const char *type = it->second[CD_TYPE].c_str();
- const char *content = it->second[CD_CONTENT].c_str();
- if (strcmp(type, CD_TXT) == 0)
+ unsigned flags = value->flags;
+ const char *content = value->content;
+ if (flags & CD_FLAG_TXT)
{
/* Skip items we are not interested in */
const char *const *bl = blacklisted_items;
while (*bl)
{
- if (strcmp(itemname, *bl) == 0)
+ if (strcmp(name, *bl) == 0)
break;
bl++;
}
@@ -151,7 +155,7 @@ char* make_description_bz(const map_cras
add_content(&was_multiline,
&tmp,
/* "reproduce: blah" looks ugly, fixing: */
- (strcmp(itemname, FILENAME_REPRODUCE) == 0) ? "How to reproduce" : itemname,
+ (strcmp(name, FILENAME_REPRODUCE) == 0) ? "How to reproduce" : name,
content
);
@@ -170,7 +174,7 @@ char* make_description_bz(const map_cras
} else {
bool was_multiline = 0;
char *dsc = NULL;
- add_content(&was_multiline, &dsc, "Attached file", itemname);
+ add_content(&was_multiline, &dsc, "Attached file", name);
strbuf_append_str(buf_dsc, dsc);
free(dsc);
}
@@ -189,25 +193,25 @@ char* make_description_bz(const map_cras
return strbuf_free_nobuf(buf_dsc);
}
-char* make_description_logger(const map_crash_data_t& pCrashData)
+char* make_description_logger(crash_data_t *crash_data)
{
struct strbuf *buf_dsc = strbuf_new();
struct strbuf *buf_long_dsc = strbuf_new();
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- const char *filename = it->first.c_str();
- const char *type = it->second[CD_TYPE].c_str();
- const char *content = it->second[CD_CONTENT].c_str();
- if ((strcmp(type, CD_TXT) == 0)
- || (strcmp(type, CD_BIN) == 0)
- ) {
+ const char *content = value->content;
+ if (value->flags & (CD_FLAG_TXT|CD_FLAG_BIN))
+ {
/* Skip items we are not interested in */
const char *const *bl = blacklisted_items;
while (*bl)
{
- if (filename == *bl)
+ if (name == *bl)
break;
bl++;
}
@@ -218,7 +222,7 @@ char* make_description_logger(const map_
bool was_multiline = 0;
char *tmp = NULL;
- add_content(&was_multiline, &tmp, filename, content);
+ add_content(&was_multiline, &tmp, name, content);
if (was_multiline)
{
@@ -242,29 +246,27 @@ char* make_description_logger(const map_
return strbuf_free_nobuf(buf_dsc);
}
-char* make_description_reproduce_comment(const map_crash_data_t& pCrashData)
+char* make_description_reproduce_comment(crash_data_t *crash_data)
{
char *repro = NULL;
char *comment = NULL;
+ struct crash_item *value;
- map_crash_data_t::const_iterator end = pCrashData.end();
- map_crash_data_t::const_iterator it;
-
- it = pCrashData.find(FILENAME_REPRODUCE);
- if (it != end)
+ value = get_crash_data_item_or_NULL(crash_data, FILENAME_REPRODUCE);
+ if (value)
{
- if ((it->second[CD_CONTENT].size() > 0)
- && (it->second[CD_CONTENT] != "1.\n2.\n3.\n"))
- {
- repro = xasprintf("\n\nHow to reproduce\n-----\n%s", it->second[CD_CONTENT].c_str());
+ if (value->content[0]
+ && strcmp(value->content, "1.\n2.\n3.\n") != 0
+ ) {
+ repro = xasprintf("\n\nHow to reproduce\n-----\n%s", value->content);
}
}
- it = pCrashData.find(FILENAME_COMMENT);
- if (it != end)
+ value = get_crash_data_item_or_NULL(crash_data, FILENAME_COMMENT);
+ if (value)
{
- if (it->second[CD_CONTENT].size() > 0)
- comment = xasprintf("\n\nComment\n-----\n%s", it->second[CD_CONTENT].c_str());
+ if (value->content[0])
+ comment = xasprintf("\n\nComment\n-----\n%s", value->content);
}
if (!repro && !comment)
diff -x '*.po' -d -urpN abrt.5/src/lib/Makefile.am abrt.6/src/lib/Makefile.am
--- abrt.5/src/lib/Makefile.am 2010-12-01 17:39:43.000000000 +0100
+++ abrt.6/src/lib/Makefile.am 2010-12-03 13:44:27.661752841 +0100
@@ -91,10 +91,12 @@ libabrt_daemon_la_CPPFLAGS = \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE
libabrt_daemon_la_LDFLAGS = \
-version-info 0:1:0
libabrt_daemon_la_LIBADD = \
+ $(GLIB_LIBS) \
-ldl
libabrt_web_la_SOURCES = \
@@ -108,6 +110,7 @@ libabrt_web_la_CPPFLAGS = \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
-DCONF_DIR=\"$(CONF_DIR)\" \
-DVAR_RUN=\"$(VAR_RUN)\" \
+ $(GLIB_CFLAGS) \
$(CURL_CFLAGS) \
$(LIBXML_CFLAGS) \
$(XMLRPC_CFLAGS) $(XMLRPC_CLIENT_CFLAGS) \
@@ -115,6 +118,7 @@ libabrt_web_la_CPPFLAGS = \
libabrt_web_la_LDFLAGS = \
-version-info 0:1:0
libabrt_web_la_LIBADD = \
+ $(GLIB_LIBS) \
$(CURL_LIBS) \
$(LIBXML_LIBS) \
$(XMLRPC_LIBS) $(XMLRPC_CLIENT_LIBS)
diff -x '*.po' -d -urpN abrt.5/src/plugins/abrt-action-bugzilla.cpp abrt.6/src/plugins/abrt-action-bugzilla.cpp
--- abrt.5/src/plugins/abrt-action-bugzilla.cpp 2010-11-26 17:51:36.000000000 +0100
+++ abrt.6/src/plugins/abrt-action-bugzilla.cpp 2010-12-03 13:25:51.379087378 +0100
@@ -112,8 +112,8 @@ struct ctx: public abrt_xmlrpc_conn {
xmlrpc_int32 get_bug_dup_id(xmlrpc_value* result_xml);
void get_bug_cc(xmlrpc_value* result_xml, struct bug_info* bz);
int add_plus_one_cc(xmlrpc_int32 bug_id, const char* login);
- xmlrpc_int32 new_bug(const map_crash_data_t& pCrashData, int depend_on_bugno);
- int add_attachments(const char* bug_id_str, const map_crash_data_t& pCrashData);
+ xmlrpc_int32 new_bug(crash_data_t *crash_data, int depend_on_bugno);
+ int add_attachments(const char* bug_id_str, crash_data_t *crash_data);
int get_bug_info(struct bug_info* bz, xmlrpc_int32 bug_id);
int add_comment(xmlrpc_int32 bug_id, const char* comment, bool is_private);
@@ -442,17 +442,17 @@ static const char *tainted_string(unsign
return taint_warnings[idx];
}
-xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData, int depend_on_bugno)
+xmlrpc_int32 ctx::new_bug(crash_data_t *crash_data, int depend_on_bugno)
{
- const char *package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
- const char *component = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_COMPONENT);
- const char *release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
- const char *arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
- const char *duphash = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_DUPHASH);
- const char *reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
- const char *function = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_CRASH_FUNCTION);
- const char *analyzer = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ANALYZER);
- const char *tainted_str = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_TAINTED);
+ const char *package = get_crash_data_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
+ const char *component = get_crash_data_item_content_or_NULL(crash_data, FILENAME_COMPONENT);
+ const char *release = get_crash_data_item_content_or_NULL(crash_data, FILENAME_RELEASE);
+ const char *arch = get_crash_data_item_content_or_NULL(crash_data, FILENAME_ARCHITECTURE);
+ const char *duphash = get_crash_data_item_content_or_NULL(crash_data, FILENAME_DUPHASH);
+ const char *reason = get_crash_data_item_content_or_NULL(crash_data, FILENAME_REASON);
+ const char *function = get_crash_data_item_content_or_NULL(crash_data, FILENAME_CRASH_FUNCTION);
+ const char *analyzer = get_crash_data_item_content_or_NULL(crash_data, FILENAME_ANALYZER);
+ const char *tainted_str = get_crash_data_item_content_or_NULL(crash_data, FILENAME_TAINTED);
struct strbuf *buf_summary = strbuf_new();
strbuf_append_strf(buf_summary, "[abrt] %s", package);
@@ -474,7 +474,7 @@ xmlrpc_int32 ctx::new_bug(const map_cras
char *status_whiteboard = xasprintf("abrt_hash:%s", duphash);
- char *bz_dsc = make_description_bz(pCrashData);
+ char *bz_dsc = make_description_bz(crash_data);
char *full_dsc = xasprintf("abrt version: "VERSION"\n%s", bz_dsc);
free(bz_dsc);
@@ -534,23 +534,24 @@ xmlrpc_int32 ctx::new_bug(const map_cras
return bug_id;
}
-int ctx::add_attachments(const char* bug_id_str, const map_crash_data_t& pCrashData)
+int ctx::add_attachments(const char* bug_id_str, crash_data_t *crash_data)
{
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- const char *itemname = it->first.c_str();
- const char *type = it->second[CD_TYPE].c_str();
- const char *content = it->second[CD_CONTENT].c_str();
+ const char *content = value->content;
- if ((strcmp(type, CD_TXT) == 0)
- && (strlen(content) > CD_TEXT_ATT_SIZE || (strcmp(itemname, FILENAME_BACKTRACE) == 0))
+ if ((value->flags & CD_FLAG_TXT)
+ && (strlen(content) > CD_TEXT_ATT_SIZE || (strcmp(name, FILENAME_BACKTRACE) == 0))
) {
char *encoded64 = encode_base64(content, strlen(content));
- char *filename = xasprintf("File: %s", itemname);
+ char *filename = xasprintf("File: %s", name);
xmlrpc_value* result = call("bugzilla.addAttachment", "(s{s:s,s:s,s:s,s:s})", bug_id_str,
"description", filename,
- "filename", itemname,
+ "filename", name,
"contenttype", "text/plain",
"data", encoded64
);
@@ -644,8 +645,7 @@ static void report_to_bugzilla(
{
throw CABRTException(EXCEP_PLUGIN, _("Can't open '%s'"), dump_dir_name);
}
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
dd_close(dd);
const char *env;
@@ -674,9 +674,9 @@ static void report_to_bugzilla(
env = getenv("Bugzilla_SSLVerify");
ssl_verify = string_to_bool(env ? env : settings["SSLVerify"].c_str());
- const char *component = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_COMPONENT);
- const char *duphash = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_DUPHASH);
- const char *release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
+ const char *component = get_crash_data_item_content_or_NULL(crash_data, FILENAME_COMPONENT);
+ const char *duphash = get_crash_data_item_content_or_NULL(crash_data, FILENAME_DUPHASH);
+ const char *release = get_crash_data_item_content_or_NULL(crash_data, FILENAME_RELEASE);
ctx bz_server(bugzilla_xmlrpc, ssl_verify);
@@ -773,7 +773,7 @@ static void report_to_bugzilla(
else if (all_bugs_size == 0) // Create new bug
{
log(_("Creating a new bug..."));
- bug_id = bz_server.new_bug(pCrashData, depend_on_bugno);
+ bug_id = bz_server.new_bug(crash_data, depend_on_bugno);
if (bug_id < 0)
{
throw_if_xml_fault_occurred(&bz_server.env);
@@ -781,7 +781,7 @@ static void report_to_bugzilla(
}
log("Adding attachments to bug %d...", bug_id);
- int ret = bz_server.add_attachments(to_string(bug_id).c_str(), pCrashData);
+ int ret = bz_server.add_attachments(to_string(bug_id).c_str(), crash_data);
if (ret == -1)
{
throw_if_xml_fault_occurred(&bz_server.env);
@@ -855,13 +855,13 @@ static void report_to_bugzilla(
throw_if_xml_fault_occurred(&bz_server.env);
}
- char *dsc = make_description_reproduce_comment(pCrashData);
+ char *dsc = make_description_reproduce_comment(crash_data);
if (dsc)
{
- const char* package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
- const char* release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
- const char* arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
- const char* is_private = get_crash_data_item_content_or_NULL(pCrashData, "is_private");
+ const char* package = get_crash_data_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
+ const char* release = get_crash_data_item_content_or_NULL(crash_data, FILENAME_RELEASE);
+ const char* arch = get_crash_data_item_content_or_NULL(crash_data, FILENAME_ARCHITECTURE);
+ const char* is_private = get_crash_data_item_content_or_NULL(crash_data, "is_private");
char *full_dsc = xasprintf("Package: %s\n"
"Architecture: %s\n"
@@ -895,6 +895,7 @@ static void report_to_bugzilla(
(int)bug_id
);
+ free_crash_data(crash_data);
bug_info_destroy(&bz);
}
diff -x '*.po' -d -urpN abrt.5/src/plugins/abrt-action-kerneloops.cpp abrt.6/src/plugins/abrt-action-kerneloops.cpp
--- abrt.5/src/plugins/abrt-action-kerneloops.cpp 2010-11-29 17:57:42.000000000 +0100
+++ abrt.6/src/plugins/abrt-action-kerneloops.cpp 2010-12-03 12:49:12.960621676 +0100
@@ -91,11 +91,10 @@ static void report_to_kerneloops(
if (!dd)
exit(1); /* error msg is already logged */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
dd_close(dd);
- const char *backtrace = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_BACKTRACE);
+ const char *backtrace = get_crash_data_item_content_or_NULL(crash_data, FILENAME_BACKTRACE);
if (!backtrace)
error_msg_and_die("Error sending kernel oops due to missing backtrace");
@@ -114,6 +113,8 @@ static void report_to_kerneloops(
if (ret != CURLE_OK)
error_msg_and_die("Kernel oops has not been sent due to %s", curl_easy_strerror(ret));
+ free_crash_data(crash_data);
+
/* Server replies with:
* 200 thank you for submitting the kernel oops information
* RemoteIP: 34192fd15e34bf60fac6a5f01bba04ddbd3f0558
diff -x '*.po' -d -urpN abrt.5/src/plugins/abrt-action-mailx.cpp abrt.6/src/plugins/abrt-action-mailx.cpp
--- abrt.5/src/plugins/abrt-action-mailx.cpp 2010-11-26 17:51:36.000000000 +0100
+++ abrt.6/src/plugins/abrt-action-mailx.cpp 2010-12-03 13:25:45.746087370 +0100
@@ -66,8 +66,7 @@ static void create_and_send_email(
if (!dd)
exit(1); /* error msg is already logged by dd_opendir */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
dd_close(dd);
char* env;
@@ -90,17 +89,20 @@ static void create_and_send_email(
unsigned arg_size = 0;
args = append_str_to_vector(args, arg_size, "/bin/mailx");
- char *dsc = make_description_mailx(pCrashData);
+ char *dsc = make_description_mailx(crash_data);
if (send_binary_data)
{
- map_crash_data_t::const_iterator it_cd;
- for (it_cd = pCrashData.begin(); it_cd != pCrashData.end(); it_cd++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (it_cd->second[CD_TYPE] == CD_BIN)
+ if (value->flags & CD_FLAG_BIN)
{
args = append_str_to_vector(args, arg_size, "-a");
- args = append_str_to_vector(args, arg_size, it_cd->second[CD_CONTENT].c_str());
+ args = append_str_to_vector(args, arg_size, value->content);
}
}
}
@@ -112,7 +114,7 @@ static void create_and_send_email(
args = append_str_to_vector(args, arg_size, email_to);
log(_("Sending an email..."));
- const char *uid_str = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_UID);
+ const char *uid_str = get_crash_data_item_content_or_NULL(crash_data, FILENAME_UID);
exec_and_feed_input(xatoi_u(uid_str), dsc, args);
free(dsc);
@@ -122,6 +124,8 @@ static void create_and_send_email(
args -= arg_size;
free(args);
+ free_crash_data(crash_data);
+
log("Email was sent to: %s", email_to);
}
diff -x '*.po' -d -urpN abrt.5/src/plugins/abrt-action-print.cpp abrt.6/src/plugins/abrt-action-print.cpp
--- abrt.5/src/plugins/abrt-action-print.cpp 2010-11-26 17:51:36.000000000 +0100
+++ abrt.6/src/plugins/abrt-action-print.cpp 2010-12-03 12:49:26.723622173 +0100
@@ -81,13 +81,13 @@ int main(int argc, char **argv)
if (!dd)
return 1; /* error message is already logged */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
dd_close(dd);
- char *dsc = make_description_logger(pCrashData);
+ char *dsc = make_description_logger(crash_data);
fputs(dsc, stdout);
free(dsc);
+ free_crash_data(crash_data);
}
catch (CABRTException& e)
{
diff -x '*.po' -d -urpN abrt.5/src/plugins/abrt-action-rhtsupport.cpp abrt.6/src/plugins/abrt-action-rhtsupport.cpp
--- abrt.5/src/plugins/abrt-action-rhtsupport.cpp 2010-11-26 17:51:36.000000000 +0100
+++ abrt.6/src/plugins/abrt-action-rhtsupport.cpp 2010-12-03 13:25:48.515337308 +0100
@@ -35,8 +35,7 @@ static void report_to_rhtsupport(
if (!dd)
exit(1); /* error msg is already logged by dd_opendir */
- map_crash_data_t pCrashData;
- load_crash_data_from_crash_dump_dir(dd, pCrashData);
+ crash_data_t *crash_data = load_crash_data_from_crash_dump_dir(dd);
dd_close(dd);
/* Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing */
@@ -79,9 +78,9 @@ static void report_to_rhtsupport(
goto ret;
}
- package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
- reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
- function = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_CRASH_FUNCTION);
+ package = get_crash_data_item_content_or_NULL(crash_data, FILENAME_PACKAGE);
+ reason = get_crash_data_item_content_or_NULL(crash_data, FILENAME_REASON);
+ function = get_crash_data_item_content_or_NULL(crash_data, FILENAME_CRASH_FUNCTION);
{
struct strbuf *buf_summary = strbuf_new();
@@ -92,7 +91,7 @@ static void report_to_rhtsupport(
strbuf_append_strf(buf_summary, ": %s", reason);
summary = strbuf_free_nobuf(buf_summary);
- char *bz_dsc = make_description_bz(pCrashData);
+ char *bz_dsc = make_description_bz(crash_data);
dsc = xasprintf("abrt version: "VERSION"\n%s", bz_dsc);
free(bz_dsc);
}
@@ -124,21 +123,24 @@ static void report_to_rhtsupport(
}
{
- map_crash_data_t::const_iterator it = pCrashData.begin();
- for (; it != pCrashData.end(); it++)
+ GHashTableIter iter;
+ char *name;
+ struct crash_item *value;
+ g_hash_table_iter_init(&iter, crash_data);
+ while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value))
{
- if (it->first == FILENAME_COUNT) continue;
- if (it->first == CD_DUMPDIR) continue;
- if (it->first == FILENAME_INFORMALL) continue;
- if (it->first == FILENAME_MESSAGE) continue; // plugin's status message (if we already reported it yesterday)
- if (it->first == FILENAME_DESCRIPTION) continue; // package description
+ if (strcmp(name, FILENAME_COUNT) == 0) continue;
+ if (strcmp(name, CD_DUMPDIR) == 0) continue;
+ if (strcmp(name, FILENAME_INFORMALL) == 0) continue;
+ if (strcmp(name, FILENAME_MESSAGE) == 0) continue; // plugin's status message (if we already reported it yesterday)
+ if (strcmp(name, FILENAME_DESCRIPTION) == 0) continue; // package description
- const char *content = it->second[CD_CONTENT].c_str();
- if (it->second[CD_TYPE] == CD_TXT)
+ const char *content = value->content;
+ if (value->flags & CD_FLAG_TXT)
{
- reportfile_add_binding_from_string(file, it->first.c_str(), content);
+ reportfile_add_binding_from_string(file, name, content);
}
- else if (it->second[CD_TYPE] == CD_BIN)
+ else if (value->flags & CD_FLAG_BIN)
{
const char *basename = strrchr(content, '/');
if (basename)
@@ -148,7 +150,7 @@ static void report_to_rhtsupport(
char *xml_name = concat_path_file("content", basename);
reportfile_add_binding_from_namedfile(file,
/*on_disk_filename */ content,
- /*binding_name */ it->first.c_str(),
+ /*binding_name */ name,
/*recorded_filename*/ xml_name,
/*binary */ 1);
if (tar_append_file(tar, (char*)content, xml_name) != 0)
@@ -248,6 +250,7 @@ static void report_to_rhtsupport(
free(url);
free(login);
free(password);
+ free_crash_data(crash_data);
if (errmsg)
error_msg_and_die("%s", errmsg);
diff -x '*.po' -d -urpN abrt.5/src/plugins/Makefile.am abrt.6/src/plugins/Makefile.am
--- abrt.5/src/plugins/Makefile.am 2010-11-29 17:57:42.000000000 +0100
+++ abrt.6/src/plugins/Makefile.am 2010-12-03 17:12:54.035865458 +0100
@@ -56,7 +56,8 @@ libCCpp_la_CPPFLAGS = -Wall -Werror \
-I$(UTILS_PATH) \
-DCCPP_HOOK_PATH=\"${libexecdir}/abrt-hook-ccpp\" \
-DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \
- -DLOCALSTATEDIR='"$(localstatedir)"'
+ -DLOCALSTATEDIR='"$(localstatedir)"' \
+ $(GLIB_CFLAGS)
# -DHOSTILE_KERNEL
# KerneloopsScanner
@@ -89,6 +90,7 @@ abrt_action_analyze_c_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_analyze_c_LDADD = \
@@ -107,6 +109,7 @@ abrt_action_analyze_python_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_analyze_python_LDADD = \
@@ -125,6 +128,7 @@ abrt_action_analyze_oops_CPPFLAGS = \
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_analyze_oops_LDADD = \
@@ -143,6 +147,7 @@ abrt_action_generate_backtrace_CPPFLAGS
-DDEBUG_INFO_DIR=\"$(DEBUG_INFO_DIR)\" \
-DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
+ $(GLIB_CFLAGS) \
-D_GNU_SOURCE \
-Wall -Werror
abrt_action_generate_backtrace_LDADD = \
13 years, 5 months
[PATCHv2] get_reporter_plugin_settings() returns GHashTable
by Nikola Pajkovsky
static void get_reporter_plugin_settings(const vector_string_t&
reporters, map_map_string_t &settings)
a new interface is
static GHashTable *get_reporter_plugin_settings(const vector_string_t&
reporters)
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/cli/dbus.cpp | 6 ++--
src/cli/dbus.h | 3 +-
src/cli/report.cpp | 61 +++++++++++++++++++++++++++++++++++----------------
src/lib/abrt_dbus.h | 29 ++++++++++++++++++++++++
4 files changed, 76 insertions(+), 23 deletions(-)
diff --git a/src/cli/dbus.cpp b/src/cli/dbus.cpp
index 7565d5b..f9271b8 100644
--- a/src/cli/dbus.cpp
+++ b/src/cli/dbus.cpp
@@ -161,7 +161,7 @@ map_crash_data_t call_CreateReport(const char* crash_id)
report_status_t call_Report(const map_crash_data_t& report,
const vector_string_t& reporters,
- const map_map_string_t &plugins)
+ GHashTable *plugins)
{
DBusMessage* msg = new_call_msg(__func__ + 5);
DBusMessageIter out_iter;
@@ -172,8 +172,8 @@ report_status_t call_Report(const map_crash_data_t& report,
/* parameter #2: reporters to use */
store_val(&out_iter, reporters);
/* parameter #3 (opt): plugin config */
- if (!plugins.empty())
- store_val(&out_iter, plugins);
+ if (g_hash_table_size(plugins))
+ store_hash_table_map_string_t(&out_iter, plugins);
DBusMessage *reply = send_get_reply_and_unref(msg);
diff --git a/src/cli/dbus.h b/src/cli/dbus.h
index 9c99c66..b837869 100644
--- a/src/cli/dbus.h
+++ b/src/cli/dbus.h
@@ -18,6 +18,7 @@
#ifndef ABRT_CLI_DBUS_H
#define ABRT_CLI_DBUS_H
+#include <glib.h>
#include "abrt_dbus.h"
#include "abrt_crash_dump.h"
@@ -41,7 +42,7 @@ map_crash_data_t call_CreateReport(const char *crash_id);
*/
report_status_t call_Report(const map_crash_data_t& report,
const vector_string_t& reporters,
- const map_map_string_t &plugins);
+ GHashTable *plugins);
int32_t call_DeleteDebugDump(const char* crash_id);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp
index 78a3891..f35d952 100644
--- a/src/cli/report.cpp
+++ b/src/cli/report.cpp
@@ -502,24 +502,41 @@ static bool set_echo(bool enabled)
return true;
}
+void hash_table_free_key(gpointer data)
+{
+ free(data);
+}
+
+void hash_table_free_value(gpointer data)
+{
+ delete (map_string_t *)data;
+}
+
/**
* Gets reporter plugin settings.
* @param reporters
* List of reporter names. Settings of these reporters are handled.
- * @param settings
+ * @return settings
* A structure filled with reporter plugin settings.
+ * It's GHashTable<char *, map_plugin_t *> and must be passed to
+ * g_hash_table_destroy();
*/
-static void get_reporter_plugin_settings(const vector_string_t& reporters,
- map_map_string_t &settings)
+static GHashTable *get_reporter_plugin_settings(const vector_string_t& reporters)
{
/* First of all, load system-wide report plugin settings. */
+ GHashTable *settings = g_hash_table_new_full(g_str_hash, g_str_equal,
+ hash_table_free_key,
+ hash_table_free_value);
+
for (vector_string_t::const_iterator it = reporters.begin(); it != reporters.end(); ++it)
{
- map_string_t single_plugin_settings = call_GetPluginSettings(it->c_str());
+ map_string_t *single_plugin_settings = new map_string_t;
+ *single_plugin_settings = call_GetPluginSettings(it->c_str());
+
// Copy the received settings as defaults.
// Plugins won't work without it, if some value is missing
// they use their default values for all fields.
- settings[it->c_str()] = single_plugin_settings;
+ g_hash_table_insert(settings, xstrdup(it->c_str()), (void*)single_plugin_settings);
}
/* Second, load user-specific settings, which override
@@ -528,24 +545,30 @@ static void get_reporter_plugin_settings(const vector_string_t& reporters,
const char* homedir = pw ? pw->pw_dir : NULL;
if (homedir)
{
- map_map_string_t::const_iterator itend = settings.end();
- for (map_map_string_t::iterator it = settings.begin(); it != itend; ++it)
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init (&iter, settings);
+ while (g_hash_table_iter_next (&iter, &key, &value))
{
map_string_t single_plugin_settings;
- std::string path = std::string(homedir) + "/.abrt/"
- + it->first + ".conf";
+
+ char *path = xasprintf("%s/.abrt/%s.conf", homedir, (char *)key);
+
/* Load plugin config in the home dir. Do not skip lines with empty value (but containing a "key="),
because user may want to override password from /etc/abrt/plugins/*.conf, but he prefers to
enter it every time he reports. */
- bool success = LoadPluginSettings(path.c_str(), single_plugin_settings, false);
+ bool success = LoadPluginSettings(path, single_plugin_settings, false);
+ free(path);
if (!success)
continue;
// Merge user's plugin settings into already loaded settings.
map_string_t::const_iterator valit, valitend = single_plugin_settings.end();
for (valit = single_plugin_settings.begin(); valit != valitend; ++valit)
- it->second[valit->first] = valit->second;
+ (*(map_string_t*)value)[valit->first] = valit->second;
}
}
+ return settings;
}
/**
@@ -628,8 +651,7 @@ int report(const char *crash_id, int flags)
}
/* Get settings */
- map_map_string_t reporters_settings;
- get_reporter_plugin_settings(reporters, reporters_settings);
+ GHashTable *reporters_settings = get_reporter_plugin_settings(reporters);
int errors = 0;
int plugins = 0;
@@ -661,18 +683,18 @@ int report(const char *crash_id, int flags)
continue;
}
- map_map_string_t::iterator settings = reporters_settings.find(it->c_str());
- if (settings != reporters_settings.end())
+ map_string_t *settings = (map_string_t *)g_hash_table_lookup(reporters_settings, it->c_str());
+ if (settings)
{
- map_string_t::iterator rating_setting = settings->second.find("RatingRequired");
- if (rating_setting != settings->second.end()
+ map_string_t::iterator rating_setting = settings->find("RatingRequired");
+ if (rating_setting != settings->end()
&& string_to_bool(rating_setting->second.c_str())
&& rating < 3)
{
puts(_("Reporting disabled because the backtrace is unusable"));
const char *package = get_crash_data_item_content_or_NULL(cr, FILENAME_PACKAGE);
- if (package[0])
+ if (package && package[0])
printf(_("Please try to install debuginfo manually using the command: \"debuginfo-install %s\" and try again\n"), package);
plugins++;
@@ -688,7 +710,7 @@ int report(const char *crash_id, int flags)
continue;
}
- ask_for_missing_settings(it->c_str(), settings->second);
+ ask_for_missing_settings(it->c_str(), *settings);
vector_string_t cur_reporter(1, *it);
report_status_t r = call_Report(cr, cur_reporter, reporters_settings);
@@ -701,6 +723,7 @@ int report(const char *crash_id, int flags)
}
}
+ g_hash_table_destroy(reporters_settings);
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors);
return errors != 0;
}
diff --git a/src/lib/abrt_dbus.h b/src/lib/abrt_dbus.h
index cdc963c..16b91d5 100644
--- a/src/lib/abrt_dbus.h
+++ b/src/lib/abrt_dbus.h
@@ -20,6 +20,7 @@
#define ABRT_DBUS_H
#include <dbus/dbus.h>
+#include <glib.h>
#include "abrtlib.h"
@@ -200,6 +201,34 @@ static inline void store_val(DBusMessageIter* iter, const std::vector<E>& val) {
template<typename K, typename V>
static inline void store_val(DBusMessageIter* iter, const std::map<K,V>& val) { store_map(iter, val); }
+/* next patch will rewrite this into c */
+static inline void store_hash_table_map_string_t(DBusMessageIter* iter, GHashTable *ht)
+{
+ DBusMessageIter sub_iter;
+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{sa{ss}}", &sub_iter))
+ die_out_of_memory();
+
+ GHashTableIter ht_iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init(&ht_iter, ht);
+ while (g_hash_table_iter_next(&ht_iter, &key, &value))
+ {
+ DBusMessageIter sub_sub_iter;
+ if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter))
+ die_out_of_memory();
+
+ store_val(&sub_sub_iter, (char *)key);
+ store_val(&sub_sub_iter, *(map_string_t *)value);
+
+ if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter))
+ die_out_of_memory();
+ }
+
+ if (!dbus_message_iter_close_container(iter, &sub_iter))
+ die_out_of_memory();
+}
+
/*
* Helpers for parsing DBus messages
--
1.7.3.2.164.g6f10c
13 years, 5 months
[PATCH] get_reporter_plugin_settings() returns GHashTable
by Nikola Pajkovsky
static void get_reporter_plugin_settings(const vector_string_t&
reporters, map_map_string_t &settings)
a new interface is
static GHashTable *get_reporter_plugin_settings(const vector_string_t&
reporters)
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
src/cli/dbus.cpp | 6 ++--
src/cli/dbus.h | 3 +-
src/cli/report.cpp | 65 +++++++++++++++++++++++++++++++++++++-------------
src/lib/abrt_dbus.h | 29 ++++++++++++++++++++++
4 files changed, 82 insertions(+), 21 deletions(-)
diff --git a/src/cli/dbus.cpp b/src/cli/dbus.cpp
index 7565d5b..f9271b8 100644
--- a/src/cli/dbus.cpp
+++ b/src/cli/dbus.cpp
@@ -161,7 +161,7 @@ map_crash_data_t call_CreateReport(const char* crash_id)
report_status_t call_Report(const map_crash_data_t& report,
const vector_string_t& reporters,
- const map_map_string_t &plugins)
+ GHashTable *plugins)
{
DBusMessage* msg = new_call_msg(__func__ + 5);
DBusMessageIter out_iter;
@@ -172,8 +172,8 @@ report_status_t call_Report(const map_crash_data_t& report,
/* parameter #2: reporters to use */
store_val(&out_iter, reporters);
/* parameter #3 (opt): plugin config */
- if (!plugins.empty())
- store_val(&out_iter, plugins);
+ if (g_hash_table_size(plugins))
+ store_hash_table_map_string_t(&out_iter, plugins);
DBusMessage *reply = send_get_reply_and_unref(msg);
diff --git a/src/cli/dbus.h b/src/cli/dbus.h
index 9c99c66..b837869 100644
--- a/src/cli/dbus.h
+++ b/src/cli/dbus.h
@@ -18,6 +18,7 @@
#ifndef ABRT_CLI_DBUS_H
#define ABRT_CLI_DBUS_H
+#include <glib.h>
#include "abrt_dbus.h"
#include "abrt_crash_dump.h"
@@ -41,7 +42,7 @@ map_crash_data_t call_CreateReport(const char *crash_id);
*/
report_status_t call_Report(const map_crash_data_t& report,
const vector_string_t& reporters,
- const map_map_string_t &plugins);
+ GHashTable *plugins);
int32_t call_DeleteDebugDump(const char* crash_id);
diff --git a/src/cli/report.cpp b/src/cli/report.cpp
index 78a3891..ff953b2 100644
--- a/src/cli/report.cpp
+++ b/src/cli/report.cpp
@@ -503,23 +503,49 @@ static bool set_echo(bool enabled)
}
/**
+ * Destroy plugin settings
+ * @param ht
+ * Plugin settings in pattern GHashTable<char *, map_string_t *>
+ */
+static void destroy_plugin_settings(GHashTable *ht)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init (&iter, ht);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ {
+ free(key);
+ delete (map_string_t *)value;
+ }
+
+ g_hash_table_destroy(ht);
+}
+
+
+/**
* Gets reporter plugin settings.
* @param reporters
* List of reporter names. Settings of these reporters are handled.
- * @param settings
+ * @return settings
* A structure filled with reporter plugin settings.
+ * It's GHashTable<char *, map_plugin_t *> and must be passed to
+ * destroy_plugin_settings()
*/
-static void get_reporter_plugin_settings(const vector_string_t& reporters,
- map_map_string_t &settings)
+static GHashTable *get_reporter_plugin_settings(const vector_string_t& reporters)
{
/* First of all, load system-wide report plugin settings. */
+ GHashTable *settings = g_hash_table_new(g_str_hash, g_str_equal);
+
for (vector_string_t::const_iterator it = reporters.begin(); it != reporters.end(); ++it)
{
- map_string_t single_plugin_settings = call_GetPluginSettings(it->c_str());
+ map_string_t *single_plugin_settings = new map_string_t;
+ *single_plugin_settings = call_GetPluginSettings(it->c_str());
+
// Copy the received settings as defaults.
// Plugins won't work without it, if some value is missing
// they use their default values for all fields.
- settings[it->c_str()] = single_plugin_settings;
+ g_hash_table_insert(settings, xstrdup(it->c_str()), (void*)single_plugin_settings);
}
/* Second, load user-specific settings, which override
@@ -528,12 +554,16 @@ static void get_reporter_plugin_settings(const vector_string_t& reporters,
const char* homedir = pw ? pw->pw_dir : NULL;
if (homedir)
{
- map_map_string_t::const_iterator itend = settings.end();
- for (map_map_string_t::iterator it = settings.begin(); it != itend; ++it)
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init (&iter, settings);
+ while (g_hash_table_iter_next (&iter, &key, &value))
{
map_string_t single_plugin_settings;
std::string path = std::string(homedir) + "/.abrt/"
- + it->first + ".conf";
+ + (char*)key + ".conf";
+
/* Load plugin config in the home dir. Do not skip lines with empty value (but containing a "key="),
because user may want to override password from /etc/abrt/plugins/*.conf, but he prefers to
enter it every time he reports. */
@@ -543,9 +573,10 @@ static void get_reporter_plugin_settings(const vector_string_t& reporters,
// Merge user's plugin settings into already loaded settings.
map_string_t::const_iterator valit, valitend = single_plugin_settings.end();
for (valit = single_plugin_settings.begin(); valit != valitend; ++valit)
- it->second[valit->first] = valit->second;
+ (*(map_string_t*)value)[valit->first] = valit->second;
}
}
+ return settings;
}
/**
@@ -628,8 +659,7 @@ int report(const char *crash_id, int flags)
}
/* Get settings */
- map_map_string_t reporters_settings;
- get_reporter_plugin_settings(reporters, reporters_settings);
+ GHashTable *reporters_settings = get_reporter_plugin_settings(reporters);
int errors = 0;
int plugins = 0;
@@ -661,18 +691,18 @@ int report(const char *crash_id, int flags)
continue;
}
- map_map_string_t::iterator settings = reporters_settings.find(it->c_str());
- if (settings != reporters_settings.end())
+ map_string_t *settings = (map_string_t *)g_hash_table_lookup(reporters_settings, it->c_str());
+ if (settings)
{
- map_string_t::iterator rating_setting = settings->second.find("RatingRequired");
- if (rating_setting != settings->second.end()
+ map_string_t::iterator rating_setting = settings->find("RatingRequired");
+ if (rating_setting != settings->end()
&& string_to_bool(rating_setting->second.c_str())
&& rating < 3)
{
puts(_("Reporting disabled because the backtrace is unusable"));
const char *package = get_crash_data_item_content_or_NULL(cr, FILENAME_PACKAGE);
- if (package[0])
+ if (package && package[0])
printf(_("Please try to install debuginfo manually using the command: \"debuginfo-install %s\" and try again\n"), package);
plugins++;
@@ -688,7 +718,7 @@ int report(const char *crash_id, int flags)
continue;
}
- ask_for_missing_settings(it->c_str(), settings->second);
+ ask_for_missing_settings(it->c_str(), *settings);
vector_string_t cur_reporter(1, *it);
report_status_t r = call_Report(cr, cur_reporter, reporters_settings);
@@ -701,6 +731,7 @@ int report(const char *crash_id, int flags)
}
}
+ destroy_plugin_settings(reporters_settings);
printf(_("Crash reported via %d report events (%d errors)\n"), plugins, errors);
return errors != 0;
}
diff --git a/src/lib/abrt_dbus.h b/src/lib/abrt_dbus.h
index cdc963c..16b91d5 100644
--- a/src/lib/abrt_dbus.h
+++ b/src/lib/abrt_dbus.h
@@ -20,6 +20,7 @@
#define ABRT_DBUS_H
#include <dbus/dbus.h>
+#include <glib.h>
#include "abrtlib.h"
@@ -200,6 +201,34 @@ static inline void store_val(DBusMessageIter* iter, const std::vector<E>& val) {
template<typename K, typename V>
static inline void store_val(DBusMessageIter* iter, const std::map<K,V>& val) { store_map(iter, val); }
+/* next patch will rewrite this into c */
+static inline void store_hash_table_map_string_t(DBusMessageIter* iter, GHashTable *ht)
+{
+ DBusMessageIter sub_iter;
+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{sa{ss}}", &sub_iter))
+ die_out_of_memory();
+
+ GHashTableIter ht_iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init(&ht_iter, ht);
+ while (g_hash_table_iter_next(&ht_iter, &key, &value))
+ {
+ DBusMessageIter sub_sub_iter;
+ if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter))
+ die_out_of_memory();
+
+ store_val(&sub_sub_iter, (char *)key);
+ store_val(&sub_sub_iter, *(map_string_t *)value);
+
+ if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter))
+ die_out_of_memory();
+ }
+
+ if (!dbus_message_iter_close_container(iter, &sub_iter))
+ die_out_of_memory();
+}
+
/*
* Helpers for parsing DBus messages
--
1.7.3.2.164.g6f10c
13 years, 5 months
Steps to rewrite LoadPluginSettings to C
by Nikola Pajkovsky
Note: I will be using a C++ notations for glib structures.
Before I send a patch about rewriting LoadPluginSettings to C, I have to write
one before. It will be smaller and it will rewrite function from abrt-cli
called
static void get_reporter_plugin_settings(const vector_string_t& reporters,
map_map_string_t &settings)
a new interface will be
static GHashTable *get_reporter_plugin_settings(const vector_string_t&
reporters)
and returned value is GHashTable<char*, map_string_t>. In a second patch(the
one which will rewrite LoadPluginSettings) returned value will be
GHashTable<char *, GHashTable<char *, char*>. Returned value must be
*strongly* documented.
I also have to introduce a new funcion in dbus.
(store_/load_)hash_table_(type).
--here I am right now--
After transmitting data structure to daemon, I'm almost done, because of
beauty of passing settings to daemon(writing them to stdin)
Now a little bit about LoadPluginSettings
Interface: extern GHashTable *load_plugin_settings(const char *pPath, bool
skipKeysWithoutValue);
load_plugin_settings return NULL on error or initialized GHashTable
Data structure: GHashTable<char *, char*>
A new dbus functions must be: (load_/save_)hash_table_str(DBus*,
GHashTable<char *, char*>);
Simple taste of code:
GHashTable *single_plugin_settings = load_plugin_settings(path.c_str(),
false);
if (!single_plugin_settings)
continue;
stats:
src/cli/dbus.cpp | 6 +-
src/cli/dbus.h | 2 +-
src/cli/report.cpp | 11 ++-
src/daemon/CommLayerServerDBus.cpp | 4 +-
src/daemon/Makefile.am | 2 +
src/daemon/MiddleWare.cpp | 5 +-
src/daemon/MiddleWare.h | 2 +-
src/daemon/PluginManager.cpp | 11 ++--
src/daemon/PluginManager.h | 2 +
src/hooks/Makefile.am | 1 +
src/include/abrt_types.h | 2 -
src/include/abrtlib.h | 31 +++++-----
src/include/plugin.h | 6 +-
src/lib/Makefile.am | 2 +
src/lib/Plugin.cpp | 15 ++---
src/lib/abrt_dbus.c | 101
++++++++++++++++++++++++++++++++
src/lib/abrt_dbus.h | 4 +
src/lib/load_plugin_settings.cpp | 11 ++--
src/plugins/CCpp.cpp | 56 +++++++++---------
src/plugins/CCpp.h | 2 +-
src/plugins/KerneloopsScanner.cpp | 6 +-
src/plugins/Makefile.am | 8 ++-
src/plugins/abrt-action-bugzilla.cpp | 16 ++---
src/plugins/abrt-action-kerneloops.cpp | 15 ++---
src/plugins/abrt-action-mailx.cpp | 25 ++++----
src/plugins/abrt-action-rhtsupport.cpp | 25 ++++----
src/plugins/abrt-action-upload.cpp | 13 ++--
--
Nikola
13 years, 5 months