Blame SOURCES/0146-lib-get-possible-events-for-problem_data_t.patch

4b6aa8
From fc028b3417349fd60a2ddd1aff1127a417df512b Mon Sep 17 00:00:00 2001
4b6aa8
From: Jakub Filak <jfilak@redhat.com>
4b6aa8
Date: Thu, 2 Jul 2015 15:04:06 +0200
4b6aa8
Subject: [PATCH] lib: get possible events for problem_data_t
4b6aa8
4b6aa8
Certainly useful when we have no file system access to dump directories
4b6aa8
and we only get a problem data via a D-Bus service.
4b6aa8
4b6aa8
Related: #1224984
4b6aa8
4b6aa8
Signed-off-by: Jakub Filak <jfilak@redhat.com>
4b6aa8
---
4b6aa8
 src/include/run_event.h |  8 +++++++
4b6aa8
 src/lib/glib_support.c  |  2 +-
4b6aa8
 src/lib/run_event.c     | 56 +++++++++++++++++++++++++++++++++++--------------
4b6aa8
 3 files changed, 49 insertions(+), 17 deletions(-)
4b6aa8
4b6aa8
diff --git a/src/include/run_event.h b/src/include/run_event.h
4b6aa8
index 7579e8f..bc43d4f 100644
4b6aa8
--- a/src/include/run_event.h
4b6aa8
+++ b/src/include/run_event.h
4b6aa8
@@ -186,6 +186,9 @@ int run_event_on_problem_data(struct run_event_state *state, problem_data_t *dat
4b6aa8
  */
4b6aa8
 char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx);
4b6aa8
 
4b6aa8
+/* Like list_possible_events but accepts problem_data_t */
4b6aa8
+char *list_possible_events_problem_data(problem_data_t *pd, const char *dump_dir_name, const char *pfx);
4b6aa8
+
4b6aa8
 /*
4b6aa8
  * Returns a list of possible events for given problem directory
4b6aa8
  *
4b6aa8
@@ -195,6 +198,11 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const
4b6aa8
 GList *list_possible_events_glist(const char *problem_dir_name,
4b6aa8
                                   const char *pfx);
4b6aa8
 
4b6aa8
+/* Like list_possible_events_glist but accepts problem_data_t */
4b6aa8
+GList *list_possible_events_problem_data_glist(problem_data_t *pd,
4b6aa8
+                                  const char *problem_dir_name,
4b6aa8
+                                  const char *pfx);
4b6aa8
+
4b6aa8
 /* Command line run event callback implemenetation */
4b6aa8
 
4b6aa8
 /*
4b6aa8
diff --git a/src/lib/glib_support.c b/src/lib/glib_support.c
4b6aa8
index 02c2dfd..2751b0c 100644
4b6aa8
--- a/src/lib/glib_support.c
4b6aa8
+++ b/src/lib/glib_support.c
4b6aa8
@@ -92,7 +92,7 @@ GList *parse_list(const char* list)
4b6aa8
 
4b6aa8
     char *tmp_list = xstrdup(list);
4b6aa8
 
4b6aa8
-    GList *l = parse_delimited_list(list, LIST_DELIMITER);
4b6aa8
+    GList *l = parse_delimited_list(tmp_list, LIST_DELIMITER);
4b6aa8
 
4b6aa8
     free(tmp_list);
4b6aa8
 
4b6aa8
diff --git a/src/lib/run_event.c b/src/lib/run_event.c
4b6aa8
index a56cf88..252c6bc 100644
4b6aa8
--- a/src/lib/run_event.c
4b6aa8
+++ b/src/lib/run_event.c
4b6aa8
@@ -298,11 +298,17 @@ static int regcmp_lines(char *val, const char *regex)
4b6aa8
 static char* pop_next_command(GList **pp_rule_list,
4b6aa8
         char **pp_event_name,    /* reports EVENT value thru this, if not NULL on entry */
4b6aa8
         struct dump_dir **pp_dd, /* use *pp_dd for access to dump dir, if non-NULL */
4b6aa8
+        problem_data_t *pd,     /* use *pp for access to problem data, if non-NULL */
4b6aa8
         const char *dump_dir_name,
4b6aa8
         const char *pfx,
4b6aa8
         unsigned pfx_len
4b6aa8
 )
4b6aa8
 {
4b6aa8
+    /* It is an error to pass both, but we can recover from it and use only
4b6aa8
+     * problem_data_t in that case */
4b6aa8
+    if (pp_dd != NULL && pd != NULL)
4b6aa8
+        error_msg("BUG: both dump dir and problem data passed to %s()", __func__);
4b6aa8
+
4b6aa8
     char *command = NULL;
4b6aa8
     struct dump_dir *dd = pp_dd ? *pp_dd : NULL;
4b6aa8
 
4b6aa8
@@ -331,7 +337,7 @@ static char* pop_next_command(GList **pp_rule_list,
4b6aa8
             else
4b6aa8
             {
4b6aa8
                 /* Read from dump dir and compare */
4b6aa8
-                if (!dd)
4b6aa8
+                if (!dd && pd == NULL)
4b6aa8
                 {
4b6aa8
                     /* Without dir to match, we assume match for all conditions */
4b6aa8
                     if (!dump_dir_name)
4b6aa8
@@ -349,10 +355,15 @@ static char* pop_next_command(GList **pp_rule_list,
4b6aa8
                 /* Is it "VAR!=VAL"? */
4b6aa8
                 int inverted = (eq_sign > cond_str && eq_sign[-1] == '!');
4b6aa8
                 char *var_name = xstrndup(cond_str, eq_sign - cond_str - (regex|inverted));
4b6aa8
-                char *real_val = dd_load_text_ext(dd, var_name, DD_FAIL_QUIETLY_ENOENT);
4b6aa8
+                char *real_val = NULL;
4b6aa8
+                char *free_me = NULL;
4b6aa8
+                if (pd == NULL)
4b6aa8
+                    free_me = real_val = dd_load_text_ext(dd, var_name, DD_FAIL_QUIETLY_ENOENT);
4b6aa8
+                else
4b6aa8
+                    real_val = problem_data_get_content_or_NULL(pd, var_name);
4b6aa8
                 free(var_name);
4b6aa8
                 int vals_differ = regex ? regcmp_lines(real_val, eq_sign + 1) : strcmp(real_val, eq_sign + 1);
4b6aa8
-                free(real_val);
4b6aa8
+                free(free_me);
4b6aa8
                 if (inverted)
4b6aa8
                     vals_differ = !vals_differ;
4b6aa8
 
4b6aa8
@@ -422,6 +433,7 @@ int spawn_next_command(struct run_event_state *state,
4b6aa8
     char *cmd = pop_next_command(&state->rule_list,
4b6aa8
                 NULL,          /* don't return event_name */
4b6aa8
                 NULL,          /* NULL dd: we match by... */
4b6aa8
+                NULL,          /* no problem data */
4b6aa8
                 dump_dir_name, /* ...dirname */
4b6aa8
                 event, strlen(event)+1 /* for this event name exactly (not prefix) */
4b6aa8
     );
4b6aa8
@@ -648,7 +660,8 @@ int run_event_on_problem_data(struct run_event_state *state, problem_data_t *dat
4b6aa8
     return r;
4b6aa8
 }
4b6aa8
 
4b6aa8
-char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx)
4b6aa8
+
4b6aa8
+static char *_list_possible_events(struct dump_dir **dd, problem_data_t *pd, const char *dump_dir_name, const char *pfx)
4b6aa8
 {
4b6aa8
     struct strbuf *result = strbuf_new();
4b6aa8
 
4b6aa8
@@ -661,7 +674,8 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const
4b6aa8
         char *event_name = NULL;
4b6aa8
         char *cmd = pop_next_command(&rule_list,
4b6aa8
                 &event_name,       /* return event_name */
4b6aa8
-                (dd ? &dd : NULL), /* match this dd... */
4b6aa8
+                dd,                /* match this dd... */
4b6aa8
+                pd,                /* no problem data */
4b6aa8
                 dump_dir_name,     /* ...or if NULL, this dirname */
4b6aa8
                 pfx, pfx_len       /* for events with this prefix */
4b6aa8
         );
4b6aa8
@@ -695,24 +709,34 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const
4b6aa8
     return strbuf_free_nobuf(result);
4b6aa8
 }
4b6aa8
 
4b6aa8
+char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx)
4b6aa8
+{
4b6aa8
+    return _list_possible_events((dd ? &dd : NULL), NULL, dump_dir_name, pfx);
4b6aa8
+}
4b6aa8
+
4b6aa8
+char *list_possible_events_problem_data(problem_data_t *pd, const char *dump_dir_name, const char *pfx)
4b6aa8
+{
4b6aa8
+    return _list_possible_events(NULL, pd, dump_dir_name, pfx);
4b6aa8
+}
4b6aa8
+
4b6aa8
 GList *list_possible_events_glist(const char *problem_dir_name,
4b6aa8
                                   const char *pfx)
4b6aa8
 {
4b6aa8
     struct dump_dir *dd = dd_opendir(problem_dir_name, DD_OPEN_READONLY);
4b6aa8
-    GList *l = NULL;
4b6aa8
     char *events = list_possible_events(dd, problem_dir_name, pfx);
4b6aa8
-    char *start = events;
4b6aa8
-    char *end = strchr(events, '\n');
4b6aa8
+    GList *l = parse_delimited_list(events, "\n");
4b6aa8
+    dd_close(dd);
4b6aa8
+    free(events);
4b6aa8
 
4b6aa8
-    while(end)
4b6aa8
-    {
4b6aa8
-        *end = '\0';
4b6aa8
-        l = g_list_append(l, xstrdup(start));
4b6aa8
-        start = end + 1;
4b6aa8
-        end = strchr(start, '\n');
4b6aa8
-    }
4b6aa8
+    return l;
4b6aa8
+}
4b6aa8
 
4b6aa8
-    dd_close(dd);
4b6aa8
+GList *list_possible_events_problem_data_glist(problem_data_t *pd,
4b6aa8
+                                  const char *problem_dir_name,
4b6aa8
+                                  const char *pfx)
4b6aa8
+{
4b6aa8
+    char *events = list_possible_events_problem_data(pd, problem_dir_name, pfx);
4b6aa8
+    GList *l = parse_delimited_list(events, "\n");
4b6aa8
     free(events);
4b6aa8
 
4b6aa8
     return l;
4b6aa8
-- 
4b6aa8
2.4.3
4b6aa8