summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2011-02-10 04:26:00 +0100
committerAlon Levy <alevy@redhat.com>2011-07-21 15:09:26 +0300
commita3732afda3a1d44c836c4755a332ce24215efcf0 (patch)
tree6cdeed0f164150c33eca28db898a9f99d9ab5045 /server
parent26ded5e3950b2c9c552a3fc89647203e63b02411 (diff)
downloadspice-a3732afda3a1d44c836c4755a332ce24215efcf0.tar.gz
spice-a3732afda3a1d44c836c4755a332ce24215efcf0.tar.xz
spice-a3732afda3a1d44c836c4755a332ce24215efcf0.zip
server/reds: make writev fallback more generic
We are going to reuse it for SASL/SSF encode write(). https://bugs.freedesktop.org/show_bug.cgi?id=34795
Diffstat (limited to 'server')
-rw-r--r--server/reds.c43
1 files changed, 17 insertions, 26 deletions
diff --git a/server/reds.c b/server/reds.c
index d3415e38..95116add 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -434,30 +434,6 @@ static ssize_t stream_ssl_read_cb(RedsStream *s, void *buf, size_t size)
return return_code;
}
-static ssize_t stream_ssl_writev_cb(RedsStream *s, const struct iovec *vector, int count)
-{
- int i;
- int n;
- ssize_t return_code = 0;
- int ssl_error;
-
- for (i = 0; i < count; ++i) {
- n = SSL_write(s->ssl, vector[i].iov_base, vector[i].iov_len);
- if (n <= 0) {
- ssl_error = SSL_get_error(s->ssl, n);
- if (return_code <= 0) {
- return n;
- } else {
- break;
- }
- } else {
- return_code += n;
- }
- }
-
- return return_code;
-}
-
static void reds_stream_remove_watch(RedsStream* s)
{
if (s->watch) {
@@ -2882,7 +2858,7 @@ static void reds_accept_ssl_connection(int fd, int event, void *data)
link->stream->write = stream_ssl_write_cb;
link->stream->read = stream_ssl_read_cb;
- link->stream->writev = stream_ssl_writev_cb;
+ link->stream->writev = NULL;
return_code = SSL_accept(link->stream->ssl);
if (return_code == 1) {
@@ -4207,7 +4183,22 @@ ssize_t reds_stream_write(RedsStream *s, const void *buf, size_t nbyte)
ssize_t reds_stream_writev(RedsStream *s, const struct iovec *iov, int iovcnt)
{
- return s->writev(s, iov, iovcnt);
+ int i;
+ int n;
+ ssize_t ret = 0;
+
+ if (s->writev != NULL) {
+ return s->writev(s, iov, iovcnt);
+ }
+
+ for (i = 0; i < iovcnt; ++i) {
+ n = reds_stream_write(s, iov[i].iov_base, iov[i].iov_len);
+ if (n <= 0)
+ return ret == 0 ? n : ret;
+ ret += n;
+ }
+
+ return ret;
}
void reds_stream_free(RedsStream *s)