[Spice-devel] [spice-server 3/3] Remove dependency of vdi_port_read_buf_process on RedsState
Frediano Ziglio
fziglio at redhat.com
Mon Mar 21 10:36:15 UTC 2016
>
> This makes it easier to move the VDIPort API to a different file, and
> make it as self-contained as possible.
Acked the entire serie
Frediano
> ---
> server/reds.c | 24 +++++++++++++++++-------
> 1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/server/reds.c b/server/reds.c
> index 82e6da4..4afff1a 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -632,11 +632,12 @@ static void vdi_port_read_buf_release(uint8_t *data,
> void *opaque)
> }
>
> /* returns TRUE if the buffer can be forwarded */
> -static int vdi_port_read_buf_process(RedsState *reds, VDIReadBuf *buf)
> +static gboolean vdi_port_read_buf_process(VDIPortState *state, VDIReadBuf
> *buf, gboolean *error)
> {
> - VDIPortState *state = &reds->agent_state;
> int res;
>
> + *error = FALSE;
> +
> switch (state->vdi_chunk_header.port) {
> case VDP_CLIENT_PORT: {
> res = agent_msg_filter_process_data(&state->read_filter,
> @@ -647,7 +648,7 @@ static int vdi_port_read_buf_process(RedsState *reds,
> VDIReadBuf *buf)
> case AGENT_MSG_FILTER_DISCARD:
> return FALSE;
> case AGENT_MSG_FILTER_PROTO_ERROR:
> - reds_agent_remove(reds);
> + *error = TRUE;
> return FALSE;
> }
> }
> @@ -655,7 +656,7 @@ static int vdi_port_read_buf_process(RedsState *reds,
> VDIReadBuf *buf)
> return FALSE;
> default:
> spice_warning("invalid port");
> - reds_agent_remove(reds);
> + *error = TRUE;
> return FALSE;
> }
> }
> @@ -739,7 +740,8 @@ static SpiceCharDeviceMsgToClient
> *vdi_port_read_one_msg_from_device(SpiceCharDe
> state->message_receive_len -= state->receive_len;
> state->read_state = VDI_PORT_READ_STATE_READ_DATA;
> }
> - case VDI_PORT_READ_STATE_READ_DATA:
> + case VDI_PORT_READ_STATE_READ_DATA: {
> + gboolean error = FALSE;
> n = sif->read(reds->vdagent, state->receive_pos,
> state->receive_len);
> if (!n) {
> return NULL;
> @@ -758,11 +760,15 @@ static SpiceCharDeviceMsgToClient
> *vdi_port_read_one_msg_from_device(SpiceCharDe
> } else {
> state->read_state = VDI_PORT_READ_STATE_GET_BUFF;
> }
> - if (vdi_port_read_buf_process(reds, dispatch_buf)) {
> + if (vdi_port_read_buf_process(&reds->agent_state, dispatch_buf,
> &error)) {
> return dispatch_buf;
> } else {
> + if (error) {
> + reds_agent_remove(reds);
> + }
> vdi_port_read_buf_unref(dispatch_buf);
> }
> + }
> } /* END switch */
> } /* END while */
> return NULL;
> @@ -1127,18 +1133,22 @@ void reds_on_main_channel_migrate(RedsState *reds,
> MainChannelClient *mcc)
> if (agent_state->read_filter.msg_data_to_read ||
> read_data_len > sizeof(VDAgentMessage)) { /* msg header has been
> read */
> VDIReadBuf *read_buf = agent_state->current_read_buf;
> + gboolean error = FALSE;
>
> spice_debug("push partial read %u (msg first chunk? %d)",
> read_data_len,
> !agent_state->read_filter.msg_data_to_read);
>
> read_buf->len = read_data_len;
> - if (vdi_port_read_buf_process(reds, read_buf)) {
> + if (vdi_port_read_buf_process(&reds->agent_state, read_buf, &error))
> {
> main_channel_client_push_agent_data(mcc,
> read_buf->data,
> read_buf->len,
> vdi_port_read_buf_release,
> read_buf);
> } else {
> + if (error) {
> + reds_agent_remove(reds);
> + }
> vdi_port_read_buf_unref(read_buf);
> }
>
More information about the Spice-devel
mailing list