int report_problem_in_memory(problem_data_t *pd, int flags) { int result = 0; struct dump_dir *dd = create_dump_dir_from_problem_data(pd, "/tmp"/* /var/tmp ?? */); if (!dd) return -1; char *dir_name = xstrdup(dd->dd_dirname); dd_close(dd); VERB2 log("Temp problem dir: '%s'", dir_name); if (!(flags & LIBREPORT_WAIT)) flags |= LIBREPORT_DEL_DIR; result = report_problem_in_dir(dir_name, flags); /* If we waited for reporter to finish, we should clean up the tmp dir * (if we didn't, cleaning up will be done by reporting child process later). * We can also reload the problem data if requested. */ if (flags & LIBREPORT_WAIT) { if (flags & LIBREPORT_RELOAD_DATA) g_hash_table_remove_all(pd); dd = dd_opendir(dir_name, 0); if (dd) { if (flags & LIBREPORT_RELOAD_DATA) problem_data_load_from_dump_dir(pd, dd, NULL); dd_delete(dd); } } free(dir_name); return result; }
int run_event_on_problem_data(struct run_event_state *state, problem_data_t *data, const char *event) { state->children_count = 0; struct dump_dir *dd = create_dump_dir_from_problem_data(data, NULL); if (!dd) return -1; char *dir_name = xstrdup(dd->dd_dirname); dd_close(dd); int r = run_event_on_dir_name(state, dir_name, event); g_hash_table_remove_all(data); dd = dd_opendir(dir_name, /*flags:*/ 0); free(dir_name); if (dd) { problem_data_load_from_dump_dir(data, dd, NULL); dd_delete(dd); } return r; }