[lvm-devel] [PATCH 2/4] Add report_value() function to return a value of a report field.

Dave Wysochanski dwysocha at redhat.com
Wed Jul 21 13:56:13 UTC 2010


Call into dm_report_get_field_value() to query the value of a single
field in a report.

Signed-off-by: Dave Wysochanski <dwysocha at redhat.com>
---
 lib/report/report.c |   65 +++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/report/report.h |    7 +++++
 2 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/lib/report/report.c b/lib/report/report.c
index b3f6544..8eb919b 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -1299,3 +1299,68 @@ int report_object(void *handle, struct volume_group *vg,
 
 	return dm_report_object(handle, &obj);
 }
+
+int report_value(struct volume_group *vg,
+		 struct logical_volume *lv,
+		 struct physical_volume *pv,
+		 struct lv_segment *seg,
+		 struct pv_segment *pvseg,
+		 const char *field_id,
+		 struct dm_report_field_value_type *value)
+{
+	void *rh;
+	report_type_t report_type = VGS;
+	struct dm_pool *mem;
+	struct cmd_context *cmd;
+
+	if (vg) {
+		mem = vg->vgmem;
+		cmd = vg->cmd;
+	} else if (lv) {
+		mem = lv->vg->vgmem;
+		cmd = lv->vg->cmd;
+	} else if (pv) {
+		mem = pv->vg->vgmem;
+		cmd = pv->vg->cmd;
+	} else if (seg) {
+		mem = seg->lv->vg->vgmem;
+		cmd = seg->lv->vg->cmd;
+	} else if (pvseg) {
+		mem = pvseg->pv->vg->vgmem;
+		cmd = pvseg->pv->vg->cmd;
+	} else {
+		stack;
+		return 0;
+	}
+
+	if (!(rh = report_init(cmd, field_id, "", &report_type,
+				   " ", 1, 1, 1, 0, 0, 0))) {
+		stack;
+		return 0;
+	}
+
+	if (!report_object(rh, vg, lv, pv, seg, pvseg)) {
+		dm_report_free(rh);
+		stack;
+		return 0;
+	}
+
+	if (!dm_report_get_field_value(rh, field_id, value)) {
+		dm_report_free(rh);
+		stack;
+		return 0;
+	}
+
+	if (!value->is_string) {
+		dm_report_free(rh);
+		return 1;
+	}
+
+	if (!(value->u.s_val = dm_pool_strdup(mem, value->u.s_val))) {
+		log_errno(ENOMEM, "Memory allocation fail for attribute value");
+		dm_report_free(rh);
+		return 0;
+	}
+	dm_report_free(rh);
+	return 1;
+}
diff --git a/lib/report/report.h b/lib/report/report.h
index 26cc2f7..c3c1d7b 100644
--- a/lib/report/report.h
+++ b/lib/report/report.h
@@ -41,6 +41,13 @@ void report_free(void *handle);
 int report_object(void *handle, struct volume_group *vg,
 		  struct logical_volume *lv, struct physical_volume *pv,
 		  struct lv_segment *seg, struct pv_segment *pvseg);
+int report_value(struct volume_group *vg,
+		 struct logical_volume *lv,
+		 struct physical_volume *pv,
+		 struct lv_segment *seg,
+		 struct pv_segment *pvseg,
+		 const char *field_id,
+		 struct dm_report_field_value_type *value);
 int report_output(void *handle);
 
 #endif
-- 
1.6.0.6




More information about the lvm-devel mailing list