diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2016-05-02 14:37:16 +0200 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2016-06-20 11:33:41 +0200 |
commit | 10a1b9e18248f08f11af2bb0214fa857d0c9d6fc (patch) | |
tree | 5e26a4be8c90e77a67be89578e2f8f4303ccaab9 | |
parent | f752a953022387cc7e5c4da11d118c12e3716ce4 (diff) | |
download | lvm2-10a1b9e18248f08f11af2bb0214fa857d0c9d6fc.tar.gz |
report: add current report to existing group
Add any report (pvs/vgs/lvs) currently processed to current report group
which is part of processing handle and which already contains log
report. This way both log report and pvs/vgs/lvs report will be
reported as a whole within a group, thus having same output format as
selected by --reportformat option.
-rw-r--r-- | tools/reporter.c | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/tools/reporter.c b/tools/reporter.c index 7bd5d3602..9f4f95a83 100644 --- a/tools/reporter.c +++ b/tools/reporter.c @@ -26,6 +26,8 @@ typedef enum { struct single_report_args { report_type_t report_type; + char report_prefix[32]; + const char *report_name; int args_are_pvs; const char *keys; const char *options; @@ -822,6 +824,32 @@ static int _get_report_selection(struct cmd_context *cmd, return r; } +static int _set_report_prefix_and_name(struct single_report_args *single_args) +{ + const char *report_prefix; + size_t len; + + report_prefix = report_get_field_prefix(single_args->report_type); + len = strlen(report_prefix); + if (report_prefix[len - 1] == '_') + len--; + + if (!len) { + log_error(INTERNAL_ERROR "_set_report_prefix_and_name: no prefix " + "found for report type 0x%x", single_args->report_type); + return 0; + } + + if (!dm_strncpy(single_args->report_prefix, report_prefix, sizeof(single_args->report_prefix))) { + log_error("_set_report_prefix_and_name: dm_strncpy failed"); + return 0; + } + single_args->report_prefix[len] = '\0'; + single_args->report_name = single_args->report_prefix; + + return 1; +} + static int _do_report(struct cmd_context *cmd, struct report_args *args, struct single_report_args *single_args) { struct processing_handle *handle = NULL; @@ -851,6 +879,9 @@ static int _do_report(struct cmd_context *cmd, struct report_args *args, struct &report_type)) goto_out; + if (!dm_report_group_push(handle->report_group, report_handle, (void *) single_args->report_name)) + goto_out; + /* * We lock VG_GLOBAL to enable use of metadata cache. * This can pause alongide pvscan or vgscan process for a while. @@ -959,6 +990,9 @@ static int _config_report(struct cmd_context *cmd, struct report_args *args, str /* Check PV specifics and do extra changes/actions if needed. */ _check_pv_list(cmd, args, single_args); + if (!_set_report_prefix_and_name(single_args)) + return_0; + switch (single_args->report_type) { case DEVTYPES: single_args->keys = find_config_tree_str(cmd, report_devtypes_sort_CFG, NULL); @@ -1141,10 +1175,10 @@ int report_format_init(struct cmd_context *cmd, dm_report_group_type_t *report_g } if (report_command_log) { - if (!*log_rh) { - single_args = &args.single_args[REPORT_IDX_LOG]; - single_args->report_type = CMDLOG; + single_args = &args.single_args[REPORT_IDX_LOG]; + single_args->report_type = CMDLOG; + if (!*log_rh) { if (!_config_report(cmd, &args, single_args)) goto_bad; @@ -1155,19 +1189,21 @@ int report_format_init(struct cmd_context *cmd, dm_report_group_type_t *report_g log_error("Failed to create log report."); goto bad; } + } else { + /* + * We reusing existing log report handle. + * Just get report's name and prefix now. + */ + if (!_set_report_prefix_and_name(single_args)) + goto_bad; } - if (!(dm_report_group_push(new_report_group, *log_rh ? : tmp_log_rh, log_report_name))) { + if (!(dm_report_group_push(new_report_group, tmp_log_rh ? : *log_rh, (void *) single_args->report_name))) { log_error("Failed to add log report to report group."); goto bad; } } - if (!(dm_report_group_push(new_report_group, tmp_log_rh ? : *log_rh, log_report_name))) { - log_error("Failed to add log report to report group."); - goto bad; - } - *report_group = new_report_group; if (tmp_log_rh) *log_rh = tmp_log_rh; |