From 1a618b2dddb9bd4819cf6f019c19deb25b1038a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Mon, 6 Jul 2026 14:57:56 +0100 Subject: [PATCH] monitor: add 'readline' property to HMP Monitor class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This determines whether a human monitor runs with readline for interactive use, or without readline for non-interactive use by the GDB stub. Reviewed-by: Marc-André Lureau Tested-by: Peter Krempa Signed-off-by: Daniel P. Berrangé Message-ID: <20260706135824.2623960-9-berrange@redhat.com> Signed-off-by: Markus Armbruster --- monitor/hmp.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/monitor/hmp.c b/monitor/hmp.c index 34a39b071c..54fd25f220 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -50,12 +50,37 @@ static void monitor_hmp_finalize(Object *obj) { } +static bool monitor_hmp_get_readline(Object *obj, Error **errp) +{ + MonitorHMP *mon = MONITOR_HMP(obj); + + return mon->use_readline; +} + +static void monitor_hmp_set_readline(Object *obj, bool val, Error **errp) +{ + MonitorHMP *mon = MONITOR_HMP(obj); + + mon->use_readline = val; +} + static void monitor_hmp_class_init(ObjectClass *cls, const void *data) { + object_class_property_add_bool(cls, "readline", + monitor_hmp_get_readline, + monitor_hmp_set_readline); } static void monitor_hmp_init(Object *obj) { + MonitorHMP *hmp = MONITOR_HMP(obj); + + /* + * Default to common case for external HMP use, + * as opposed to non-interactive internal use + * from gdbstub + */ + hmp->use_readline = true; } static void monitor_command_cb(void *opaque, const char *cmdline, @@ -1550,6 +1575,7 @@ void monitor_new_hmp(const char *id, const char *chardev_id, id ? id : autoid, errp, "chardev", chardev_id, + "readline", use_readline ? "yes" : "no", NULL); if (!obj) { @@ -1566,7 +1592,6 @@ void monitor_new_hmp(const char *id, const char *chardev_id, monitor_data_init(&mon->parent_obj, false, false, false); - mon->use_readline = use_readline; if (mon->use_readline) { mon->rs = readline_init(monitor_readline_printf, monitor_readline_flush,