[PATCH 05/15] Remove dependency of vdi_port_read_buf_process on RedsState

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Christophe Fergeau <cfergeau@xxxxxxxxxx>

This makes it easier to move the VDIPort API to a different file, and
make it as self-contained as possible.
---
 server/reds.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/server/reds.c b/server/reds.c
index 736dca6..08913e8 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -632,14 +632,16 @@ 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, reds,
+        res = agent_msg_filter_process_data(&state->read_filter,
+                                            spice_char_device_get_server(state->base),
                                             buf->data, buf->len);
         switch (res) {
         case AGENT_MSG_FILTER_OK:
@@ -647,7 +649,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 +657,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 +741,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 +761,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;
@@ -1122,18 +1129,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);
         }
 
-- 
2.5.0

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]