summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2011-02-27 09:46:14 +0100
committerAlon Levy <alevy@redhat.com>2011-07-21 15:09:25 +0300
commiteeb95c5b84e81a2ba6745fbeb1689d0ef5dc49d0 (patch)
tree2c4fd90aa21382e93bb400ca7bb2bcd6117ecb77 /server
parent881971fbcab7c1eaf47a9edcf517aeaa09945dae (diff)
downloadspice-eeb95c5b84e81a2ba6745fbeb1689d0ef5dc49d0.tar.gz
spice-eeb95c5b84e81a2ba6745fbeb1689d0ef5dc49d0.tar.xz
spice-eeb95c5b84e81a2ba6745fbeb1689d0ef5dc49d0.zip
server: add reds_stream_{read,write,free,remove_watch}()
https://bugs.freedesktop.org/show_bug.cgi?id=34795
Diffstat (limited to 'server')
-rw-r--r--server/red_channel.c2
-rw-r--r--server/red_worker.c6
-rw-r--r--server/reds.c62
-rw-r--r--server/reds.h16
-rw-r--r--server/snd_worker.c4
5 files changed, 80 insertions, 10 deletions
diff --git a/server/red_channel.c b/server/red_channel.c
index a3dbaa29..a7620f77 100644
--- a/server/red_channel.c
+++ b/server/red_channel.c
@@ -293,7 +293,7 @@ RedChannel *red_channel_create(int size, RedsStream *peer,
error:
free(channel);
- peer->cb_free(peer);
+ reds_stream_free(peer);
return NULL;
}
diff --git a/server/red_worker.c b/server/red_worker.c
index 467b4a85..84697b3d 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -8512,9 +8512,7 @@ static void red_disconnect_channel(RedChannel *channel)
{
channel_release_res(channel);
red_pipe_clear(channel);
-
- channel->peer->cb_free(channel->peer);
-
+ reds_stream_free(channel->peer);
channel->peer = NULL;
channel->send_data.blocked = FALSE;
channel->send_data.size = channel->send_data.pos = 0;
@@ -9371,7 +9369,7 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_i
error2:
free(channel);
error1:
- peer->cb_free(peer);
+ reds_stream_free(peer);
return NULL;
}
diff --git a/server/reds.c b/server/reds.c
index 63fd08fe..fa197f67 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -479,7 +479,7 @@ static int reds_ssl_writev(void *ctx, const struct iovec *vector, int count)
return return_code;
}
-static int reds_ssl_free(RedsStream *peer)
+static int reds_ssl_free(RedsStream* peer)
{
reds_channel_event(peer, SPICE_CHANNEL_EVENT_DISCONNECTED);
SSL_free(peer->ssl);
@@ -488,6 +488,33 @@ static int reds_ssl_free(RedsStream *peer)
return 0;
}
+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->peer);
+ link->peer = NULL;
+
+ free(link->link_mess);
+ link->link_mess = NULL;
+
+ BN_free(link->tiTicketing.bn);
+ link->tiTicketing.bn = NULL;
+
+ if (link->tiTicketing.rsa) {
+ RSA_free(link->tiTicketing.rsa);
+ link->tiTicketing.rsa = NULL;
+ }
+
+ free(link);
+}
+
static void __reds_release_link(RedLinkInfo *link)
{
ASSERT(link->peer);
@@ -4223,3 +4250,36 @@ __visible__ int spice_server_migrate_switch(SpiceServer *s)
reds_mig_switch();
return 0;
}
+
+ssize_t reds_stream_read(RedsStream *s, void *buf, size_t nbyte)
+{
+ return s->read(s, buf, nbyte);
+}
+
+ssize_t reds_stream_write(RedsStream *s, const void *buf, size_t nbyte)
+{
+ return s->write(s, buf, nbyte);
+}
+
+ssize_t reds_stream_writev(RedsStream *s, const struct iovec *iov, int iovcnt)
+{
+ return s->writev(s, iov, iovcnt);
+}
+
+void reds_stream_free(RedsStream *s)
+{
+ if (!s) {
+ return;
+ }
+
+ reds_channel_event(s, SPICE_CHANNEL_EVENT_DISCONNECTED);
+
+ if (s->ssl) {
+ SSL_free(s->ssl);
+ }
+
+ reds_stream_remove_watch(s);
+ close(s->socket);
+
+ free(s);
+}
diff --git a/server/reds.h b/server/reds.h
index 2c977296..3ed097cc 100644
--- a/server/reds.h
+++ b/server/reds.h
@@ -24,7 +24,9 @@
#define __visible__ __attribute__ ((visibility ("default")))
-typedef struct RedsStream {
+typedef struct RedsStream RedsStream;
+
+struct RedsStream {
void *ctx;
int socket;
@@ -42,7 +44,12 @@ typedef struct RedsStream {
int (*cb_writev)(void *, const struct iovec *vector, int count);
int (*cb_free)(struct RedsStream *);
-} RedsStream;
+
+ /* private */
+ ssize_t (*read)(RedsStream *s, void *buf, size_t nbyte);
+ ssize_t (*write)(RedsStream *s, const void *buf, size_t nbyte);
+ ssize_t (*writev)(RedsStream *s, const struct iovec *iov, int iovcnt);
+};
typedef struct Channel {
struct Channel *next;
@@ -81,6 +88,11 @@ struct SpiceNetWireState {
struct TunnelWorker *worker;
};
+ssize_t reds_stream_read(RedsStream *s, void *buf, size_t nbyte);
+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);
+void reds_stream_free(RedsStream *s);
+
void reds_desable_mm_timer();
void reds_enable_mm_timer();
void reds_update_mm_timer(uint32_t mm_time);
diff --git a/server/snd_worker.c b/server/snd_worker.c
index 2cd4d92b..fcfaf978 100644
--- a/server/snd_worker.c
+++ b/server/snd_worker.c
@@ -188,7 +188,7 @@ static void snd_disconnect_channel(SndChannel *channel)
worker->connection = NULL;
core->watch_remove(channel->peer->watch);
channel->peer->watch = NULL;
- channel->peer->cb_free(channel->peer);
+ reds_stream_free(channel->peer);
spice_marshaller_destroy(channel->send_data.marshaller);
free(channel);
}
@@ -800,7 +800,7 @@ error2:
free(channel);
error1:
- peer->cb_free(peer);
+ reds_stream_free(peer);
return NULL;
}