From a96e56e3cd33b0ea5043793c1e56f4bd21c8a48c Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 27 Jan 2011 16:00:37 +0100 Subject: run_event: add children_count Signed-off-by: Denys Vlasenko --- src/include/report/run_event.h | 1 + src/lib/run_event.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/include/report/run_event.h b/src/include/report/run_event.h index bab7cd2c..4d06896a 100644 --- a/src/include/report/run_event.h +++ b/src/include/report/run_event.h @@ -28,6 +28,7 @@ extern "C" { struct dump_dir; struct run_event_state { + int children_count; /* Used only for post-create dup detection. TODO: document its API */ int (*post_run_callback)(const char *dump_dir_name, void *param); void *post_run_param; diff --git a/src/lib/run_event.c b/src/lib/run_event.c index 22f61ce9..e0f2cf56 100644 --- a/src/lib/run_event.c +++ b/src/lib/run_event.c @@ -21,7 +21,7 @@ struct run_event_state *new_run_event_state() { - return (struct run_event_state*)xzalloc(sizeof(struct run_event_state)); + return xzalloc(sizeof(struct run_event_state)); } void free_run_event_state(struct run_event_state *state) @@ -177,6 +177,12 @@ static int run_event_helper(struct run_event_state *state, { VERB1 log("Executing '%s'", p); + /* We count it even if fork fails. The counter isn't meant + * to count *successful* forks, it is meant to let caller know + * whether the event we run has *any* handlers configured, or not. + */ + state->children_count++; + /* /bin/sh -c 'cmd [args]' NULL */ char *argv[4]; char **pp = argv; @@ -241,22 +247,28 @@ int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event ) { + state->children_count = 0; + return run_event_helper(state, dump_dir_name, event, CONF_DIR"/abrt_event.conf"); } int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event) { + state->children_count = 0; + struct dump_dir *dd = create_dump_dir_from_crash_data(data, NULL); if (!dd) return -1; char *dir_name = xstrdup(dd->dd_dir); 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, 0); free(dir_name); if (dd) { - g_hash_table_remove_all(data); load_crash_data_from_dump_dir(data, dd); dd_delete(dd); } -- cgit