aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hmp.c13
-rw-r--r--hmp.h1
-rw-r--r--monitor.c11
-rw-r--r--qapi-schema.json26
-rw-r--r--qemu-char.c35
-rw-r--r--qmp-commands.hx6
6 files changed, 58 insertions, 34 deletions
diff --git a/hmp.c b/hmp.c
index 25302f5..30c6cc9 100644
--- a/hmp.c
+++ b/hmp.c
@@ -80,3 +80,16 @@ void hmp_info_uuid(Monitor *mon)
monitor_printf(mon, "%s\n", info->UUID);
qapi_free_UuidInfo(info);
}
+
+void hmp_info_chardev(Monitor *mon)
+{
+ ChardevInfoList *char_info, *info;
+
+ char_info = qmp_query_chardev(NULL);
+ for (info = char_info; info; info = info->next) {
+ monitor_printf(mon, "%s: filename=%s\n", info->value->label,
+ info->value->filename);
+ }
+
+ qapi_free_ChardevInfoList(char_info);
+}
diff --git a/hmp.h b/hmp.h
index 49a5971..7388f9a 100644
--- a/hmp.h
+++ b/hmp.h
@@ -22,5 +22,6 @@ void hmp_info_version(Monitor *mon);
void hmp_info_kvm(Monitor *mon);
void hmp_info_status(Monitor *mon);
void hmp_info_uuid(Monitor *mon);
+void hmp_info_chardev(Monitor *mon);
#endif
diff --git a/monitor.c b/monitor.c
index 4e9ecdf..86a0dad 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2783,8 +2783,7 @@ static const mon_cmd_t info_cmds[] = {
.args_type = "",
.params = "",
.help = "show the character devices",
- .user_print = qemu_chr_info_print,
- .mhandler.info_new = qemu_chr_info,
+ .mhandler.info = hmp_info_chardev,
},
{
.name = "block",
@@ -3073,14 +3072,6 @@ static const mon_cmd_t qmp_query_cmds[] = {
.mhandler.info_new = do_info_commands,
},
{
- .name = "chardev",
- .args_type = "",
- .params = "",
- .help = "show the character devices",
- .user_print = qemu_chr_info_print,
- .mhandler.info_new = qemu_chr_info,
- },
- {
.name = "block",
.args_type = "",
.params = "",
diff --git a/qapi-schema.json b/qapi-schema.json
index b717491..cf55504 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -176,3 +176,29 @@
##
{ 'command': 'query-uuid', 'returns': 'UuidInfo' }
+##
+# @ChardevInfo:
+#
+# Information about a character device.
+#
+# @label: the label of the character device
+#
+# @filename: the filename of the character device
+#
+# Notes: @filename is encoded using the QEMU command line character device
+# encoding. See the QEMU man page for details.
+#
+# Since: 0.14.0
+##
+{ 'type': 'ChardevInfo', 'data': {'label': 'str', 'filename': 'str'} }
+
+##
+# @query-chardev:
+#
+# Returns information about current character devices.
+#
+# Returns: a list of @ChardevInfo
+#
+# Since: 0.14.0
+##
+{ 'command': 'query-chardev', 'returns': ['ChardevInfo'] }
diff --git a/qemu-char.c b/qemu-char.c
index 09d2309..8bdbcfd 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -31,7 +31,7 @@
#include "hw/usb.h"
#include "hw/baum.h"
#include "hw/msmouse.h"
-#include "qemu-objects.h"
+#include "qmp-commands.h"
#include <unistd.h>
#include <fcntl.h>
@@ -2650,35 +2650,22 @@ void qemu_chr_delete(CharDriverState *chr)
g_free(chr);
}
-static void qemu_chr_qlist_iter(QObject *obj, void *opaque)
+ChardevInfoList *qmp_query_chardev(Error **errp)
{
- QDict *chr_dict;
- Monitor *mon = opaque;
-
- chr_dict = qobject_to_qdict(obj);
- monitor_printf(mon, "%s: filename=%s\n", qdict_get_str(chr_dict, "label"),
- qdict_get_str(chr_dict, "filename"));
-}
-
-void qemu_chr_info_print(Monitor *mon, const QObject *ret_data)
-{
- qlist_iter(qobject_to_qlist(ret_data), qemu_chr_qlist_iter, mon);
-}
-
-void qemu_chr_info(Monitor *mon, QObject **ret_data)
-{
- QList *chr_list;
+ ChardevInfoList *chr_list = NULL;
CharDriverState *chr;
- chr_list = qlist_new();
-
QTAILQ_FOREACH(chr, &chardevs, next) {
- QObject *obj = qobject_from_jsonf("{ 'label': %s, 'filename': %s }",
- chr->label, chr->filename);
- qlist_append_obj(chr_list, obj);
+ ChardevInfoList *info = g_malloc0(sizeof(*info));
+ info->value = g_malloc0(sizeof(*info->value));
+ info->value->label = g_strdup(chr->label);
+ info->value->filename = g_strdup(chr->filename);
+
+ info->next = chr_list;
+ chr_list = info;
}
- *ret_data = QOBJECT(chr_list);
+ return chr_list;
}
CharDriverState *qemu_chr_find(const char *name)
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 4fef25f..dfc02af 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -1120,6 +1120,12 @@ Example:
EQMP
+ {
+ .name = "query-chardev",
+ .args_type = "",
+ .mhandler.cmd_new = qmp_marshal_input_query_chardev,
+ },
+
SQMP
query-block
-----------