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

Marc-André Lureau marcandre.lureau at gmail.com
Wed Aug 8 11:34:21 UTC 2018


Hi

On Wed, Aug 8, 2018 at 9:42 AM, Frediano Ziglio <fziglio 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)
>
> 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?

Untested. This will not trigger the same path, as the sif->state() is
only called on client connect/disconnect.

thanks


-- 
Marc-André Lureau


More information about the Spice-devel mailing list