[lvm-devel] master - report: recognize list of fields to report (-o|--options) for each subreport
Peter Rajnoha
prajnoha at fedoraproject.org
Mon Jun 20 09:40:52 UTC 2016
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=bd26684d5d9f44f7677f6e30a461542d4280a1b9
Commit: bd26684d5d9f44f7677f6e30a461542d4280a1b9
Parent: 80ffaefb88917f77eafdf36dd4f882cc65706050
Author: Peter Rajnoha <prajnoha at redhat.com>
AuthorDate: Wed May 4 14:07:45 2016 +0200
Committer: Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Mon Jun 20 11:33:42 2016 +0200
report: recognize list of fields to report (-o|--options) for each subreport
---
tools/reporter.c | 124 +++++++++++++++++++++++++++++++++++-------------------
1 files changed, 81 insertions(+), 43 deletions(-)
diff --git a/tools/reporter.c b/tools/reporter.c
index 103ae2c..c081e1c 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -694,7 +694,6 @@ static void _del_option_from_list(struct dm_list *sll, const char *prefix,
struct dm_str_list *sl;
const char *a = str, *b;
- prefix_len--;
dm_list_uniterate(slh, sll, sll) {
sl = dm_list_item(slh, struct dm_str_list);
@@ -764,38 +763,61 @@ static int _should_process_report_idx(report_type_t report_type, report_idx_t id
return 1;
}
+enum opts_list_type {
+ OPTS_REPLACE,
+ OPTS_ADD,
+ OPTS_REMOVE,
+ OPTS_COMPACT
+};
+
static int _get_report_options(struct cmd_context *cmd,
struct report_args *args,
struct single_report_args *single_args)
{
- const char *prefix = report_get_field_prefix(single_args->report_type);
- size_t prefix_len = strlen(prefix);
+ int action;
struct arg_value_group_list *current_group;
- struct dm_list *final_opts_list;
- struct dm_list *final_compact_list = NULL;
+ struct dm_list *final_opts_list[REPORT_IDX_COUNT];
struct dm_list *opts_list = NULL;
struct dm_str_list *sl;
- const char *opts;
struct dm_pool *mem;
- int r = ECMD_PROCESSED;
+ const char *report_name = NULL;
+ const char *opts;
+ report_idx_t idx = REPORT_IDX_SINGLE;
+ int r = ECMD_FAILED;
if (!arg_count(cmd, options_ARG))
return ECMD_PROCESSED;
if (!(mem = dm_pool_create("report_options", 128))) {
log_error("Failed to create temporary mempool to process report options.");
- return ECMD_FAILED;
+ goto out;
}
- if (!(final_opts_list = str_to_str_list(mem, single_args->options, ",", 1))) {
- r = ECMD_FAILED;
- goto_out;
+ if (single_args->report_type == CMDLOG) {
+ if (!(final_opts_list[REPORT_IDX_LOG] = str_to_str_list(mem, single_args->options, ",", 1)))
+ goto_out;
+ } else if (single_args->report_type == FULL) {
+ if (!(final_opts_list[REPORT_IDX_FULL_VGS] = str_to_str_list(mem, args->single_args[REPORT_IDX_FULL_VGS].options, ",", 1)) ||
+ !(final_opts_list[REPORT_IDX_FULL_PVS] = str_to_str_list(mem, args->single_args[REPORT_IDX_FULL_PVS].options, ",", 1)) ||
+ !(final_opts_list[REPORT_IDX_FULL_LVS] = str_to_str_list(mem, args->single_args[REPORT_IDX_FULL_LVS].options, ",", 1)) ||
+ !(final_opts_list[REPORT_IDX_FULL_PVSEGS] = str_to_str_list(mem, args->single_args[REPORT_IDX_FULL_PVSEGS].options, ",", 1)) ||
+ !(final_opts_list[REPORT_IDX_FULL_SEGS] = str_to_str_list(mem, args->single_args[REPORT_IDX_FULL_SEGS].options, ",", 1)))
+ goto_out;
+ } else {
+ if (!(final_opts_list[REPORT_IDX_SINGLE] = str_to_str_list(mem, single_args->options, ",", 1)))
+ goto_out;
}
dm_list_iterate_items(current_group, &cmd->arg_value_groups) {
if (!grouped_arg_is_set(current_group->arg_values, options_ARG))
continue;
+ if (grouped_arg_is_set(current_group->arg_values, configreport_ARG)) {
+ report_name = grouped_arg_str_value(current_group->arg_values, configreport_ARG, NULL);
+ if ((idx = _get_report_idx_from_name(single_args->report_type, report_name)) == REPORT_IDX_NULL)
+ goto_out;
+ }
+
opts = grouped_arg_str_value(current_group->arg_values, options_ARG, NULL);
if (!opts || !*opts) {
log_error("Invalid options string: %s", opts);
@@ -805,48 +827,64 @@ static int _get_report_options(struct cmd_context *cmd,
switch (*opts) {
case '+':
- /* fall through */
+ action = OPTS_ADD;
+ opts++;
+ break;
case '-':
- /* fall through */
+ action = OPTS_REMOVE;
+ opts++;
+ break;
case '#':
- if (!(opts_list = str_to_str_list(mem, opts + 1, ",", 1))) {
- r = ECMD_FAILED;
- goto_out;
- }
- if (*opts == '+') {
- dm_list_splice(final_opts_list, opts_list);
- } else if (*opts == '-') {
- dm_list_iterate_items(sl, opts_list)
- _del_option_from_list(final_opts_list, prefix,
- prefix_len, sl->str);
- } else if (*opts == '#') {
- if (!final_compact_list)
- final_compact_list = opts_list;
- else
- dm_list_splice(final_compact_list, opts_list);
- }
+ action = OPTS_COMPACT;
+ opts++;
break;
default:
- if (!(final_opts_list = str_to_str_list(mem, opts, ",", 1))) {
- r = ECMD_FAILED;
- goto_out;
- }
+ action = OPTS_REPLACE;
}
- }
- if (!(single_args->options = str_list_to_str(cmd->mem, final_opts_list, ","))) {
- r = ECMD_FAILED;
- goto_out;
+ if (!_should_process_report_idx(single_args->report_type, idx))
+ continue;
+
+ if ((action != OPTS_COMPACT) &&
+ !(opts_list = str_to_str_list(mem, opts, ",", 1)))
+ goto_out;
+
+ switch (action) {
+ case OPTS_ADD:
+ dm_list_splice(final_opts_list[idx], opts_list);
+ break;
+ case OPTS_REMOVE:
+ dm_list_iterate_items(sl, opts_list)
+ _del_option_from_list(final_opts_list[idx], args->single_args[idx].report_prefix,
+ strlen(args->single_args[idx].report_prefix), sl->str);
+ break;
+ case OPTS_COMPACT:
+ args->single_args[idx].fields_to_compact = opts;
+ break;
+ case OPTS_REPLACE:
+ final_opts_list[idx] = opts_list;
+ break;
+ }
}
- if (final_compact_list &&
- !(single_args->fields_to_compact = str_list_to_str(cmd->mem, final_compact_list, ","))) {
- dm_pool_free(cmd->mem, (char *) single_args->options);
- r = ECMD_FAILED;
- goto_out;
+
+ if (single_args->report_type == CMDLOG) {
+ if (!(single_args->options = str_list_to_str(cmd->mem, final_opts_list[REPORT_IDX_LOG], ",")))
+ goto_out;
+ } else if (single_args->report_type == FULL) {
+ if (!(args->single_args[REPORT_IDX_FULL_VGS].options = str_list_to_str(cmd->mem, final_opts_list[REPORT_IDX_FULL_VGS], ",")) ||
+ !(args->single_args[REPORT_IDX_FULL_PVS].options = str_list_to_str(cmd->mem, final_opts_list[REPORT_IDX_FULL_PVS], ",")) ||
+ !(args->single_args[REPORT_IDX_FULL_LVS].options = str_list_to_str(cmd->mem, final_opts_list[REPORT_IDX_FULL_LVS], ",")) ||
+ !(args->single_args[REPORT_IDX_FULL_PVSEGS].options = str_list_to_str(cmd->mem, final_opts_list[REPORT_IDX_FULL_PVSEGS], ",")) ||
+ !(args->single_args[REPORT_IDX_FULL_SEGS].options = str_list_to_str(cmd->mem, final_opts_list[REPORT_IDX_FULL_SEGS], ",")))
+ goto_out;
+ } else {
+ if (!(single_args->options = str_list_to_str(cmd->mem, final_opts_list[REPORT_IDX_SINGLE], ",")))
+ goto_out;
}
+
+ r = ECMD_PROCESSED;
out:
dm_pool_destroy(mem);
-
return r;
}
More information about the lvm-devel
mailing list