[Spice-devel] [PATCH spice] smartcard: set char device state

Marc-André Lureau marcandre.lureau at gmail.com
Mon Aug 20 12:02:30 UTC 2018


ping
On Tue, Aug 7, 2018 at 5:27 PM <marcandre.lureau at redhat.com> wrote:
>
> From: Marc-André Lureau <marcandre.lureau at redhat.com>
>
> Follow all other char devices implementation (spicevmc, agent,
> stream-device) and set the char device state when
> connected/disconnected. This allows qemu to discard writes, optimize a
> bit the source polling, and will trigger HUP events.
>
> See related qemu "char/spice: discard write() if backend is
> disconnected".
>
> Note: sif->state() should probably be handled at the char-device
> level. I am not sure what the smartcard channel really brings over
> plain spicevmc...
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
> ---
>  server/smartcard.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
>
> diff --git a/server/smartcard.c b/server/smartcard.c
> index 2cb68e06..403805a8 100644
> --- a/server/smartcard.c
> +++ b/server/smartcard.c
> @@ -343,6 +343,11 @@ void smartcard_char_device_attach_client(SpiceCharDeviceInstance *char_device,
>          dev->priv->scc = NULL;
>          smartcard_channel_client_set_char_device(scc, NULL);
>          red_channel_client_disconnect(RED_CHANNEL_CLIENT(scc));
> +    } else {
> +        SpiceCharDeviceInterface *sif = spice_char_device_get_interface(char_device);
> +        if (sif->state) {
> +            sif->state(char_device, 1);
> +        }
>      }
>  }
>
> @@ -373,11 +378,21 @@ gboolean smartcard_char_device_notify_reader_remove(RedCharDeviceSmartcard *dev)
>  void smartcard_char_device_detach_client(RedCharDeviceSmartcard *smartcard,
>                                           SmartCardChannelClient *scc)
>  {
> +    SpiceCharDeviceInterface *sif;
> +    SpiceCharDeviceInstance *sin;
> +
> +    g_object_get(smartcard, "sin", &sin, NULL);
> +    sif = spice_char_device_get_interface(sin);
> +
>      spice_assert(smartcard->priv->scc == scc);
>      red_char_device_client_remove(RED_CHAR_DEVICE(smartcard),
>                                    red_channel_client_get_client(RED_CHANNEL_CLIENT(scc)));
>      smartcard_channel_client_set_char_device(scc, NULL);
>      smartcard->priv->scc = NULL;
> +
> +    if (sif->state) {
> +        sif->state(sin, 0);
> +    }
>  }
>
>  SmartCardChannelClient* smartcard_char_device_get_client(RedCharDeviceSmartcard *smartcard)
> --
> 2.18.0.547.g1d89318c48
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel



-- 
Marc-André Lureau


More information about the Spice-devel mailing list