This makes sure we exec immediately after fork and thus eliminate
threading-related problems.
Run-tested.
Stops
https://bugzilla.redhat.com/show_bug.cgi?id=835112
from happening.
--
vda
diff -x '*.po' -d -urpN abrt.8/abrt.spec.in abrt.9/abrt.spec.in
--- abrt.8/abrt.spec.in 2012-06-25 08:40:35.000000000 +0200
+++ abrt.9/abrt.spec.in 2012-06-26 12:38:20.789106812 +0200
@@ -462,7 +462,7 @@ gtk-update-icon-cache %{_datadir}/icons/
%endif
%{_sbindir}/abrtd
%{_sbindir}/abrt-server
-%{_libexecdir}/abrt-handle-event
+%{_bindir}/abrt-handle-event
%{_bindir}/abrt-handle-upload
%{_bindir}/abrt-action-save-package-data
%{_bindir}/abrt-watch-log
diff -x '*.po' -d -urpN abrt.8/src/daemon/abrtd.c abrt.9/src/daemon/abrtd.c
--- abrt.8/src/daemon/abrtd.c 2012-06-08 14:49:19.000000000 +0200
+++ abrt.9/src/daemon/abrtd.c 2012-06-26 12:39:23.054114293 +0200
@@ -64,7 +64,7 @@ static int socket_client_count = 0;
static pid_t spawn_event_handler_child(const char *dump_dir_name, const char
*event_name, FILE **fpp)
{
char *args[6];
- args[0] = (char *) "/usr/libexec/abrt-handle-event";
+ args[0] = (char *) "abrt-handle-event";
args[1] = (char *) "-e";
args[2] = (char *) event_name;
args[3] = (char *) "--";
diff -x '*.po' -d -urpN abrt.8/src/daemon/abrt-handle-event.c
abrt.9/src/daemon/abrt-handle-event.c
--- abrt.8/src/daemon/abrt-handle-event.c 2012-06-08 14:49:19.000000000 +0200
+++ abrt.9/src/daemon/abrt-handle-event.c 2012-06-26 13:02:03.338169218 +0200
@@ -276,7 +276,6 @@ int main(int argc, char **argv)
char *event_name = NULL;
struct options program_options[] = {
OPT__VERBOSE(&g_verbose),
- OPT_GROUP(""),
OPT_STRING('e', "event" , &event_name, "EVENT",
_("Run EVENT on DIR")),
OPT_END()
};
diff -x '*.po' -d -urpN abrt.8/src/daemon/Makefile.am
abrt.9/src/daemon/Makefile.am
--- abrt.8/src/daemon/Makefile.am 2012-06-08 14:49:19.000000000 +0200
+++ abrt.9/src/daemon/Makefile.am 2012-06-26 12:38:04.866097539 +0200
@@ -7,14 +7,13 @@ bin_SCRIPTS = \
abrt-handle-upload
bin_PROGRAMS = \
- abrt-action-save-package-data
+ abrt-action-save-package-data \
+ abrt-handle-event
sbin_PROGRAMS = \
abrtd \
abrt-server
-libexec_PROGRAMS = abrt-handle-event
-
abrtd_SOURCES = \
abrtd.c
abrtd_CPPFLAGS = \
diff -x '*.po' -d -urpN abrt.8/src/gui-gtk/main.c abrt.9/src/gui-gtk/main.c
--- abrt.8/src/gui-gtk/main.c 2012-06-14 15:49:24.000000000 +0200
+++ abrt.9/src/gui-gtk/main.c 2012-06-26 13:02:23.858892449 +0200
@@ -643,11 +643,19 @@ static void on_row_activated_cb(GtkTreeV
{
if (!is_dbus || chown_dir_over_dbus(dirname) == 0)
{
- report_problem_in_dir(dirname,
- LIBREPORT_ANALYZE | LIBREPORT_NOWAIT | LIBREPORT_GETPID);
+ pid_t pid = fork();
+ if (pid < 0) /* error */
+ perror_msg_and_die("fork");
+ if (pid == 0) /* child */
+ {
+ execl(BIN_DIR"/abrt-handle-event",
"abrt-handle-event", "-e", "report-gui", "--",
(char *)dirname, NULL);
+ execlp("abrt-handle-event", "abrt-handle-event",
"-e", "report-gui", "--", (char *)dirname, NULL);
+ /* Child can't use GUI error reporting, we need to clear
g_custom_logger */
+ g_custom_logger = NULL;
+ perror_msg_and_die("Can't execute '%s'",
"abrt-handle-event");
+ }
}
- //else
- // TODO: show a warning dialog
+ /* else: chown_dir_over_dbus already complained */
}
}
@@ -668,18 +676,11 @@ static void open_problem_data_cb(GtkMenu
perror_msg_and_die("fork");
if (pid == 0) /* child */
{
- struct run_event_state *run_state = new_run_event_state();
- int r = run_event_on_dir_name(run_state, dirname, "open-gui");
- int no_such_event = (r == 0 && run_state->children_count == 0);
- free_run_event_state(run_state);
- if (!no_such_event)
- {
- exit(r);
- }
- /* Default: launch graphical tool */
- execl(BIN_DIR"/report-gtk", "report-gtk", "--",
(char *)dirname, NULL);
- execlp("report-gtk", "report-gtk", "--", (char
*)dirname, NULL);
- perror_msg_and_die("Can't execute %s",
"report-gtk");
+ execl(BIN_DIR"/abrt-handle-event", "abrt-handle-event",
"-e", "open-gui", "--", (char *)dirname, NULL);
+ execlp("abrt-handle-event", "abrt-handle-event",
"-e", "open-gui", "--", (char *)dirname, NULL);
+ /* Child can't use GUI error reporting, we need to clear g_custom_logger
*/
+ g_custom_logger = NULL;
+ perror_msg_and_die("Can't execute '%s'",
"abrt-handle-event");
}
}
}