Create a helper function which will read the device data and fill in a
hash table entry with that data. In preparation for some more code reuse.
The helper function will take as an argument a new local static structure
in order to define the arguments. This will make it possible to combine
more code in later patches.
NB: Adjust error reporting to not use 'removable' or 'locked' as an
argument to reporting error - rather just inline that in the message.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/qemu/qemu_monitor_json.c | 98 ++++++++++++++++++++++++++------------------
1 file changed, 59 insertions(+), 39 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 4af98cc..a12029a 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1800,6 +1800,64 @@ qemuMonitorJSONQueryBlock(qemuMonitorPtr mon)
}
+/* Allocate a qemuDomainDiskInfo structure, place it into the hash table,
+ * parse the device, and fill in the details for the info
+ *
+ * Returns -1 on failure, 0 on success
+ */
+static int
+qemuMonitorJSONQueryBlockFillInfo(virJSONValuePtr dev,
+ const char *thisdev,
+ virHashTablePtr table)
+{
+ int ret = -1;
+ struct qemuDomainDiskInfo *info;
+ const char *status;
+
+ thisdev = qemuAliasDiskDriveSkipPrefix(thisdev);
+
+ if (VIR_ALLOC(info) < 0)
+ goto cleanup;
+
+ if (virHashAddEntry(table, thisdev, info) < 0) {
+ VIR_FREE(info);
+ goto cleanup;
+ }
+
+ if (virJSONValueObjectGetBoolean(dev, "removable", &info->removable)
< 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("cannot read 'removable' value"));
+ goto cleanup;
+ }
+
+ if (virJSONValueObjectGetBoolean(dev, "locked", &info->locked) <
0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("cannot read 'locked' value"));
+ goto cleanup;
+ }
+
+ /* 'tray_open' is present only if the device has a tray */
+ if (virJSONValueObjectGetBoolean(dev, "tray_open", &info->tray_open)
== 0)
+ info->tray = true;
+
+ /* presence of 'inserted' notifies that a medium is in the device */
+ if (!virJSONValueObjectGetObject(dev, "inserted"))
+ info->empty = true;
+
+ /* Missing io-status indicates no error */
+ if ((status = virJSONValueObjectGetString(dev, "io-status"))) {
+ info->io_status = qemuMonitorBlockIOStatusToError(status);
+ if (info->io_status < 0)
+ goto cleanup;
+ }
+
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
+
int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon,
virHashTablePtr table)
{
@@ -1820,9 +1878,7 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon,
for (i = 0; i < virJSONValueArraySize(devices); i++) {
virJSONValuePtr dev = virJSONValueArrayGet(devices, i);
- struct qemuDomainDiskInfo *info;
const char *thisdev;
- const char *status;
if (!dev || dev->type != VIR_JSON_TYPE_OBJECT) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -1836,44 +1892,8 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon,
goto cleanup;
}
- thisdev = qemuAliasDiskDriveSkipPrefix(thisdev);
-
- if (VIR_ALLOC(info) < 0)
- goto cleanup;
-
- if (virHashAddEntry(table, thisdev, info) < 0) {
- VIR_FREE(info);
- goto cleanup;
- }
-
- if (virJSONValueObjectGetBoolean(dev, "removable",
&info->removable) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("cannot read %s value"),
- "removable");
- goto cleanup;
- }
-
- if (virJSONValueObjectGetBoolean(dev, "locked", &info->locked)
< 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("cannot read %s value"),
- "locked");
+ if (qemuMonitorJSONQueryBlockFillInfo(dev, thisdev, table) < 0)
goto cleanup;
- }
-
- /* 'tray_open' is present only if the device has a tray */
- if (virJSONValueObjectGetBoolean(dev, "tray_open",
&info->tray_open) == 0)
- info->tray = true;
-
- /* presence of 'inserted' notifies that a medium is in the device */
- if (!virJSONValueObjectGetObject(dev, "inserted"))
- info->empty = true;
-
- /* Missing io-status indicates no error */
- if ((status = virJSONValueObjectGetString(dev, "io-status"))) {
- info->io_status = qemuMonitorBlockIOStatusToError(status);
- if (info->io_status < 0)
- goto cleanup;
- }
}
ret = 0;
--
2.7.4