Reporting works fine with these patches (except reporter-ureport). Pushed both. Thank you!
On Tue, 2013-07-09 at 18:26 +0200, Martin Milata wrote: > Related to abrt/satyr#88. > > Signed-off-by: Martin Milata <[email protected]> > --- > configure.ac | 18 +-- > libreport-web.pc.in | 2 +- > src/lib/json.c | 288 > +--------------------------------------- > src/plugins/reporter-bugzilla.c | 75 +++-------- > 4 files changed, 27 insertions(+), 356 deletions(-) > > diff --git a/configure.ac b/configure.ac > index 671d6a4..da7f480 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -145,11 +145,6 @@ PYTHON_LIBS=`python-config --libs 2> /dev/null` > AC_SUBST(PYTHON_CFLAGS) > AC_SUBST(PYTHON_LIBS) > > -AC_ARG_WITH([satyr], > - AS_HELP_STRING([--with-satyr], > - [use satyr instead of btparser (default is no)]), > - [], [with_satyr=no]) > - > PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.21]) > PKG_CHECK_MODULES([DBUS], [dbus-1]) > PKG_CHECK_MODULES([LIBXML], [libxml-2.0]) > @@ -158,18 +153,7 @@ PKG_CHECK_MODULES([CURL], [libcurl]) > PKG_CHECK_MODULES([PROXY], [libproxy-1.0], [ > AC_DEFINE([HAVE_PROXY], [1], [Use libproxy]) > ], [:]) > - > -[if test "$with_satyr" = "yes"] > -[then] > - PKG_CHECK_MODULES([SATYR], [satyr]) > - AC_DEFINE([USE_SATYR], [1], [Use satyr instead of btparser]) > - SATYR_PKG="satyr" > -[else] > - PKG_CHECK_MODULES([SATYR], [btparser]) > - SATYR_PKG="btparser" > -[fi] > -AC_SUBST(SATYR_PKG) > -AM_CONDITIONAL([USE_SATYR], [test "$with_satyr" = "yes"]) > +PKG_CHECK_MODULES([SATYR], [satyr]) > > AC_ARG_WITH(newt, > AS_HELP_STRING([--with-newt],[use newt (default is YES)]), > diff --git a/libreport-web.pc.in b/libreport-web.pc.in > index ec4ab8e..288e613 100644 > --- a/libreport-web.pc.in > +++ b/libreport-web.pc.in > @@ -6,7 +6,7 @@ includedir=@includedir@ > Name: libreport > Description: Library providing network API for libreport > Version: @VERSION@ > -Requires: glib-2.0 libcurl libproxy-1.0 libxml-2.0 xmlrpc xmlrpc_client json > @SATYR_PKG@ libreport > +Requires: glib-2.0 libcurl libproxy-1.0 libxml-2.0 xmlrpc xmlrpc_client json > satyr libreport > Libs: -L${libdir} -lreport-web > Cflags: > > diff --git a/src/lib/json.c b/src/lib/json.c > index d5c6f2d..68348ad 100644 > --- a/src/lib/json.c > +++ b/src/lib/json.c > @@ -19,6 +19,9 @@ > > #include <json/json.h> > > +#include <satyr/abrt.h> > +#include <satyr/report.h> > + > #include "internal_libreport.h" > #include "ureport.h" > #include "libreport_curl.h" > @@ -34,11 +37,6 @@ static void ureport_add_str(struct json_object *ur, const > char *key, > json_object_object_add(ur, key, jstring); > } > > -#if USE_SATYR > - > -#include <satyr/abrt.h> > -#include <satyr/report.h> > - > char *ureport_from_dump_dir(const char *dump_dir_path) > { > char *error_message; > @@ -54,286 +52,6 @@ char *ureport_from_dump_dir(const char *dump_dir_path) > return json_ureport; > } > > -#else /* USE_SATYR */ > - > -#include <btparser/thread.h> > -#include <btparser/core-backtrace.h> > - > -/* on success 1 returned, on error zero is returned and appropriate value > - * is returned as third argument. You should never read third argument when > - * function fails > - * > - * json-c library doesn't have any json_object_new_long, > - * thus we have to use only int > - */ > -static int get_pd_int_item(problem_data_t *pd, const char *key, int *result) > -{ > - if (!pd || !key) > - return 0; > - > - char *pd_item = problem_data_get_content_or_NULL(pd, key); > - if (!pd_item) > - { > - VERB1 log("warning: '%s' is not an item in problem directory", key); > - return 0; > - } > - > - errno = 0; > - char *e; > - long i = strtol(pd_item, &e, 10); > - if (errno || pd_item == e || *e != '\0' || (int) i != i) > - return 0; > - > - *result = i; > - return 1; > -} > - > -static void ureport_add_int(struct json_object *ur, const char *key, int i) > -{ > - struct json_object *jint = json_object_new_int(i); > - if (!jint) > - die_out_of_memory(); > - > - json_object_object_add(ur, key, jint); > -} > - > -static void ureport_add_os(struct json_object *ur, problem_data_t *pd) > -{ > - char *name; > - char *version; > - map_string_t *osinfo = new_map_string(); > - problem_data_get_osinfo(pd, osinfo); > - parse_osinfo_for_rhts(osinfo, &name, &version); > - free_map_string(osinfo); > - > - if (!name || !version) > - { > - free(name); > - free(version); > - return; > - } > - > - struct json_object *jobject = json_object_new_object(); > - if (!jobject) > - die_out_of_memory(); > - > - ureport_add_str(jobject, "name", name); > - ureport_add_str(jobject, "version", version); > - > - free(name); > - free(version); > - > - json_object_object_add(ur, "os", jobject); > -} > - > -static bool ureport_add_type(struct json_object *ur, problem_data_t *pd) > -{ > - char *pd_item = problem_data_get_content_or_NULL(pd, FILENAME_ANALYZER); > - if (!pd_item) > - { > - error_msg(_("Missing problem element '%s'"), FILENAME_ANALYZER); > - return false; > - } > - > - if (strcmp(pd_item, "CCpp") == 0) > - ureport_add_str(ur, "type", "USERSPACE"); > - else if (strcmp(pd_item, "Python") == 0) > - ureport_add_str(ur, "type", "PYTHON"); > - else if (strcmp(pd_item, "Kerneloops") == 0 || strcmp(pd_item, "vmcore") > == 0) > - ureport_add_str(ur, "type", "KERNELOOPS"); > - else > - { > - error_msg(_("An unsupported value '%s' in problem element '%s'"), > pd_item, FILENAME_ANALYZER); > - return false; > - } > - > - return true; > -} > - > -static void ureport_add_core_backtrace(struct json_object *ur, > problem_data_t *pd) > -{ > - char *pd_item = problem_data_get_content_or_NULL(pd, > FILENAME_CORE_BACKTRACE); > - if (!pd_item) > - return; > - > - struct btp_thread *core_bt = btp_load_core_backtrace(pd_item); > - if (!core_bt) > - return; > - > - struct json_object *jarray = json_object_new_array(); > - if (!jarray) > - die_out_of_memory(); > - > - struct btp_frame *frame; > - unsigned frame_nr = 0; > - for (frame = core_bt->frames; frame; frame = frame->next) > - { > - struct frame_aux *aux = frame->user_data; > - > - struct json_object *item = json_object_new_object(); > - if (!item) > - die_out_of_memory(); > - > - if (aux->filename) > - ureport_add_str(item, "path", aux->filename); > - > - if (frame->function_name) > - ureport_add_str(item, "funcname", frame->function_name); > - > - if (aux->build_id) > - ureport_add_str(item, "buildid", aux->build_id); > - > - if (aux->fingerprint) > - ureport_add_str(item, "funchash", aux->fingerprint); > - > - /* always add offset - even offset 0 is valid */ > - ureport_add_int(item, "offset", (uintmax_t)frame->address); > - > - ureport_add_int(item, "frame", frame_nr++); > - ureport_add_int(item, "thread", 0); > - > - > - json_object_array_add(jarray, item); > - } > - > - btp_thread_free(core_bt); > - > - json_object_object_add(ur, FILENAME_CORE_BACKTRACE, jarray); > -} > -static void ureport_add_item_str(struct json_object *ur, problem_data_t *pd, > - const char *key, const char *rename) > -{ > - char *pd_item = problem_data_get_content_or_NULL(pd, key); > - if (!pd_item) > - return; > - > - ureport_add_str(ur, (rename) ?: key, pd_item); > -} > - > -static void ureport_add_item_int(struct json_object *ur, problem_data_t *pd, > - const char *key, const char *rename) > -{ > - int nr; > - int stat = get_pd_int_item(pd, key, &nr); > - if (!stat) > - return; > - > - ureport_add_int(ur, (rename) ?: key, nr); > -} > - > -static void ureport_add_pkg(struct json_object *ur, problem_data_t *pd) > -{ > - struct json_object *jobject = json_object_new_object(); > - if (!jobject) > - die_out_of_memory(); > - > - ureport_add_item_int(jobject, pd, FILENAME_PKG_EPOCH, "epoch"); > - ureport_add_item_str(jobject, pd, FILENAME_PKG_NAME, "name"); > - ureport_add_item_str(jobject, pd, FILENAME_PKG_VERSION, "version"); > - ureport_add_item_str(jobject, pd, FILENAME_PKG_RELEASE, "release"); > - ureport_add_item_str(jobject, pd, FILENAME_PKG_ARCH, "architecture"); > - > - json_object_object_add(ur, "installed_package", jobject); > -} > - > -static void ureport_add_related_pkgs(struct json_object *ur, problem_data_t > *pd) > -{ > - // TODO: populate this field > - struct json_object *jobject = json_object_new_array(); > - json_object_object_add(ur, "related_packages", jobject); > -} > - > -static void ureport_add_reporter(struct json_object *ur, const char *name, > const char *version) > -{ > - struct json_object *jobject = json_object_new_object(); > - if (!jobject) > - die_out_of_memory(); > - > - ureport_add_str(jobject, "name", name); > - ureport_add_str(jobject, "version", version); > - > - json_object_object_add(ur, "reporter", jobject); > -} > - > -static void ureport_add_oops(struct json_object *ur, problem_data_t *pd) > -{ > - char *pd_item = problem_data_get_content_or_NULL(pd, FILENAME_ANALYZER); > - if (!pd_item) > - return; > - > - if (!strcmp(pd_item, "Kerneloops")) > - ureport_add_item_str(ur, pd, FILENAME_BACKTRACE, "oops"); > -} > - > -char *new_json_ureport(problem_data_t *pd) > -{ > - struct json_object *ureport = json_object_new_object(); > - if (!ureport) > - die_out_of_memory(); > - > - ureport_add_item_str(ureport, pd, "user_type", NULL); > - ureport_add_item_int(ureport, pd, "uptime", NULL); > - > - /* mandatory, but not in problem-dir > - * > - * ureport_add_item_int(ureport, pd, "crash_thread", NULL); > - */ > - ureport_add_int(ureport, "ureport_version", 1); > - ureport_add_int(ureport, "crash_thread", 0); > - > - ureport_add_item_str(ureport, pd, FILENAME_ARCHITECTURE, NULL); > - ureport_add_item_str(ureport, pd, FILENAME_EXECUTABLE, NULL); > - ureport_add_item_str(ureport, pd, FILENAME_REASON, NULL); > - ureport_add_item_str(ureport, pd, FILENAME_COMPONENT, NULL); > - > - if (!ureport_add_type(ureport, pd)) > - { > - error_msg(_("Can't create an uReport without 'type'")); > - json_object_put(ureport); > - return NULL; > - } > - > - ureport_add_pkg(ureport, pd); > - ureport_add_related_pkgs(ureport, pd); > - ureport_add_os(ureport, pd); > - > - ureport_add_core_backtrace(ureport, pd); > - ureport_add_reporter(ureport, "ABRT", VERSION); > - > - ureport_add_oops(ureport, pd); > - > - char *j = xstrdup(json_object_to_json_string(ureport)); > - json_object_put(ureport); > - > - return j; > -} > - > -char *ureport_from_dump_dir(const char *dump_dir_path) > -{ > - struct dump_dir *dd = dd_opendir(dump_dir_path, DD_OPEN_READONLY); > - if (!dd) > - xfunc_die(); > - > - problem_data_t *pd = create_problem_data_from_dump_dir(dd); > - > - dd_close(dd); > - if (!pd) > - xfunc_die(); /* create_problem_data_from_dump_dir already emitted > error msg */ > - > - char *json_ureport = new_json_ureport(pd); > - problem_data_free(pd); > - > - if (json_ureport == NULL) > - { > - error_msg(_("Not uploading an empty uReport")); > - return NULL; > - } > - > - return json_ureport; > -} > - > -#endif /* USE_SATYR */ > - > char *new_json_attachment(const char *bthash, const char *type, const char > *data) > { > struct json_object *attachment = json_object_new_object(); > diff --git a/src/plugins/reporter-bugzilla.c b/src/plugins/reporter-bugzilla.c > index 626b41f..972a1f0 100644 > --- a/src/plugins/reporter-bugzilla.c > +++ b/src/plugins/reporter-bugzilla.c > @@ -21,39 +21,8 @@ > #include "abrt_xmlrpc.h" > #include "rhbz.h" > > -/* btparser compatibility - once we move to satyr, the else branch of the > ifdef > - * can be removed > - */ > -#ifdef USE_SATYR > - > -#include <satyr/location.h> > -#include <satyr/gdb_stacktrace.h> > -#include <satyr/gdb_thread.h> > -#include <satyr/gdb_frame.h> > -#include <satyr/strbuf.h> > - > -#else /* USE_SATYR */ > - > -#include <btparser/location.h> > -#include <btparser/backtrace.h> > -#include <btparser/thread.h> > -#include <btparser/frame.h> > -#include <btparser/strbuf.h> > - > -#define sr_location btp_location > -#define sr_location_init btp_location_init > -#define sr_gdb_stacktrace btp_backtrace > -#define sr_gdb_stacktrace_parse btp_backtrace_parse > -#define sr_gdb_stacktrace_get_optimized_thread > btp_backtrace_get_optimized_thread > -#define sr_gdb_stacktrace_free btp_backtrace_free > -#define sr_gdb_thread btp_thread > -#define sr_gdb_thread_append_to_str btp_thread_append_to_str > -#define sr_gdb_thread_free btp_thread_free > -#define sr_strbuf btp_strbuf > -#define sr_strbuf_new btp_strbuf_new > -#define sr_strbuf_free_nobuf btp_strbuf_free_nobuf > - > -#endif /* USE_SATYR */ > +#include <satyr/stacktrace.h> > +#include <satyr/abrt.h> > > struct section_t { > char *name; > @@ -365,38 +334,38 @@ int append_short_backtrace(struct strbuf *result, > problem_data_t *problem_data, > > if (strlen(item->content) >= max_text_size) > { > - struct sr_location location; > - sr_location_init(&location); > + char *error_msg = NULL; > + const char *analyzer = > problem_data_get_content_or_NULL(problem_data, FILENAME_ANALYZER); > + if (!analyzer) > + return 0; > + > + /* For CCpp crashes, use the GDB-produced backtrace which should be > + * available by now. sr_abrt_type_from_analyzer returns > SR_REPORT_CORE > + * by default for CCpp crashes. > + */ > + enum sr_report_type report_type = > sr_abrt_type_from_analyzer(analyzer); > + if (strcmp(analyzer, "CCpp") == 0) > + report_type = SR_REPORT_GDB; > > - /* sr_gdb_stacktrace_parse modifies the input parameter */ > - char *content = item->content; > - struct sr_gdb_stacktrace *backtrace = sr_gdb_stacktrace_parse((const > char **)&content, &location); > + struct sr_stacktrace *backtrace = sr_stacktrace_parse(report_type, > + item->content, &error_msg); > > if (!backtrace) > { > - log(_("Can't parse backtrace")); > + log(_("Can't parse backtrace: %s"), error_msg); > + free(error_msg); > return 0; > } > > /* Get optimized thread stack trace for 10 top most frames */ > - struct sr_gdb_thread *thread = > sr_gdb_stacktrace_get_optimized_thread(backtrace, 10); > - > - sr_gdb_stacktrace_free(backtrace); > + truncated = sr_stacktrace_to_short_text(backtrace, 10); > + sr_stacktrace_free(backtrace); > > - if (!thread) > + if (!truncated) > { > - log(_("Can't find crash thread")); > + log(_("Can't generate stacktrace description (no crash > thread?)")); > return 0; > } > - > - /* Cannot be NULL, it dies on memory error */ > - struct sr_strbuf *bt = sr_strbuf_new(); > - > - sr_gdb_thread_append_to_str(thread, bt, true); > - > - sr_gdb_thread_free(thread); > - > - truncated = sr_strbuf_free_nobuf(bt); > } > > append_text(result,
