Patchwork [02/15] monitor: Command-line flag to enable control mode

login
register
mail settings
Submitter Luiz Capitulino
Date Nov. 19, 2009, 3:13 p.m.
Message ID <1258643623-8636-3-git-send-email-lcapitulino@redhat.com>
Download mbox | patch
Permalink /patch/38845/
State New
Headers show

Comments

Luiz Capitulino - Nov. 19, 2009, 3:13 p.m.
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.

TODO: Update manpage.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 monitor.c |   18 ++++++++++++++++++
 monitor.h |    1 +
 vl.c      |   11 +++++++----
 3 files changed, 26 insertions(+), 4 deletions(-)
Anthony Liguori - Nov. 22, 2009, 6:06 p.m.
Luiz Capitulino wrote:
> 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.
>
> TODO: Update manpage.
>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  monitor.c |   18 ++++++++++++++++++
>  monitor.h |    1 +
>  vl.c      |   11 +++++++----
>  3 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/monitor.c b/monitor.c
> index e7c6451..a98dc42 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -3616,6 +3616,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;
> +}
>   

Should use QemuOpts for this.

Regards,

Anthony Liguori

Patch

diff --git a/monitor.c b/monitor.c
index e7c6451..a98dc42 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3616,6 +3616,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/vl.c b/vl.c
index 73fe68d..6b1a77a 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;
 
@@ -5150,7 +5153,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:
@@ -5844,9 +5849,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]);
         }
     }