summaryrefslogtreecommitdiff
path: root/libdm/libdm-report.c
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2015-10-16 15:50:13 +0200
committerPeter Rajnoha <prajnoha@redhat.com>2015-10-16 17:05:54 +0200
commit508f0f5a21af8decf32944e01ecf17c0059a9c9f (patch)
tree1c9e58d9f01433fc10b1a7a9e13d3ca6effee448 /libdm/libdm-report.c
parentdf34fcdafd20ac195e588a06c8fc5a904fa71669 (diff)
downloadlvm2-508f0f5a21af8decf32944e01ecf17c0059a9c9f.tar.gz
libdm: add dm_report_compact_given_fields
dm_report_compact_given_fields is the same as dm_report_compact_fields, but it processes only given fields, not all the fields in the report like dm_report_compact_field does.
Diffstat (limited to 'libdm/libdm-report.c')
-rw-r--r--libdm/libdm-report.c62
1 files changed, 60 insertions, 2 deletions
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 681ad049b..b2e70d59e 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -81,6 +81,7 @@ struct dm_report {
#define FLD_ASCENDING 0x00004000
#define FLD_DESCENDING 0x00008000
#define FLD_COMPACTED 0x00010000
+#define FLD_COMPACT_ONE 0x00020000
struct field_properties {
struct dm_list list;
@@ -2013,7 +2014,7 @@ out:
return r;
}
-int dm_report_compact_fields(struct dm_report *rh)
+static int _do_report_compact_fields(struct dm_report *rh, int global)
{
struct dm_report_field *field;
struct field_properties *fp;
@@ -2036,7 +2037,9 @@ int dm_report_compact_fields(struct dm_report *rh)
* in next step...
*/
dm_list_iterate_items(fp, &rh->field_props) {
- if (!(fp->flags & FLD_HIDDEN))
+ if (fp->flags & FLD_HIDDEN)
+ continue;
+ if (global || (fp->flags & FLD_COMPACT_ONE))
fp->flags |= (FLD_COMPACTED | FLD_HIDDEN);
}
@@ -2065,6 +2068,61 @@ int dm_report_compact_fields(struct dm_report *rh)
return 1;
}
+int dm_report_compact_fields(struct dm_report *rh)
+{
+ return _do_report_compact_fields(rh, 1);
+}
+
+static int _field_to_compact_match(struct dm_report *rh, const char *field, size_t flen)
+{
+ struct field_properties *fp;
+ uint32_t f;
+ int implicit;
+
+ if ((_get_field(rh, field, flen, &f, &implicit))) {
+ dm_list_iterate_items(fp, &rh->field_props) {
+ if ((fp->implicit == implicit) && (fp->field_num == f)) {
+ fp->flags |= FLD_COMPACT_ONE;
+ break;
+ }
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+static int _parse_fields_to_compact(struct dm_report *rh, const char *fields)
+{
+ const char *ws; /* Word start */
+ const char *we = fields; /* Word end */
+
+ if (!fields)
+ return 1;
+
+ while (*we) {
+ while (*we && *we == ',')
+ we++;
+ ws = we;
+ while (*we && *we != ',')
+ we++;
+ if (!_field_to_compact_match(rh, ws, (size_t) (we - ws))) {
+ log_error("dm_report: Unrecognized field: %.*s", (int) (we - ws), ws);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int dm_report_compact_given_fields(struct dm_report *rh, const char *fields)
+{
+ if (!_parse_fields_to_compact(rh, fields))
+ return_0;
+
+ return _do_report_compact_fields(rh, 0);
+}
+
int dm_report_object(struct dm_report *rh, void *object)
{
return _do_report_object(rh, object, 1, NULL);