static int smartcard_channel_client_handle_migrate_data(RedChannelClient *rcc, uint32_t size, void *message) { SmartCardChannelClient *scc; SpiceMigrateDataHeader *header; SpiceMigrateDataSmartcard *mig_data; scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base); header = (SpiceMigrateDataHeader *)message; mig_data = (SpiceMigrateDataSmartcard *)(header + 1); if (size < sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSmartcard)) { spice_error("bad message size"); return FALSE; } if (!migration_protocol_validate_header(header, SPICE_MIGRATE_DATA_SMARTCARD_MAGIC, SPICE_MIGRATE_DATA_SMARTCARD_VERSION)) { spice_error("bad header"); return FALSE; } if (!mig_data->base.connected) { /* client wasn't attached to a smartcard */ return TRUE; } if (!scc->smartcard_state) { SpiceCharDeviceInstance *char_device = smartcard_readers_get_unattached(); if (!char_device) { spice_warning("no unattached device available"); return TRUE; } else { smartcard_char_device_attach_client(char_device, scc); } } spice_debug("reader added %d partial read_size %u", mig_data->reader_added, mig_data->read_size); scc->smartcard_state->reader_added = mig_data->reader_added; smartcard_device_state_restore_partial_read(scc->smartcard_state, mig_data); return spice_char_device_state_restore(scc->smartcard_state->chardev_st, &mig_data->base); }
static int spicevmc_channel_client_handle_migrate_data(RedChannelClient *rcc, uint32_t size, void *message) { SpiceMigrateDataHeader *header; SpiceMigrateDataSpiceVmc *mig_data; SpiceVmcState *state; state = spicevmc_red_channel_client_get_state(rcc); header = (SpiceMigrateDataHeader *)message; mig_data = (SpiceMigrateDataSpiceVmc *)(header + 1); spice_assert(size >= sizeof(SpiceMigrateDataHeader) + sizeof(SpiceMigrateDataSpiceVmc)); if (!migration_protocol_validate_header(header, SPICE_MIGRATE_DATA_SPICEVMC_MAGIC, SPICE_MIGRATE_DATA_SPICEVMC_VERSION)) { spice_error("bad header"); return FALSE; } return spice_char_device_state_restore(state->chardev_st, &mig_data->base); }