static void spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc) { SpiceVmcState *state; SpiceCharDeviceInstance *sin; SpiceCharDeviceInterface *sif; if (!rcc) { return; } state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel); sin = state->chardev_sin; sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base); if (state->chardev_st) { if (spice_char_device_client_exists(state->chardev_st, rcc->client)) { spice_char_device_client_remove(state->chardev_st, rcc->client); } else { spice_printerr("client %p have already been removed from char dev %p", rcc->client, state->chardev_st); } } /* Don't destroy the rcc if it is already being destroyed, as then red_client_destroy/red_channel_client_destroy will already do this! */ if (!rcc->destroying) red_channel_client_destroy(rcc); state->rcc = NULL; if (sif->state) { sif->state(sin, 0); } }
static void smartcard_char_device_detach_client(SmartCardChannelClient *scc) { SmartCardDeviceState *st; if (!scc->smartcard_state) { return; } st = scc->smartcard_state; spice_assert(st->scc == scc); spice_char_device_client_remove(st->chardev_st, scc->base.client); scc->smartcard_state = NULL; st->scc = NULL; }