Message ID | 1312723284-7549-1-git-send-email-hdegoede@redhat.com |
---|---|
State | New |
Headers | show |
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<hdegoede@redhat.com> > --- > 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
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<hdegoede@redhat.com> >> --- >> 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
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); + } +} + static SpiceCharDeviceInterface vmc_interface = { .base.type = SPICE_INTERFACE_CHAR_DEVICE, .base.description = "spice virtual channel char device", .base.major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR, .base.minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR, + .state = vmc_state, .write = vmc_write, .read = vmc_read, }; @@ -197,7 +236,12 @@ int qemu_chr_open_spice(QemuOpts *opts, CharDriverState **_chr) chr->chr_guest_open = spice_chr_guest_open; chr->chr_guest_close = spice_chr_guest_close; - qemu_chr_generic_open(chr); +#if SPICE_SERVER_VERSION < 0x000901 + /* See comment in vmc_state() */ + if (strcmp(subtype, "vdagent") == 0) { + qemu_chr_generic_open(chr); + } +#endif *_chr = chr; return 0;
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 <hdegoede@redhat.com> --- spice-qemu-char.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 45 insertions(+), 1 deletions(-)