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

Frediano Ziglio fziglio at redhat.com
Wed Aug 8 07:42:05 UTC 2018


> 
> 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)

I never tried smartcard support but I remember that when you disable the device
from the guest the device cannot be opened. I saw in the past some smart card usage
and I remember for instance that on Windows if smartcards are configured during the
login the login screen change adding smart card support. What would happen in
this case if presenting the login screen there are no clients connected then
you connect? Would the system detect that now the device can be used and add
smart card support to the login? I don't know how to setup such test, was this
tested?

Frediano


More information about the Spice-devel mailing list