I think this one's OK, except one thing (see below).
On Wed, Oct 10, 2012 at 15:47:14 +0200, Jakub Filak wrote:
- for a crash of vim the command $ 'report-gtk -e collect_* --
$DUMP_DIR' will execute in the current default configuration the
following list of events:
collect_smolt
collect_vimrc_user
collect_vimrc_system
- a part of rhbz#864014
Signed-off-by: Jakub Filak <jfilak(a)redhat.com>
---
src/gui-wizard-gtk/main.c | 4 +++
src/gui-wizard-gtk/wizard.c | 81 ++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 76 insertions(+), 9 deletions(-)
diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c
index 691d343..fab88f1 100644
--- a/src/gui-wizard-gtk/main.c
+++ b/src/gui-wizard-gtk/main.c
@@ -126,6 +126,10 @@ int main(int argc, char **argv)
if (!argv[0] || argv[1]) /* zero or >1 arguments */
show_usage_and_die(program_usage_string, program_options);
+ /* Allow algorithms to add mallocated strings */
+ for (GList *elem = g_auto_event_list; elem; elem = g_list_next(elem))
+ elem->data = xstrdup((const char *)elem->data);
+
export_abrt_envvars(opts & OPT_p);
g_dump_dir_name = xstrdup(argv[0]);
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index 421db98..d62be32 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -199,8 +199,8 @@ static void clear_warnings(void);
static void show_warnings(void);
static void add_warning(const char *warning);
static bool check_minimal_bt_rating(const char *event_name);
-static const char *get_next_processed_event(GList **events_list);
-static const char *setup_next_processed_event(GList **events_list);
+static char *get_next_processed_event(GList **events_list);
+static char *setup_next_processed_event(GList **events_list);
static void setup_and_start_even_run(const char *event_name);
static void on_next_btn_cb(GtkWidget *btn, gpointer user_data);
@@ -1519,6 +1519,7 @@ static void terminate_event_chain()
if (g_expert_mode)
return;
+ g_list_free_full(g_auto_event_list, free);
g_auto_event_list = NULL;
update_gui_on_finished_reporting();
}
@@ -2228,12 +2229,70 @@ static void setup_and_start_even_run(const char *event_name)
);
}
-static const char *get_next_processed_event(GList **events_list)
+static char *get_next_processed_event(GList **events_list)
{
if (!events_list || !*events_list)
return NULL;
- const char *event_name = (const char *)(*events_list)->data;
+ char *event_name = (char *)(*events_list)->data;
+ const size_t event_len = strlen(event_name);
+
+ /* pop the current event */
+ *events_list = g_list_delete_link(*events_list, *events_list);
+
+ if (event_name[event_len - 1] == '*')
+ {
+ VERB2 log("Expanding event '%s'", event_name);
+
+ struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
+ if (!dd)
+ error_msg_and_die("Can't open directory '%s'",
g_dump_dir_name);
+
+ /* Erase '*' */
+ event_name[event_len - 1] = '\0';
+
+ /* get 'event1\nevent2\nevent3\n' or '' if no event is possible
*/
+ char *expanded_events = list_possible_events(dd, g_dump_dir_name, event_name);
+
+ dd_close(dd);
+ free(event_name);
+
+ GList *expanded_list = NULL;
+ /* add expanded events from event having trailing '*' */
+ char *next = event_name = expanded_events;
+ while ((next = strchr(event_name, '\n')))
+ {
+ /* 'event1\0event2\nevent3\n' */
+ next[0] = '\0';
+
+ /* 'event1' */
+ event_name = xstrdup(event_name);
+ VERB3 log("Adding a new expanded event '%s' to the processed
list", event_name);
+
+ /* the last event is not added to the expanded list */
+ ++next;
+ if (next[0] == '\0')
+ break;
+
+ expanded_list = g_list_prepend(expanded_list, event_name);
+
+ /* 'event2\nevent3\n' */
+ event_name = next + 1;
The + 1 should not be there because you incremented 'next' already (and
there are no ollect events in my /etc;).
+ }
+
+ free(expanded_events);
+
+ /* It's OK we can safely compare address even if them were previously freed
*/
+ if (event_name != expanded_events)
+ /* the last expanded event name is stored in event_name */
+ *events_list = g_list_concat(expanded_list, *events_list);
+ else
+ {
+ VERB2 log("No event was expanded, will continue continue with the next
one.");
+ /* no expanded event try the next event */
+ return get_next_processed_event(events_list);
+ }
+ }
clear_warnings();
const bool acceptable = check_minimal_bt_rating(event_name);
@@ -2241,17 +2300,20 @@ static const char *get_next_processed_event(GList **events_list)
if (!acceptable)
{
+ /* a node for this event was already removed */
+ free(event_name);
+
+ g_list_free_full(*events_list, free);
*events_list = NULL;
return NULL;
}
- *events_list = g_list_next(*events_list);
return event_name;
}
-static const char *setup_next_processed_event(GList **events_list)
+static char *setup_next_processed_event(GList **events_list)
{
- const char *event = get_next_processed_event(&g_auto_event_list);
+ char *event = get_next_processed_event(&g_auto_event_list);
if (!event)
{
free(g_event_selected);
@@ -2381,7 +2443,7 @@ static gint select_next_page_no(gint current_page_no, gpointer
data)
{
if (!g_expert_mode)
{
- const char *event = setup_next_processed_event(&g_auto_event_list);
+ char *event = setup_next_processed_event(&g_auto_event_list);
if (!event)
{
current_page_no = pages[PAGENO_EVENT_PROGRESS].page_no - 1;
@@ -2392,6 +2454,7 @@ static gint select_next_page_no(gint current_page_no, gpointer
data)
if (!get_sensitive_data_permission(event))
{
+ free(event);
g_event_selected = NULL;
gtk_label_set_text(g_lbl_event_log, _("Processing was
cancelled"));
terminate_event_chain();
@@ -2399,7 +2462,7 @@ static gint select_next_page_no(gint current_page_no, gpointer
data)
goto again;
}
- g_event_selected = xstrdup(event);
+ g_event_selected = event;
if (check_event_config(g_event_selected) != 0)
{
--
1.7.11.4