summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-01-27 16:00:37 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2011-01-27 16:00:37 +0100
commita96e56e3cd33b0ea5043793c1e56f4bd21c8a48c (patch)
tree6e00039c312432b2715c2447bd2844d8736d0549
parent5c71e00f814f679bd6ea652eda8552f746b5f725 (diff)
downloadabrt-a96e56e3cd33b0ea5043793c1e56f4bd21c8a48c.tar.gz
abrt-a96e56e3cd33b0ea5043793c1e56f4bd21c8a48c.tar.xz
abrt-a96e56e3cd33b0ea5043793c1e56f4bd21c8a48c.zip
run_event: add children_count
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r--src/include/report/run_event.h1
-rw-r--r--src/lib/run_event.c16
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);
}