[Spice-devel] [PATCH spice-server 12/23] websocket: Propagate some variable
Frediano Ziglio
fziglio at redhat.com
Tue Jun 25 16:11:36 UTC 2019
These were introduced moving code around.
No more reason to copy, just use directly structure fields.
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/websocket.c | 47 ++++++++++++++++++++--------------------------
1 file changed, 20 insertions(+), 27 deletions(-)
diff --git a/server/websocket.c b/server/websocket.c
index 38496fb5a..afb7502a1 100644
--- a/server/websocket.c
+++ b/server/websocket.c
@@ -90,7 +90,7 @@ struct RedsWebSocket {
websocket_writev_cb_t raw_writev;
};
-static void websocket_ack_close(void *opaque, websocket_write_cb_t write_cb);
+static void websocket_ack_close(void *stream, websocket_write_cb_t write_cb);
/* Perform a case insensitive search for needle in haystack.
If found, return a pointer to the byte after the end of needle.
@@ -279,9 +279,6 @@ int websocket_read(RedsWebSocket *ws, uint8_t *buf, size_t size)
int n = 0;
int rc;
websocket_frame_t *frame = &ws->read_frame;
- void *opaque = ws->raw_stream;
- websocket_read_cb_t read_cb = (websocket_read_cb_t) ws->raw_read;
- websocket_write_cb_t write_cb = (websocket_write_cb_t) ws->raw_write;
if (ws->closed) {
return 0;
@@ -290,7 +287,8 @@ int websocket_read(RedsWebSocket *ws, uint8_t *buf, size_t size)
while (size > 0) {
// make sure we have a proper frame ready
if (!frame->frame_ready) {
- rc = read_cb(ws->raw_stream, frame->header + frame->header_pos, frame_bytes_needed(frame));
+ rc = ws->raw_read(ws->raw_stream, frame->header + frame->header_pos,
+ frame_bytes_needed(frame));
if (rc <= 0) {
goto read_error;
}
@@ -302,12 +300,13 @@ int websocket_read(RedsWebSocket *ws, uint8_t *buf, size_t size)
return -1;
}
} else if (frame->type == CLOSE_FRAME) {
- websocket_ack_close(opaque, write_cb);
+ websocket_ack_close(ws->raw_stream, ws->raw_write);
websocket_clear_frame(frame);
ws->closed = true;
return 0;
} else if (frame->type == BINARY_FRAME) {
- rc = read_cb(opaque, buf, MIN(size, frame->expected_len - frame->relayed));
+ rc = ws->raw_read(ws->raw_stream, buf,
+ MIN(size, frame->expected_len - frame->relayed));
if (rc <= 0) {
goto read_error;
}
@@ -403,24 +402,21 @@ int websocket_writev(RedsWebSocket *ws, const struct iovec *iov, int iovcnt)
int iov_out_cnt;
int i;
int header_len;
- void *opaque = ws->raw_stream;
- websocket_writev_cb_t writev_cb = (websocket_writev_cb_t) ws->raw_writev;
- uint64_t *remainder = &ws->write_remainder;
if (ws->closed) {
errno = EPIPE;
return -1;
}
- if (*remainder > 0) {
- constrain_iov((struct iovec *) iov, iovcnt, &iov_out, &iov_out_cnt, *remainder);
- rc = writev_cb(opaque, iov_out, iov_out_cnt);
+ if (ws->write_remainder > 0) {
+ constrain_iov((struct iovec *) iov, iovcnt, &iov_out, &iov_out_cnt, ws->write_remainder);
+ rc = ws->raw_writev(ws->raw_stream, iov_out, iov_out_cnt);
if (iov_out != iov) {
g_free(iov_out);
}
if (rc <= 0) {
return rc;
}
- *remainder -= rc;
+ ws->write_remainder -= rc;
return rc;
}
@@ -436,7 +432,7 @@ int websocket_writev(RedsWebSocket *ws, const struct iovec *iov, int iovcnt)
header_len = fill_header(header, len);
iov_out[0].iov_len = header_len;
iov_out[0].iov_base = header;
- rc = writev_cb(opaque, iov_out, iov_out_cnt);
+ rc = ws->raw_writev(ws->raw_stream, iov_out, iov_out_cnt);
g_free(iov_out);
if (rc <= 0) {
return rc;
@@ -448,7 +444,7 @@ int websocket_writev(RedsWebSocket *ws, const struct iovec *iov, int iovcnt)
/* Key point: if we did not write out all the data, remember how
much more data the client is expecting, and write that data without
a header of any kind the next time around */
- *remainder = len - rc;
+ ws->write_remainder = len - rc;
return rc;
}
@@ -458,18 +454,15 @@ int websocket_write(RedsWebSocket *ws, const void *buf, size_t len)
uint8_t header[WEBSOCKET_MAX_HEADER_SIZE];
int rc;
int header_len;
- void *opaque = ws->raw_stream;
- websocket_write_cb_t write_cb = (websocket_write_cb_t) ws->raw_write;
- uint64_t *remainder = &ws->write_remainder;
if (ws->closed) {
errno = EPIPE;
return -1;
}
- if (*remainder == 0) {
+ if (ws->write_remainder == 0) {
header_len = fill_header(header, len);
- rc = write_cb(opaque, header, header_len);
+ rc = ws->raw_write(ws->raw_stream, header, header_len);
if (rc <= 0) {
return rc;
}
@@ -481,26 +474,26 @@ int websocket_write(RedsWebSocket *ws, const void *buf, size_t len)
return -1;
}
} else {
- len = MIN(*remainder, len);
+ len = MIN(ws->write_remainder, len);
}
- rc = write_cb(opaque, buf, len);
+ rc = ws->raw_write(ws->raw_stream, buf, len);
if (rc <= 0) {
- *remainder = len;
+ ws->write_remainder = len;
} else {
- *remainder = len - rc;
+ ws->write_remainder = len - rc;
}
return rc;
}
-static void websocket_ack_close(void *opaque, websocket_write_cb_t write_cb)
+static void websocket_ack_close(void *stream, websocket_write_cb_t write_cb)
{
unsigned char header[2];
header[0] = FIN_FLAG | CLOSE_FRAME;
header[1] = 0;
- write_cb(opaque, header, sizeof(header));
+ write_cb(stream, header, sizeof(header));
}
static bool websocket_is_start(char *buf)
--
2.20.1
More information about the Spice-devel
mailing list