Patchwork [v2,18/23] convert mux chardev to QemuOpts.

login
register
mail settings
Submitter Gerd Hoffmann
Date Sept. 10, 2009, 8:58 a.m.
Message ID <1252573135-27688-19-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/33295/
State Superseded
Headers show

Comments

Gerd Hoffmann - Sept. 10, 2009, 8:58 a.m.
new cmd line syntax:  you can add mux=1 to any chardev to enable muxing,
then attach it multiple times, like this:

	-chardev pty,name=mux,mux=on

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 qemu-char.c |   32 +++++++++++++++++++++-----------
 1 files changed, 21 insertions(+), 11 deletions(-)

Patch

diff --git a/qemu-char.c b/qemu-char.c
index 3240e13..a7e6cf7 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2230,6 +2230,11 @@  static QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
     if (NULL == opts)
         return NULL;
 
+    if (strstart(filename, "mon:", &p)) {
+        filename = p;
+        qemu_opt_set(opts, "mux", "on");
+    }
+
     if (strcmp(filename, "null")    == 0 ||
         strcmp(filename, "pty")     == 0 ||
         strcmp(filename, "msmouse") == 0 ||
@@ -2378,8 +2383,18 @@  CharDriverState *qemu_chr_open_opts(QemuOpts *opts,
     if (!chr->filename)
         chr->filename = qemu_strdup(qemu_opt_get(opts, "backend"));
     chr->init = init;
-    chr->label = qemu_strdup(qemu_opts_id(opts));
     TAILQ_INSERT_TAIL(&chardevs, chr, next);
+
+    if (qemu_opt_get_bool(opts, "mux", 0)) {
+        CharDriverState *base = chr;
+        int len = strlen(qemu_opts_id(opts)) + 6;
+        base->label = qemu_malloc(len);
+        snprintf(base->label, len, "%s-base", qemu_opts_id(opts));
+        chr = qemu_chr_open_mux(base);
+        chr->filename = base->filename;
+        TAILQ_INSERT_TAIL(&chardevs, chr, next);
+    }
+    chr->label = qemu_strdup(qemu_opts_id(opts));
     return chr;
 }
 
@@ -2391,21 +2406,16 @@  CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*i
 
     opts = qemu_chr_parse_compat(label, filename);
     if (opts) {
-        return qemu_chr_open_opts(opts, init);
+        chr = qemu_chr_open_opts(opts, init);
+        if (qemu_opt_get_bool(opts, "mux", 0)) {
+            monitor_init(chr, MONITOR_USE_READLINE);
+        }
+        return chr;
     }
 
     if (strstart(filename, "udp:", &p)) {
         chr = qemu_chr_open_udp(p);
     } else
-    if (strstart(filename, "mon:", &p)) {
-        chr = qemu_chr_open(label, p, NULL);
-        if (chr) {
-            chr = qemu_chr_open_mux(chr);
-            monitor_init(chr, MONITOR_USE_READLINE);
-        } else {
-            printf("Unable to open driver: %s\n", p);
-        }
-    } else
     {
         chr = NULL;
     }