Extract whether a given drive has a tray and whether there is no image
inserted.
Negative logic for the image insertion is chosen so that the flag is set
only if we are certain of the fact.
---
src/qemu/qemu_domain.h | 2 ++
src/qemu/qemu_monitor_json.c | 12 +++++++-----
tests/qemumonitorjsontest.c | 23 +++++++++++++++++++++++
3 files changed, 32 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index e29df07..825036c 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -307,7 +307,9 @@ struct _qemuDomainDiskPrivate {
struct qemuDomainDiskInfo {
bool removable;
bool locked;
+ bool tray;
bool tray_open;
+ bool empty;
int io_status;
};
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 64a8765..0508fe6 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1832,11 +1832,13 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon,
goto cleanup;
}
- /* Don't check for success here, because 'tray_open' is presented
iff
- * medium is ejected.
- */
- ignore_value(virJSONValueObjectGetBoolean(dev, "tray_open",
- &info->tray_open));
+ /* '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"))) {
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index 229ccac..87b1a8f 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -114,6 +114,14 @@ const char *queryBlockReply =
" },"
" \"tray_open\": false,"
" \"type\": \"unknown\""
+" },"
+" {"
+" \"io-status\": \"ok\","
+" \"device\": \"drive-ide0-1-1\","
+" \"locked\": false,"
+" \"removable\": true,"
+" \"tray_open\": false,"
+" \"type\": \"unknown\""
" }"
" ],"
" \"id\": \"libvirt-10\""
@@ -1404,12 +1412,27 @@ testQemuMonitorJSONqemuMonitorJSONGetBlockInfo(const void *data)
info->locked = true;
info->removable = true;
+ info->tray = true;
+
if (virHashAddEntry(expectedBlockDevices, "ide0-1-0", info) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
"Unable to create expectedBlockDevices hash table");
goto cleanup;
}
+ if (VIR_ALLOC(info) < 0)
+ goto cleanup;
+
+ info->removable = true;
+ info->tray = true;
+ info->empty = true;
+
+ if (virHashAddEntry(expectedBlockDevices, "ide0-1-1", info) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "Unable to create expectedBlockDevices hash table");
+ goto cleanup;
+ }
+
if (qemuMonitorTestAddItem(test, "query-block", queryBlockReply) < 0)
goto cleanup;
--
2.8.2