From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:37910) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qq5eJ-0000nj-Ew for qemu-devel@nongnu.org; Sun, 07 Aug 2011 11:52:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qq5eI-0008Py-AP for qemu-devel@nongnu.org; Sun, 07 Aug 2011 11:52:23 -0400 Received: from mail-gy0-f173.google.com ([209.85.160.173]:58657) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qq5eI-0008Pu-7S for qemu-devel@nongnu.org; Sun, 07 Aug 2011 11:52:22 -0400 Received: by gyd12 with SMTP id 12so1743723gyd.4 for ; Sun, 07 Aug 2011 08:52:21 -0700 (PDT) Message-ID: <4E3EB4B4.403@codemonkey.ws> Date: Sun, 07 Aug 2011 10:52:20 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1312723284-7549-1-git-send-email-hdegoede@redhat.com> In-Reply-To: <1312723284-7549-1-git-send-email-hdegoede@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/3] spice-qemu-char: Generate chardev open/close events List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Hans de Goede Cc: Gerd Hoffmann , qemu-devel@nongnu.org On 08/07/2011 08:21 AM, Hans de Goede wrote: > Define a state callback and make that generate chardev open/close events when > called by the spice-server. > > Note that for all but the newest spice-server versions (which have a fix for > this) the code ignores these events for a spicevmc with a subtype of vdagent, > this subtype specific knowledge is undesirable, but unavoidable for now, see: > http://lists.freedesktop.org/archives/spice-devel/2011-July/004837.html > > Signed-off-by: Hans de Goede > --- > spice-qemu-char.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 45 insertions(+), 1 deletions(-) > > diff --git a/spice-qemu-char.c b/spice-qemu-char.c > index 95bf6b6..0a5059d 100644 > --- a/spice-qemu-char.c > +++ b/spice-qemu-char.c > @@ -69,11 +69,50 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len) > return bytes; > } > > +static void vmc_state(SpiceCharDeviceInstance *sin, int connected) > +{ > + SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin); > + int event; > + > +#if SPICE_SERVER_VERSION< 0x000901 > + /* > + * spice-server calls the state callback for the agent channel when the > + * spice client connects / disconnects. Given that not the client but > + * the server is doing the parsing of the messages this is wrong as the > + * server is still listening. Worse, this causes the parser in the server > + * to go out of sync, so we ignore state calls for subtype vdagent > + * spicevmc chardevs. For the full story see: > + * http://lists.freedesktop.org/archives/spice-devel/2011-July/004837.html > + */ > + if (strcmp(sin->subtype, "vdagent") == 0) { > + return; > + } > +#endif > + > + if ((scd->chr->opened&& connected) || > + (!scd->chr->opened&& !connected)) { > + return; > + } > + > + if (connected) { > + scd->chr->opened = 1; > + event = CHR_EVENT_OPENED; > + } else { > + scd->chr->opened = 0; > + event = CHR_EVENT_CLOSED; > + } > + > + if (scd->chr->chr_event) { > + scd->chr->chr_event(scd->chr->handler_opaque, event); > + } You should use qemu_chr_event and then this whole block of code disappears since it already manages the opened flag. Regards, Anthony Liguori