summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-06-01 17:57:31 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2011-06-01 17:57:31 +0200
commit2fa751f6d98995e73db4d0edd0d22b9560281644 (patch)
treecc5ed9575493d38d19db783324d329d2e43fe94d /src/lib
parentf4e4a76f3ca70f0bad636e324c43d3da993df854 (diff)
downloadabrt-2fa751f6d98995e73db4d0edd0d22b9560281644.tar.gz
abrt-2fa751f6d98995e73db4d0edd0d22b9560281644.tar.xz
abrt-2fa751f6d98995e73db4d0edd0d22b9560281644.zip
wizard: hook selection checkboxes to reporters.
Checkboxes are controlled by the following elements in .xml: <requires-items> ITEM1,ITEM2 </requires-items> <exclude-items-by-default> ITEM1,ITEM2 </exclude-items-by-default> <exclude-items-always> ITEM1,ITEM2 </exclude-items-always> <exclude-binary-items> yes / no </exclude-binary-items> <include-items-by-default> ITEM1,ITEM2 </include-items-by-default> exclude-items-by-default and exclude-items-always can be "*" meaning "all". include-items-by-default specifies which items are included (checked) is exclude-items-by-default is "*". Else, all are checked by default. the set of iters NOT included is passed in $EXCLUDE_FROM_REPORT variable. bugzilla, kerneloops, mailx, print and rhtsupport are made aware of this variable. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/event_config.c13
-rw-r--r--src/lib/event_xml_parser.c45
-rw-r--r--src/lib/problem_data.c79
-rw-r--r--src/lib/report.c2
-rw-r--r--src/lib/run_event.c2
5 files changed, 120 insertions, 21 deletions
diff --git a/src/lib/event_config.c b/src/lib/event_config.c
index 9f48af54..38da44ef 100644
--- a/src/lib/event_config.c
+++ b/src/lib/event_config.c
@@ -46,19 +46,22 @@ void free_event_option(event_option_t *p)
void free_event_config(event_config_t *p)
{
- GList *opt;
-
if (!p)
return;
+
free(p->screen_name);
- //free(p->title);
- //free(p->action);
free(p->description);
free(p->long_descr);
- free(p->creates_elements);
+ free(p->ec_creates_items);
+ free(p->ec_requires_items);
+ free(p->ec_exclude_items_by_default);
+ free(p->ec_include_items_by_default);
+ free(p->ec_exclude_items_always);
+ GList *opt;
for (opt = p->options; opt; opt = opt->next)
free_event_option(opt->data);
g_list_free(p->options);
+
free(p);
}
diff --git a/src/lib/event_xml_parser.c b/src/lib/event_xml_parser.c
index 5bf5f411..b2037cd9 100644
--- a/src/lib/event_xml_parser.c
+++ b/src/lib/event_xml_parser.c
@@ -25,12 +25,19 @@
#define LONG_DESCR_ELEMENT "long-description"
#define ALLOW_EMPTY_ELEMENT "allow-empty"
#define NOTE_HTML_ELEMENT "note-html"
-#define CREATES_ELEMENT "creates-elements"
+#define CREATES_ELEMENT "creates-items"
#define OPTION_ELEMENT "option"
//#define ACTION_ELEMENT "action"
#define NAME_ELEMENT "name"
#define DEFAULT_VALUE_ELEMENT "default-value"
+#define REQUIRES_ELEMENT "requires-items"
+#define EXCL_BY_DEFAULT_ELEMENT "exclude-items-by-default"
+#define INCL_BY_DEFAULT_ELEMENT "include-items-by-default"
+#define EXCL_ALWAYS_ELEMENT "exclude-items-always"
+#define EXCL_BINARY_ELEMENT "exclude-binary-items"
+
+
struct my_parse_data
{
event_config_t *event_config;
@@ -305,9 +312,9 @@ static void text(GMarkupParseContext *context,
*/
if (strcmp(inner_element, CREATES_ELEMENT) == 0)
{
- VERB2 log("creates_elements:'%s'", text_copy);
- free(ui->creates_elements);
- ui->creates_elements = text_copy;
+ VERB2 log("ec_creates_items:'%s'", text_copy);
+ free(ui->ec_creates_items);
+ ui->ec_creates_items = text_copy;
return;
}
if (strcmp(inner_element, NAME_ELEMENT) == 0)
@@ -363,6 +370,36 @@ static void text(GMarkupParseContext *context,
}
return;
}
+ if (strcmp(inner_element, REQUIRES_ELEMENT) == 0)
+ {
+ free(ui->ec_requires_items);
+ ui->ec_requires_items = text_copy;
+ return;
+ }
+ if (strcmp(inner_element, EXCL_BY_DEFAULT_ELEMENT) == 0)
+ {
+ free(ui->ec_exclude_items_by_default);
+ ui->ec_exclude_items_by_default = text_copy;
+ return;
+ }
+ if (strcmp(inner_element, INCL_BY_DEFAULT_ELEMENT) == 0)
+ {
+ free(ui->ec_include_items_by_default);
+ ui->ec_include_items_by_default = text_copy;
+ return;
+ }
+ if (strcmp(inner_element, EXCL_ALWAYS_ELEMENT) == 0)
+ {
+ free(ui->ec_exclude_items_always);
+ ui->ec_exclude_items_always = text_copy;
+ return;
+ }
+ if (strcmp(inner_element, EXCL_BINARY_ELEMENT) == 0)
+ {
+ ui->ec_exclude_binary_items = string_to_bool(text_copy);
+ free(text_copy);
+ return;
+ }
}
free(text_copy);
}
diff --git a/src/lib/problem_data.c b/src/lib/problem_data.c
index 87821afd..7ef1f681 100644
--- a/src/lib/problem_data.c
+++ b/src/lib/problem_data.c
@@ -265,7 +265,7 @@ static char* is_text_file(const char *name, ssize_t *sz)
return NULL; /* it's binary */
}
-void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_dir *dd)
+void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_dir *dd, char **excluding)
{
char *short_name;
char *full_name;
@@ -273,6 +273,12 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d
dd_init_next_file(dd);
while (dd_get_next_file(dd, &short_name, &full_name))
{
+ if (excluding && is_in_string_list(short_name, excluding))
+ {
+ //log("Excluded:'%s'", short_name);
+ goto next;
+ }
+
ssize_t sz = 4*1024;
char *text = NULL;
bool editable = is_editable_file(short_name);
@@ -287,20 +293,15 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d
full_name,
CD_FLAG_BIN + CD_FLAG_ISNOTEDITABLE
);
- free(short_name);
- free(full_name);
- continue;
+ goto next;
}
}
char *content;
if (sz < 4*1024) /* did is_text_file read entire file? */
{
+ /* yes */
content = text;
- /* Strip '\n' from one-line elements: */
- char *nl = strchr(content, '\n');
- if (nl && nl[1] == '\0')
- *nl = '\0';
}
else
{
@@ -308,6 +309,10 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d
free(text);
content = dd_load_text(dd, short_name);
}
+ /* Strip '\n' from one-line elements: */
+ char *nl = strchr(content, '\n');
+ if (nl && nl[1] == '\0')
+ *nl = '\0';
int flags = 0;
@@ -335,16 +340,70 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d
content,
flags
);
+ free(content);
+ next:
free(short_name);
free(full_name);
- free(content);
}
}
problem_data_t *create_problem_data_from_dump_dir(struct dump_dir *dd)
{
problem_data_t *problem_data = new_problem_data();
- load_problem_data_from_dump_dir(problem_data, dd);
+ load_problem_data_from_dump_dir(problem_data, dd, NULL);
+ return problem_data;
+}
+
+/*
+ * Returns NULL-terminated char *vector[]. Result itself must be freed,
+ * but do no free list elements. IOW: do free(result), but never free(result[i])!
+ * If comma_separated_list is NULL or "", returns NULL.
+ */
+static char **build_exclude_vector(const char *comma_separated_list)
+{
+ char **exclude_items = NULL;
+ if (comma_separated_list && comma_separated_list[0])
+ {
+ /* even w/o commas, we'll need two elements:
+ * exclude_items[0] = "name"
+ * exclude_items[1] = NULL
+ */
+ unsigned cnt = 2;
+
+ const char *cp = comma_separated_list;
+ while (*cp)
+ if (*cp++ == ',')
+ cnt++;
+
+ /* We place the string directly after the char *vector[cnt]: */
+ exclude_items = xzalloc(cnt * sizeof(exclude_items[0]) + (cp - comma_separated_list) + 1);
+ char *p = strcpy((char*)&exclude_items[cnt], comma_separated_list);
+
+ char **pp = exclude_items;
+ *pp++ = p;
+ while (*p)
+ {
+ if (*p++ == ',')
+ {
+ p[-1] = '\0';
+ *pp++ = p;
+ }
+ }
+ }
+
+ return exclude_items;
+}
+
+problem_data_t *create_problem_data_for_reporting(const char *dump_dir_name)
+{
+ char **exclude_items = build_exclude_vector(getenv("EXCLUDE_FROM_REPORT"));
+ struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
+ if (!dd)
+ return NULL; /* dd_opendir already emitted error msg */
+ problem_data_t *problem_data = new_problem_data();
+ load_problem_data_from_dump_dir(problem_data, dd, exclude_items);
+ dd_close(dd);
+ free(exclude_items);
return problem_data;
}
diff --git a/src/lib/report.c b/src/lib/report.c
index 07299e48..137f7b16 100644
--- a/src/lib/report.c
+++ b/src/lib/report.c
@@ -114,7 +114,7 @@ int report_problem_in_memory(problem_data_t *pd, int flags)
if (dd)
{
if (flags & LIBREPORT_RELOAD_DATA)
- load_problem_data_from_dump_dir(pd, dd);
+ load_problem_data_from_dump_dir(pd, dd, NULL);
dd_delete(dd);
}
}
diff --git a/src/lib/run_event.c b/src/lib/run_event.c
index 856f3264..0d291287 100644
--- a/src/lib/run_event.c
+++ b/src/lib/run_event.c
@@ -500,7 +500,7 @@ int run_event_on_problem_data(struct run_event_state *state, problem_data_t *dat
free(dir_name);
if (dd)
{
- load_problem_data_from_dump_dir(data, dd);
+ load_problem_data_from_dump_dir(data, dd, NULL);
dd_delete(dd);
}