This commit adds a flag called 'control' to the '-monitor' command-line option. This flag enables control mode.
The syntax is: qemu [...] -monitor control,<device> Where <device> is a chardev (excluding 'vc', for obvious reasons). For example: $ qemu [...] -monitor control,tcp:localhost:4444,server Will run QEMU in control mode, waiting for a client TCP connection on localhost port 4444. NOTE: I've tried using QemuOpts for this, but turns out that it will try to parse the device part, which should be untouched. Signed-off-by: Luiz Capitulino <lcapitul...@redhat.com> --- monitor.c | 18 ++++++++++++++++++ monitor.h | 1 + qemu-options.hx | 5 +++-- vl.c | 11 +++++++---- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/monitor.c b/monitor.c index 5907252..4d18699 100644 --- a/monitor.c +++ b/monitor.c @@ -3620,6 +3620,24 @@ static void monitor_event(void *opaque, int event) * End: */ +const char *monitor_cmdline_parse(const char *cmdline, int *flags) +{ + const char *dev; + + if (strstart(cmdline, "control,", &dev)) { + if (strstart(dev, "vc", NULL)) { + fprintf(stderr, "qemu: control mode is for low-level interaction "); + fprintf(stderr, "cannot be used with device 'vc'\n"); + exit(1); + } + *flags &= ~MONITOR_USE_READLINE; + *flags |= MONITOR_USE_CONTROL; + return dev; + } + + return cmdline; +} + void monitor_init(CharDriverState *chr, int flags) { static int is_first_init = 1; diff --git a/monitor.h b/monitor.h index 6cb1d4b..556507c 100644 --- a/monitor.h +++ b/monitor.h @@ -13,6 +13,7 @@ extern Monitor *cur_mon; #define MONITOR_USE_READLINE 0x02 #define MONITOR_USE_CONTROL 0x04 +const char *monitor_cmdline_parse(const char *cmdline, int *flags); void monitor_init(CharDriverState *chr, int flags); int monitor_suspend(Monitor *mon); diff --git a/qemu-options.hx b/qemu-options.hx index b65fd74..1b5781a 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1577,13 +1577,14 @@ Use @code{-parallel none} to disable all parallel ports. ETEXI DEF("monitor", HAS_ARG, QEMU_OPTION_monitor, \ - "-monitor dev redirect the monitor to char device 'dev'\n") + "-monitor [control,]dev redirect the monitor to char device 'dev'\n") STEXI -...@item -monitor @var{dev} +...@item -monitor [...@var{control},]...@var{dev} Redirect the monitor to host device @var{dev} (same devices as the serial port). The default device is @code{vc} in graphical mode and @code{stdio} in non graphical mode. +The option @var{control} enables the QEMU Monitor Protocol. ETEXI DEF("pidfile", HAS_ARG, QEMU_OPTION_pidfile, \ diff --git a/vl.c b/vl.c index e7d0754..dd9b74b 100644 --- a/vl.c +++ b/vl.c @@ -4639,6 +4639,7 @@ int main(int argc, char **argv, char **envp) const char *r, *optarg; CharDriverState *monitor_hds[MAX_MONITOR_DEVICES]; const char *monitor_devices[MAX_MONITOR_DEVICES]; + int monitor_flags[MAX_MONITOR_DEVICES]; int monitor_device_index; const char *serial_devices[MAX_SERIAL_PORTS]; int serial_device_index; @@ -4726,8 +4727,10 @@ int main(int argc, char **argv, char **envp) virtio_console_index = 0; monitor_devices[0] = "vc:80Cx24C"; + monitor_flags[0] = MONITOR_IS_DEFAULT | MONITOR_USE_READLINE; for (i = 1; i < MAX_MONITOR_DEVICES; i++) { monitor_devices[i] = NULL; + monitor_flags[i] = MONITOR_USE_READLINE; } monitor_device_index = 0; @@ -5148,7 +5151,9 @@ int main(int argc, char **argv, char **envp) fprintf(stderr, "qemu: too many monitor devices\n"); exit(1); } - monitor_devices[monitor_device_index] = optarg; + monitor_devices[monitor_device_index] = + monitor_cmdline_parse(optarg, + &monitor_flags[monitor_device_index]); monitor_device_index++; break; case QEMU_OPTION_chardev: @@ -5842,9 +5847,7 @@ int main(int argc, char **argv, char **envp) for (i = 0; i < MAX_MONITOR_DEVICES; i++) { if (monitor_devices[i] && monitor_hds[i]) { - monitor_init(monitor_hds[i], - MONITOR_USE_READLINE | - ((i == 0) ? MONITOR_IS_DEFAULT : 0)); + monitor_init(monitor_hds[i], monitor_flags[i]); } } -- 1.6.6.rc0.50.gaf06e