hmp: Implement qom-get HMP command

This started off as Andreas Färber's implementation from
March 2015, but after feedback from Paolo and Markus it morphed into
using the json output which handles structs reasonably.

Use with qom-list to find the members of an object.

(qemu) qom-get /backend/console[0]/device/vga.rom[0] size
65536
(qemu) qom-get /machine smm
"auto"
(qemu) qom-get /machine rtc-time
{
    "tm_year": 120,
    "tm_sec": 51,
    "tm_hour": 9,
    "tm_min": 50,
    "tm_mon": 4,
    "tm_mday": 20
}
(qemu) qom-get /machine frob
Error: Property '.frob' not found

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <20200520151108.160598-2-dgilbert@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Dr. David Alan Gilbert 2020-05-20 16:11:07 +01:00
parent 2f0c285aaa
commit 89cf4fe34f
4 changed files with 34 additions and 0 deletions

View File

@ -1790,6 +1790,20 @@ SRST
Print QOM properties of object at location *path* Print QOM properties of object at location *path*
ERST ERST
{
.name = "qom-get",
.args_type = "path:s,property:s",
.params = "path property",
.help = "print QOM property",
.cmd = hmp_qom_get,
.flags = "p",
},
SRST
``qom-get`` *path* *property*
Print QOM property *property* of object at location *path*
ERST
{ {
.name = "qom-set", .name = "qom-set",
.args_type = "path:s,property:s,value:s", .args_type = "path:s,property:s,value:s",

View File

@ -96,6 +96,7 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict);
void hmp_info_numa(Monitor *mon, const QDict *qdict); void hmp_info_numa(Monitor *mon, const QDict *qdict);
void hmp_info_memory_devices(Monitor *mon, const QDict *qdict); void hmp_info_memory_devices(Monitor *mon, const QDict *qdict);
void hmp_qom_list(Monitor *mon, const QDict *qdict); void hmp_qom_list(Monitor *mon, const QDict *qdict);
void hmp_qom_get(Monitor *mon, const QDict *qdict);
void hmp_qom_set(Monitor *mon, const QDict *qdict); void hmp_qom_set(Monitor *mon, const QDict *qdict);
void hmp_info_qom_tree(Monitor *mon, const QDict *dict); void hmp_info_qom_tree(Monitor *mon, const QDict *dict);
void object_add_completion(ReadLineState *rs, int nb_args, const char *str); void object_add_completion(ReadLineState *rs, int nb_args, const char *str);

View File

@ -12,6 +12,8 @@
#include "qapi/error.h" #include "qapi/error.h"
#include "qapi/qapi-commands-qom.h" #include "qapi/qapi-commands-qom.h"
#include "qapi/qmp/qdict.h" #include "qapi/qmp/qdict.h"
#include "qapi/qmp/qjson.h"
#include "qapi/qmp/qstring.h"
#include "qom/object.h" #include "qom/object.h"
void hmp_qom_list(Monitor *mon, const QDict *qdict) void hmp_qom_list(Monitor *mon, const QDict *qdict)
@ -62,6 +64,22 @@ void hmp_qom_set(Monitor *mon, const QDict *qdict)
hmp_handle_error(mon, err); hmp_handle_error(mon, err);
} }
void hmp_qom_get(Monitor *mon, const QDict *qdict)
{
const char *path = qdict_get_str(qdict, "path");
const char *property = qdict_get_str(qdict, "property");
Error *err = NULL;
QObject *obj = qmp_qom_get(path, property, &err);
if (err == NULL) {
QString *str = qobject_to_json_pretty(obj);
monitor_printf(mon, "%s\n", qstring_get_str(str));
qobject_unref(str);
}
hmp_handle_error(mon, err);
}
typedef struct QOMCompositionState { typedef struct QOMCompositionState {
Monitor *mon; Monitor *mon;
int indent; int indent;

View File

@ -61,6 +61,7 @@ static const char *hmp_cmds[] = {
"p $pc + 8", "p $pc + 8",
"qom-list /", "qom-list /",
"qom-set /machine initrd test", "qom-set /machine initrd test",
"qom-get /machine initrd",
"screendump /dev/null", "screendump /dev/null",
"sendkey x", "sendkey x",
"singlestep on", "singlestep on",