]> sourceware.org Git - lvm2.git/commitdiff
libdm: add dm_report_compact_given_fields
authorPeter Rajnoha <prajnoha@redhat.com>
Fri, 16 Oct 2015 13:50:13 +0000 (15:50 +0200)
committerPeter Rajnoha <prajnoha@redhat.com>
Fri, 16 Oct 2015 15:05:54 +0000 (17:05 +0200)
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.

WHATS_NEW_DM
libdm/.exported_symbols.DM_1_02_110 [new file with mode: 0644]
libdm/libdevmapper.h
libdm/libdm-report.c

index dffcd34e6c62a00d576880647dbdbe302a51b1f5..9818846be8b5427ff7321ba48ff2e440e19d01e2 100644 (file)
@@ -1,5 +1,6 @@
 Version 1.02.110 - 
 ======================================
+  Add dm_report_compact_given_fields to remove given empty fields from report.
   Use libdm status parsing and local mem raid dmeventd plugin.
   Use local mem pool and lock only lvm2 execution for mirror dmeventd plugin.
   Lock protect only lvm2 execution for snapshot and thin dmeventd plugin.
diff --git a/libdm/.exported_symbols.DM_1_02_110 b/libdm/.exported_symbols.DM_1_02_110
new file mode 100644 (file)
index 0000000..71d04a9
--- /dev/null
@@ -0,0 +1 @@
+dm_report_compact_given_fields
index 8077867a1459a11a04f41948af3c9e8fa63742bf..1a2036b7e51a57ce0ec8f31fb15074d92ab4f65c 100644 (file)
@@ -2548,6 +2548,13 @@ int dm_report_object_is_selected(struct dm_report *rh, void *object, int do_outp
  */
 int dm_report_compact_fields(struct dm_report *rh);
 
+/*
+ * The same as dm_report_compact_fields, but for selected fields only.
+ * The "fields" arg is comma separated list of field names (the same format
+ * as used for "output_fields" arg in dm_report_init fn).
+*/
+int dm_report_compact_given_fields(struct dm_report *rh, const char *fields);
+
 /*
  * Returns 1 if there is no data waiting to be output.
  */
index 681ad049b5a7b2f9858471f6017b14a296e79e9f..b2e70d59e28edaf2613b5f240a0cef4c9b7a1762 100644 (file)
@@ -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);
This page took 0.047981 seconds and 5 git commands to generate.