sharkcz / rpms / qemu

Forked from rpms/qemu 5 years ago
Clone
252f3af
>From c8cb28f0791ab38945c7facb5a63e445b4b6f41f Mon Sep 17 00:00:00 2001
252f3af
From: Hans de Goede <hdegoede@redhat.com>
252f3af
Date: Fri, 18 Mar 2011 15:23:21 +0100
252f3af
Subject: [PATCH 15/17] chardev: Allow frontends to notify backends of guest open / close
252f3af
252f3af
Some frontends know when the guest has opened the "channel" and is actively
252f3af
listening to it, for example virtio-serial. This patch adds 2 new qemu-chardev
252f3af
functions which can be used by frontends to signal guest open / close, and
252f3af
allows interested backends to listen to this.
252f3af
252f3af
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
252f3af
---
252f3af
 qemu-char.c |   17 +++++++++++++++++
252f3af
 qemu-char.h |    4 ++++
252f3af
 2 files changed, 21 insertions(+), 0 deletions(-)
252f3af
252f3af
diff --git a/qemu-char.c b/qemu-char.c
252f3af
index 2ef972f..d52eb51 100644
252f3af
--- a/qemu-char.c
252f3af
+++ b/qemu-char.c
252f3af
@@ -507,6 +507,9 @@ static CharDriverState *qemu_chr_open_mux(CharDriverState *drv)
252f3af
     chr->chr_write = mux_chr_write;
252f3af
     chr->chr_update_read_handler = mux_chr_update_read_handler;
252f3af
     chr->chr_accept_input = mux_chr_accept_input;
252f3af
+    /* Frontend guest-open / -close notification is not support with muxes */
252f3af
+    chr->chr_guest_open = NULL;
252f3af
+    chr->chr_guest_close = NULL;
252f3af
 
252f3af
     /* Muxes are always open on creation */
252f3af
     qemu_chr_generic_open(chr);
252f3af
@@ -2712,6 +2715,20 @@ void qemu_chr_set_echo(struct CharDriverState *chr, bool echo)
252f3af
     }
252f3af
 }
252f3af
 
252f3af
+void qemu_chr_guest_open(struct CharDriverState *chr)
252f3af
+{
252f3af
+    if (chr->chr_guest_open) {
252f3af
+        chr->chr_guest_open(chr);
252f3af
+    }
252f3af
+}
252f3af
+
252f3af
+void qemu_chr_guest_close(struct CharDriverState *chr)
252f3af
+{
252f3af
+    if (chr->chr_guest_close) {
252f3af
+        chr->chr_guest_close(chr);
252f3af
+    }
252f3af
+}
252f3af
+
252f3af
 void qemu_chr_close(CharDriverState *chr)
252f3af
 {
252f3af
     QTAILQ_REMOVE(&chardevs, chr, next);
252f3af
diff --git a/qemu-char.h b/qemu-char.h
252f3af
index bf06da0..f3b9bf4 100644
252f3af
--- a/qemu-char.h
252f3af
+++ b/qemu-char.h
252f3af
@@ -69,6 +69,8 @@ struct CharDriverState {
252f3af
     void (*chr_close)(struct CharDriverState *chr);
252f3af
     void (*chr_accept_input)(struct CharDriverState *chr);
252f3af
     void (*chr_set_echo)(struct CharDriverState *chr, bool echo);
252f3af
+    void (*chr_guest_open)(struct CharDriverState *chr);
252f3af
+    void (*chr_guest_close)(struct CharDriverState *chr);
252f3af
     void *opaque;
252f3af
     QEMUBH *bh;
252f3af
     char *label;
252f3af
@@ -91,6 +93,8 @@ CharDriverState *qemu_chr_open_opts(QemuOpts *opts,
252f3af
                                     void (*init)(struct CharDriverState *s));
252f3af
 CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*init)(struct CharDriverState *s));
252f3af
 void qemu_chr_set_echo(struct CharDriverState *chr, bool echo);
252f3af
+void qemu_chr_guest_open(struct CharDriverState *chr);
252f3af
+void qemu_chr_guest_close(struct CharDriverState *chr);
252f3af
 void qemu_chr_close(CharDriverState *chr);
252f3af
 void qemu_chr_printf(CharDriverState *s, const char *fmt, ...)
252f3af
     GCC_FMT_ATTR(2, 3);
252f3af
-- 
252f3af
1.7.3.2
252f3af