Skip to content

Commit

Permalink
hmp: Implement qom-get HMP command
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dagrh committed Jun 1, 2020
1 parent 2f0c285 commit 89cf4fe
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 0 deletions.
14 changes: 14 additions & 0 deletions hmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -1790,6 +1790,20 @@ SRST
Print QOM properties of object at location *path*
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",
.args_type = "path:s,property:s,value:s",
Expand Down
1 change: 1 addition & 0 deletions include/monitor/hmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_memory_devices(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_info_qom_tree(Monitor *mon, const QDict *dict);
void object_add_completion(ReadLineState *rs, int nb_args, const char *str);
Expand Down
18 changes: 18 additions & 0 deletions qom/qom-hmp-cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include "qapi/error.h"
#include "qapi/qapi-commands-qom.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qjson.h"
#include "qapi/qmp/qstring.h"
#include "qom/object.h"

void hmp_qom_list(Monitor *mon, const QDict *qdict)
Expand Down Expand Up @@ -62,6 +64,22 @@ void hmp_qom_set(Monitor *mon, const QDict *qdict)
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 {
Monitor *mon;
int indent;
Expand Down
1 change: 1 addition & 0 deletions tests/qtest/test-hmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ static const char *hmp_cmds[] = {
"p $pc + 8",
"qom-list /",
"qom-set /machine initrd test",
"qom-get /machine initrd",
"screendump /dev/null",
"sendkey x",
"singlestep on",
Expand Down

0 comments on commit 89cf4fe

Please sign in to comment.