char *ureport_from_dump_dir(const char *dump_dir_path) { char *error_message; struct sr_report *report = sr_abrt_report_from_dir(dump_dir_path, &error_message); if (!report) error_msg_and_die("%s", error_message); char *json_ureport = sr_report_to_json(report); sr_report_free(report); return json_ureport; }
bool sr_abrt_print_report_from_dir(const char *directory, char **error_message) { struct sr_report *report = sr_abrt_report_from_dir(directory, error_message); if (!report) return false; char *json = sr_report_to_json(report); sr_report_free(report); puts(json); free(json); return true; }
struct sr_report * sr_abrt_report_from_dir(const char *directory, char **error_message) { struct sr_report *report = sr_report_new(); /* Report type. */ char *type_contents = file_contents(directory, "type", error_message); if (!type_contents) { sr_report_free(report); return NULL; } report->report_type = sr_abrt_type_from_type(type_contents); free(type_contents); /* Operating system. */ report->operating_system = sr_abrt_operating_system_from_dir( directory, error_message); if (!report->operating_system) { sr_report_free(report); return NULL; } /* Component name. */ report->component_name = file_contents(directory, "component", error_message); /* RPM packages. */ report->rpm_packages = sr_abrt_rpm_packages_from_dir( directory, error_message); if (!report->rpm_packages) { sr_report_free(report); return NULL; } /* Core stacktrace. */ if (report->report_type == SR_REPORT_CORE) { char *core_backtrace_contents = file_contents(directory, "core_backtrace", error_message); if (!core_backtrace_contents) { sr_report_free(report); return NULL; } report->stacktrace = (struct sr_stacktrace *)sr_core_stacktrace_from_json_text( core_backtrace_contents, error_message); free(core_backtrace_contents); if (!report->stacktrace) { sr_report_free(report); return NULL; } } /* Python stacktrace. */ if (report->report_type == SR_REPORT_PYTHON) { char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Python stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; report->stacktrace = (struct sr_stacktrace *)sr_python_stacktrace_parse( &contents_pointer, &location); free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } /* Kerneloops stacktrace. */ if (report->report_type == SR_REPORT_KERNELOOPS) { /* Determine kernel version */ char *kernel_contents = file_contents(directory, "kernel", error_message); if (!kernel_contents) { sr_report_free(report); return NULL; } /* Load the Kerneloops stacktrace */ char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Kerneloops stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; struct sr_koops_stacktrace *stacktrace = sr_koops_stacktrace_parse( &contents_pointer, &location); stacktrace->version = kernel_contents; report->stacktrace = (struct sr_stacktrace *)stacktrace; free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } /* Java stacktrace. */ if (report->report_type == SR_REPORT_JAVA) { char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Java stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; report->stacktrace = (struct sr_stacktrace *)sr_java_stacktrace_parse( &contents_pointer, &location); free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } /* Ruby stacktrace. */ if (report->report_type == SR_REPORT_RUBY) { char *backtrace_contents = file_contents(directory, "backtrace", error_message); if (!backtrace_contents) { sr_report_free(report); return NULL; } /* Parse the Ruby stacktrace. */ struct sr_location location; sr_location_init(&location); const char *contents_pointer = backtrace_contents; report->stacktrace = (struct sr_stacktrace *)sr_ruby_stacktrace_parse( &contents_pointer, &location); free(backtrace_contents); if (!report->stacktrace) { *error_message = sr_location_to_string(&location); sr_report_free(report); return NULL; } } return report; }