From 90884eeb92527a8f0dbc2d90b3665b40ada3d426 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Fri, 21 Feb 2014 22:41:05 +0100 Subject: [LIBREPORT PATCH 31/33] introduce import-event-options in xml event definitions Related to rhbz#1069111 Signed-off-by: Jakub Filak --- src/include/event_config.h | 1 + src/lib/event_config.c | 49 +++++++++++++++++++++++++++++++++++++--------- src/lib/event_xml_parser.c | 15 ++++++++++++++ 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/include/event_config.h b/src/include/event_config.h index 24e1eac..e2fcc23 100644 --- a/src/include/event_config.h +++ b/src/include/event_config.h @@ -81,6 +81,7 @@ typedef struct bool ec_skip_review; bool ec_sending_sensitive_data; + GList *ec_imported_event_names; GList *options; } event_config_t; diff --git a/src/lib/event_config.c b/src/lib/event_config.c index 6d12695..b25517d 100644 --- a/src/lib/event_config.c +++ b/src/lib/event_config.c @@ -112,10 +112,8 @@ void free_event_config(event_config_t *p) 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); + g_list_free_full(p->ec_imported_event_names, free); + g_list_free_full(p->options, (GDestroyNotify)free_event_option); free(p); } @@ -282,22 +280,54 @@ GList *export_event_config(const char *event_name) event_config_t *config = get_event_config(event_name); if (config) { + GList *imported = config->ec_imported_event_names; + while (imported) + { + GList *exported = export_event_config(/*Event name*/imported->data); + while (exported) + { + if (!g_list_find_custom(env_list, exported->data, (GCompareFunc)strcmp)) + /* It is not necessary to make a copy of opt->eo_name */ + /* since its memory is owned by event_option_t and it */ + /* has global scope */ + env_list = g_list_prepend(env_list, exported->data); + + exported = g_list_remove_link(exported, exported); + } + + imported = g_list_next(imported); + } + GList *lopt; for (lopt = config->options; lopt; lopt = lopt->next) { event_option_t *opt = lopt->data; if (!opt->eo_value) continue; - char *var_val = xasprintf("%s=%s", opt->eo_name, opt->eo_value); - log_debug("Exporting '%s'", var_val); - env_list = g_list_prepend(env_list, var_val); - putenv(var_val); + + log_debug("Exporting '%s=%s'", opt->eo_name, opt->eo_value); + + /* Add the exported key only if it is not in the list */ + if (!g_list_find_custom(env_list, opt->eo_name, (GCompareFunc)strcmp)) + /* It is not necessary to make a copy of opt->eo_name */ + /* since its memory is owned by opt and it has global scope */ + env_list = g_list_prepend(env_list, opt->eo_name); + + /* setenv() makes copies of strings */ + xsetenv(opt->eo_name, opt->eo_value); } } return env_list; } +/* + * Goes through given list and calls unsetnev() for each list item. + * + * Accepts a list of 'const char *' type items which contains names of exported + * environment variables and which was returned from export_event_config() + * function. + */ void unexport_event_config(GList *env_list) { while (env_list) @@ -305,8 +335,9 @@ void unexport_event_config(GList *env_list) char *var_val = env_list->data; log_debug("Unexporting '%s'", var_val); safe_unsetenv(var_val); + + /* The list doesn't own memory of values: see export_event_config() */ env_list = g_list_remove(env_list, var_val); - free(var_val); } } diff --git a/src/lib/event_xml_parser.c b/src/lib/event_xml_parser.c index 1f98158..a15f1e1 100644 --- a/src/lib/event_xml_parser.c +++ b/src/lib/event_xml_parser.c @@ -40,6 +40,7 @@ #define EXCL_ALWAYS_ELEMENT "exclude-items-always" #define EXCL_BINARY_ELEMENT "exclude-binary-items" #define ADV_OPTIONS_ELEMENT "advanced-options" +#define IMPORT_OPTIONS_ELEMENT "import-event-options" typedef struct { @@ -210,6 +211,20 @@ static void start_element(GMarkupParseContext *context, } } else + if (strcmp(element_name, IMPORT_OPTIONS_ELEMENT) == 0) + { + if (attribute_names[0] == NULL + || attribute_names[1] != NULL + || strcmp(attribute_names[0], "event") != 0) + { + error_msg("XML event configuration error: import-event-options element misses attribute 'event'"); + return; + } + + GList *head = parse_data->event_config.values->ec_imported_event_names; + parse_data->event_config.values->ec_imported_event_names = g_list_append(head, xstrdup(attribute_values[0])); + } + else if (strcmp(element_name, LABEL_ELEMENT) == 0 || strcmp(element_name, DESCRIPTION_ELEMENT) == 0 || strcmp(element_name, LONG_DESCR_ELEMENT) == 0 -- 1.8.3.1