static uint8_t *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size) { SpiceVmcState *state; state = SPICE_CONTAINEROF(rcc->channel, SpiceVmcState, channel); switch (type) { case SPICE_MSGC_SPICEVMC_DATA: assert(!state->recv_from_client_buf); state->recv_from_client_buf = spice_char_device_write_buffer_get(state->chardev_st, rcc->client, size); if (!state->recv_from_client_buf) { spice_error("failed to allocate write buffer"); return NULL; } return state->recv_from_client_buf->buf; default: return spice_malloc(size); } }
static uint8_t *smartcard_channel_alloc_msg_rcv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size) { SmartCardChannelClient *scc = SPICE_CONTAINEROF(rcc, SmartCardChannelClient, base); /* todo: only one reader is actually supported. When we fix the code to support * multiple readers, we will porbably associate different devices to * differenc channels */ if (!scc->smartcard_state) { scc->msg_in_write_buf = FALSE; return spice_malloc(size); } else { SmartCardDeviceState *st; spice_assert(g_smartcard_readers.num == 1); st = scc->smartcard_state; spice_assert(st->scc || scc->smartcard_state); spice_assert(!scc->write_buf); scc->write_buf = spice_char_device_write_buffer_get(st->chardev_st, rcc->client, size); if (!scc->write_buf) { spice_error("failed to allocate write buffer"); return NULL; } scc->msg_in_write_buf = TRUE; return scc->write_buf->buf; } }
static void smartcard_char_device_notify_reader_add(SmartCardDeviceState *st) { SpiceCharDeviceWriteBuffer *write_buf; VSCMsgHeader *vheader; write_buf = spice_char_device_write_buffer_get(st->chardev_st, NULL, sizeof(vheader)); if (!write_buf) { spice_error("failed to allocate write buffer"); return; } st->reader_added = TRUE; vheader = (VSCMsgHeader *)write_buf->buf; vheader->type = VSC_ReaderAdd; vheader->reader_id = st->reader_id; vheader->length = 0; smartcard_channel_write_to_reader(write_buf); }
static void smartcard_char_device_notify_reader_remove(SmartCardDeviceState *st) { SpiceCharDeviceWriteBuffer *write_buf; VSCMsgHeader *vheader; if (!st->reader_added) { spice_debug("reader add was never sent to the device"); return; } write_buf = spice_char_device_write_buffer_get(st->chardev_st, NULL, sizeof(vheader)); if (!write_buf) { spice_error("failed to allocate write buffer"); return; } st->reader_added = FALSE; vheader = (VSCMsgHeader *)write_buf->buf; vheader->type = VSC_ReaderRemove; vheader->reader_id = st->reader_id; vheader->length = 0; smartcard_channel_write_to_reader(write_buf); }