From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:37155) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qq7Hj-00060j-9J for qemu-devel@nongnu.org; Sun, 07 Aug 2011 13:37:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qq7Hi-0001F1-9Z for qemu-devel@nongnu.org; Sun, 07 Aug 2011 13:37:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:15951) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qq7Hi-0001Ex-2V for qemu-devel@nongnu.org; Sun, 07 Aug 2011 13:37:10 -0400 Message-ID: <4E3ECDBC.5090106@redhat.com> Date: Sun, 07 Aug 2011 19:39:08 +0200 From: Hans de Goede MIME-Version: 1.0 References: <1312723284-7549-1-git-send-email-hdegoede@redhat.com> <4E3EB4B4.403@codemonkey.ws> In-Reply-To: <4E3EB4B4.403@codemonkey.ws> 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: Anthony Liguori Cc: Gerd Hoffmann , qemu-devel@nongnu.org Hi, On 08/07/2011 05:52 PM, Anthony Liguori wrote: > 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. Right, good one, Regards, Hans