diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index ee0672d09a..9c2923e860 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3141,3 +3141,25 @@ int qemuMonitorGetEvents(qemuMonitorPtr mon, return qemuMonitorJSONGetEvents(mon, events); } + + +int qemuMonitorGetObjectTypes(qemuMonitorPtr mon, + char ***types) +{ + VIR_DEBUG("mon=%p types=%p", + mon, types); + + if (!mon) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("monitor must not be NULL")); + return -1; + } + + if (!mon->json) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("JSON monitor is required")); + return -1; + } + + return qemuMonitorJSONGetObjectTypes(mon, types); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 73c80ada4d..403a8b45ea 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -601,6 +601,9 @@ int qemuMonitorGetCommands(qemuMonitorPtr mon, int qemuMonitorGetEvents(qemuMonitorPtr mon, char ***events); +int qemuMonitorGetObjectTypes(qemuMonitorPtr mon, + char ***types); + /** * When running two dd process and using <> redirection, we need a diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index e135cca356..b82a09f672 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4218,3 +4218,77 @@ cleanup: virJSONValueFree(reply); return ret; } + + +int qemuMonitorJSONGetObjectTypes(qemuMonitorPtr mon, + char ***types) +{ + int ret; + virJSONValuePtr cmd; + virJSONValuePtr reply = NULL; + virJSONValuePtr data; + char **typelist = NULL; + int n = 0; + size_t i; + + *types = NULL; + + if (!(cmd = qemuMonitorJSONMakeCommand("qom-list-types", NULL))) + return -1; + + ret = qemuMonitorJSONCommand(mon, cmd, &reply); + + if (ret == 0) + ret = qemuMonitorJSONCheckError(cmd, reply); + + if (ret < 0) + goto cleanup; + + ret = -1; + + if (!(data = virJSONValueObjectGet(reply, "return"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("qom-list-types reply was missing return data")); + goto cleanup; + } + + if ((n = virJSONValueArraySize(data)) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("qom-list-types reply data was not an array")); + goto cleanup; + } + + if (VIR_ALLOC_N(typelist, n) < 0) { + virReportOOMError(); + goto cleanup; + } + + for (i = 0 ; i < n ; i++) { + virJSONValuePtr child = virJSONValueArrayGet(data, i); + const char *tmp; + + if (!(tmp = virJSONValueObjectGetString(child, "name"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("qom-list-types reply data was missing 'name'")); + goto cleanup; + } + + if (!(typelist[i] = strdup(tmp))) { + virReportOOMError(); + goto cleanup; + } + } + + ret = n; + *types = typelist; + +cleanup: + if (ret < 0 && typelist) { + for (i = 0 ; i < n ; i++) + VIR_FREE(typelist[i]); + VIR_FREE(typelist); + } + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 19c03a98d8..3f804157c6 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -305,4 +305,8 @@ int qemuMonitorJSONGetEvents(qemuMonitorPtr mon, char ***events) ATTRIBUTE_NONNULL(2); +int qemuMonitorJSONGetObjectTypes(qemuMonitorPtr mon, + char ***types) + ATTRIBUTE_NONNULL(2); + #endif /* QEMU_MONITOR_JSON_H */