diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2013-10-07 13:50:20 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2014-01-20 12:15:41 +0100 |
commit | 8b347a641c885fdc31a41a1b1a55da982b580265 (patch) | |
tree | 659abc85944ebd4c41fb12eaf34223d807991abc /server/reds.c | |
parent | 73c56e5a2d952bf566c3fbff5e9aefff70ddd59a (diff) | |
download | spice-8b347a641c885fdc31a41a1b1a55da982b580265.tar.gz spice-8b347a641c885fdc31a41a1b1a55da982b580265.tar.xz spice-8b347a641c885fdc31a41a1b1a55da982b580265.zip |
Add reds_stream.[ch]
Gather common RedsStream code there rather than having it
in reds.c
Diffstat (limited to 'server/reds.c')
-rw-r--r-- | server/reds.c | 181 |
1 files changed, 1 insertions, 180 deletions
diff --git a/server/reds.c b/server/reds.c index d79732c6..6e43feaa 100644 --- a/server/reds.c +++ b/server/reds.c @@ -73,6 +73,7 @@ #ifdef USE_SMARTCARD #include "smartcard.h" #endif +#include "reds_stream.h" #include "reds-private.h" @@ -184,11 +185,6 @@ static ChannelSecurityOptions *find_channel_security(int id) return now; } -static void reds_stream_push_channel_event(RedsStream *s, int event) -{ - main_dispatcher_channel_event(event, s->info); -} - void reds_handle_channel_event(int event, SpiceChannelEventInfo *info) { if (core->base.minor_version >= 3 && core->channel_event != NULL) @@ -266,14 +262,6 @@ static ssize_t stream_ssl_read_cb(RedsStream *s, void *buf, size_t size) return return_code; } -static void reds_stream_remove_watch(RedsStream* s) -{ - if (s->watch) { - core->watch_remove(s->watch); - s->watch = NULL; - } -} - static void reds_link_free(RedLinkInfo *link) { reds_stream_free(link->stream); @@ -2000,92 +1988,6 @@ static int sync_write_u32(RedsStream *s, uint32_t n) { return sync_write(s, &n, sizeof(uint32_t)); } - -static ssize_t reds_stream_sasl_write(RedsStream *s, const void *buf, size_t nbyte) -{ - ssize_t ret; - - if (!s->sasl.encoded) { - int err; - err = sasl_encode(s->sasl.conn, (char *)buf, nbyte, - (const char **)&s->sasl.encoded, - &s->sasl.encodedLength); - if (err != SASL_OK) { - spice_warning("sasl_encode error: %d", err); - return -1; - } - - if (s->sasl.encodedLength == 0) { - return 0; - } - - if (!s->sasl.encoded) { - spice_warning("sasl_encode didn't return a buffer!"); - return 0; - } - - s->sasl.encodedOffset = 0; - } - - ret = s->write(s, s->sasl.encoded + s->sasl.encodedOffset, - s->sasl.encodedLength - s->sasl.encodedOffset); - - if (ret <= 0) { - return ret; - } - - s->sasl.encodedOffset += ret; - if (s->sasl.encodedOffset == s->sasl.encodedLength) { - s->sasl.encoded = NULL; - s->sasl.encodedOffset = s->sasl.encodedLength = 0; - return nbyte; - } - - /* we didn't flush the encoded buffer */ - errno = EAGAIN; - return -1; -} - -static ssize_t reds_stream_sasl_read(RedsStream *s, uint8_t *buf, size_t nbyte) -{ - uint8_t encoded[4096]; - const char *decoded; - unsigned int decodedlen; - int err; - int n; - - n = spice_buffer_copy(&s->sasl.inbuffer, buf, nbyte); - if (n > 0) { - spice_buffer_remove(&s->sasl.inbuffer, n); - if (n == nbyte) - return n; - nbyte -= n; - buf += n; - } - - n = s->read(s, encoded, sizeof(encoded)); - if (n <= 0) { - return n; - } - - err = sasl_decode(s->sasl.conn, - (char *)encoded, n, - &decoded, &decodedlen); - if (err != SASL_OK) { - spice_warning("sasl_decode error: %d", err); - return -1; - } - - if (decodedlen == 0) { - errno = EAGAIN; - return -1; - } - - n = MIN(nbyte, decodedlen); - memcpy(buf, decoded, n); - spice_buffer_append(&s->sasl.inbuffer, decoded + n, decodedlen - n); - return n; -} #endif static void async_read_handler(int fd, int event, void *data) @@ -4509,84 +4411,3 @@ SPICE_GNUC_VISIBLE void spice_server_set_seamless_migration(SpiceServer *s, int reds->seamless_migration_enabled = enable && !reds->allow_multiple_clients; spice_debug("seamless migration enabled=%d", enable); } - -ssize_t reds_stream_read(RedsStream *s, void *buf, size_t nbyte) -{ - ssize_t ret; - -#if HAVE_SASL - if (s->sasl.conn && s->sasl.runSSF) { - ret = reds_stream_sasl_read(s, buf, nbyte); - } else -#endif - ret = s->read(s, buf, nbyte); - - return ret; -} - -ssize_t reds_stream_write(RedsStream *s, const void *buf, size_t nbyte) -{ - ssize_t ret; - -#if HAVE_SASL - if (s->sasl.conn && s->sasl.runSSF) { - ret = reds_stream_sasl_write(s, buf, nbyte); - } else -#endif - ret = s->write(s, buf, nbyte); - - return ret; -} - -ssize_t reds_stream_writev(RedsStream *s, const struct iovec *iov, int 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) -{ - if (!s) { - return; - } - - reds_stream_push_channel_event(s, SPICE_CHANNEL_EVENT_DISCONNECTED); - -#if HAVE_SASL - if (s->sasl.conn) { - s->sasl.runSSF = s->sasl.wantSSF = 0; - s->sasl.len = 0; - s->sasl.encodedLength = s->sasl.encodedOffset = 0; - s->sasl.encoded = NULL; - free(s->sasl.mechlist); - free(s->sasl.mechname); - s->sasl.mechlist = NULL; - sasl_dispose(&s->sasl.conn); - s->sasl.conn = NULL; - } -#endif - - if (s->ssl) { - SSL_free(s->ssl); - } - - reds_stream_remove_watch(s); - spice_info("close socket fd %d", s->socket); - close(s->socket); - - free(s); -} |