summaryrefslogtreecommitdiffstats
path: root/server/reds.c
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2013-10-07 13:50:20 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2014-01-20 12:15:41 +0100
commit8b347a641c885fdc31a41a1b1a55da982b580265 (patch)
tree659abc85944ebd4c41fb12eaf34223d807991abc /server/reds.c
parent73c56e5a2d952bf566c3fbff5e9aefff70ddd59a (diff)
downloadspice-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.c181
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);
-}