static void do_client_volume_sync(struct vdagent_virtio_port *vport, int port_nr, VDAgentMessage *message_header, VDAgentAudioVolumeSync *avs) { if (active_session_conn == NULL) { syslog(LOG_DEBUG, "No active session - Can't volume-sync"); return; } udscs_write(active_session_conn, VDAGENTD_AUDIO_VOLUME_SYNC, 0, 0, (uint8_t *)avs, message_header->size); }
static void do_client_clipboard(struct vdagent_virtio_port *vport, VDAgentMessage *message_header, uint8_t *data) { uint32_t msg_type = 0, data_type = 0, size = message_header->size; uint8_t selection = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD; if (!active_session_conn) { syslog(LOG_WARNING, "Could not find an agent connection belonging to the " "active session, ignoring client clipboard request"); return; } if (VD_AGENT_HAS_CAPABILITY(capabilities, capabilities_size, VD_AGENT_CAP_CLIPBOARD_SELECTION)) { selection = data[0]; data += 4; size -= 4; } switch (message_header->type) { case VD_AGENT_CLIPBOARD_GRAB: msg_type = VDAGENTD_CLIPBOARD_GRAB; agent_owns_clipboard[selection] = 0; break; case VD_AGENT_CLIPBOARD_REQUEST: { VDAgentClipboardRequest *req = (VDAgentClipboardRequest *)data; msg_type = VDAGENTD_CLIPBOARD_REQUEST; data_type = req->type; data = NULL; size = 0; break; } case VD_AGENT_CLIPBOARD: { VDAgentClipboard *clipboard = (VDAgentClipboard *)data; msg_type = VDAGENTD_CLIPBOARD_DATA; data_type = clipboard->type; size = size - sizeof(VDAgentClipboard); data = clipboard->data; break; } case VD_AGENT_CLIPBOARD_RELEASE: msg_type = VDAGENTD_CLIPBOARD_RELEASE; data = NULL; size = 0; break; } udscs_write(active_session_conn, msg_type, selection, data_type, data, size); }
int udscs_server_write_all(struct udscs_server *server, uint32_t type, uint32_t arg1, uint32_t arg2, const uint8_t *data, uint32_t size) { struct udscs_connection *conn; conn = server->connections_head.next; while (conn) { if (udscs_write(conn, type, arg1, arg2, data, size)) return -1; conn = conn->next; } return 0; }
static void do_client_monitors(struct vdagent_virtio_port *vport, int port_nr, VDAgentMessage *message_header, VDAgentMonitorsConfig *new_monitors) { VDAgentReply reply; uint32_t size; /* Store monitor config to send to agents when they connect */ size = sizeof(VDAgentMonitorsConfig) + new_monitors->num_of_monitors * sizeof(VDAgentMonConfig); if (message_header->size != size) { syslog(LOG_ERR, "invalid message size for VDAgentMonitorsConfig"); return; } vdagentd_write_xorg_conf(new_monitors); if (!mon_config || mon_config->num_of_monitors != new_monitors->num_of_monitors) { free(mon_config); mon_config = malloc(size); if (!mon_config) { syslog(LOG_ERR, "out of memory allocating monitors config"); return; } } memcpy(mon_config, new_monitors, size); /* Send monitor config to currently active agent */ if (active_session_conn) udscs_write(active_session_conn, VDAGENTD_MONITORS_CONFIG, 0, 0, (uint8_t *)mon_config, size); /* Acknowledge reception of monitors config to spice server / client */ reply.type = VD_AGENT_MONITORS_CONFIG; reply.error = VD_AGENT_SUCCESS; vdagent_virtio_port_write(vport, port_nr, VD_AGENT_REPLY, 0, (uint8_t *)&reply, sizeof(reply)); }