return qemuMonitorJSONDetachCharDev(mon, chrID);
}
+
+int
+qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
+ char ***aliases)
+{
+ VIR_DEBUG("mon=%p, aliases=%p", mon, aliases);
+
+ if (!mon) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("monitor must not be NULL"));
+ return -1;
+ }
+
+ if (!mon->json) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("JSON monitor is required"));
+ return -1;
+ }
+
+ return qemuMonitorJSONGetDeviceAliases(mon, aliases);
+}
virJSONValueFree(reply);
return ret;
}
+
+
+int
+qemuMonitorJSONGetDeviceAliases(qemuMonitorPtr mon,
+ char ***aliases)
+{
+ qemuMonitorJSONListPathPtr *paths = NULL;
+ char **alias;
+ int ret = -1;
+ size_t i;
+ int n;
+
+ *aliases = NULL;
+
+ n = qemuMonitorJSONGetObjectListPaths(mon, "/machine/peripheral", &paths);
+ if (n < 0)
+ return -1;
+
+ if (VIR_ALLOC_N(*aliases, n + 1) < 0)
+ goto cleanup;
+
+ alias = *aliases;
+ for (i = 0; i < n; i++) {
+ if (STRPREFIX(paths[i]->type, "child<")) {
+ *alias = paths[i]->name;
+ paths[i]->name = NULL;
+ alias++;
+ }
+ }
+
+ ret = 0;
+
+cleanup:
+ for (i = 0; i < n; i++)
+ qemuMonitorJSONListPathFree(paths[i]);
+ VIR_FREE(paths);
+ return ret;
+}
}
+static int
+testQemuMonitorJSONGetDeviceAliases(const void *data)
+{
+ const virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
+ qemuMonitorTestPtr test = qemuMonitorTestNew(true, xmlopt);
+ int ret = -1;
+ char **aliases = NULL;
+ char **alias;
+ const char *expected[] = {
+ "virtio-disk25", "video0", "serial0", "ide0-0-0", "usb", NULL };
+
+ if (!test)
+ return -1;
+
+ if (qemuMonitorTestAddItem(test,
+ "qom-list",
+ "{\"return\": ["
+ " {\"name\": \"virtio-disk25\","
+ " \"type\": \"child<virtio-blk-pci>\"},"
+ " {\"name\": \"video0\","
+ " \"type\": \"child<VGA>\"},"
+ " {\"name\": \"serial0\","
+ " \"type\": \"child<isa-serial>\"},"
+ " {\"name\": \"ide0-0-0\","
+ " \"type\": \"child<ide-cd>\"},"
+ " {\"name\": \"usb\","
+ " \"type\": \"child<piix3-usb-uhci>\"},"
+ " {\"name\": \"type\", \"type\": \"string\"}"
+ "]}") < 0)
+ goto cleanup;
+
+ if (qemuMonitorJSONGetDeviceAliases(qemuMonitorTestGetMonitor(test),
+ &aliases) < 0)
+ goto cleanup;
+
+ if (!aliases) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "no aliases returned");
+ goto cleanup;
+ }
+
+ ret = 0;
+ for (alias = aliases; *alias; alias++) {
+ if (!virStringArrayHasString((char **) expected, *alias)) {
+ fprintf(stderr, "got unexpected device alias '%s'\n", *alias);
+ ret = -1;
+ }
+ }
+ for (alias = (char **) expected; *alias; alias++) {
+ if (!virStringArrayHasString(aliases, *alias)) {
+ fprintf(stderr, "missing expected alias '%s'\n", *alias);
+ ret = -1;
+ }
+ }
+
+cleanup:
+ virStringFreeList(aliases);
+ return ret;
+}
+
+
static int
mymain(void)
{
DO_TEST(GetListPaths);
DO_TEST(GetObjectProperty);
DO_TEST(SetObjectProperty);
+ DO_TEST(GetDeviceAliases);
virObjectUnref(xmlopt);