summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2011-12-12 16:52:31 +0000
committerMarc-André Lureau <marcandre.lureau@redhat.com>2012-01-09 18:57:57 +0100
commitd55b68b6b44f2499278fa860fb47ff22f5011faa (patch)
treef6d84b4dd87b32457d747a9e5c2c216ff7571b83
parent803be1bea790381e30ef0eb0752992736441b4ff (diff)
downloadspice-d55b68b6b44f2499278fa860fb47ff22f5011faa.tar.gz
spice-d55b68b6b44f2499278fa860fb47ff22f5011faa.tar.xz
spice-d55b68b6b44f2499278fa860fb47ff22f5011faa.zip
Add APIs for injecting a client connection socket
Allow applications to pass a pre-accepted client socket file descriptor in. The new APIs are spice_server_add_ssl_client and spice_server_add_client * server/reds.c: Implement new APIs * server/spice.h: Define new APIs Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
-rw-r--r--server/reds.c29
-rw-r--r--server/spice-server.syms5
-rw-r--r--server/spice.h3
3 files changed, 33 insertions, 4 deletions
diff --git a/server/reds.c b/server/reds.c
index 3ba55c1b..a8c23d3c 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -2805,8 +2805,6 @@ static void reds_accept_ssl_connection(int fd, int event, void *data)
static void reds_accept(int fd, int event, void *data)
{
- RedLinkInfo *link;
- RedsStream *stream;
int socket;
if ((socket = accept(reds->listen_socket, NULL, 0)) == -1) {
@@ -2814,11 +2812,20 @@ static void reds_accept(int fd, int event, void *data)
return;
}
+ if (spice_server_add_client(reds, socket) < 0)
+ close(socket);
+}
+
+SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket)
+{
+ RedLinkInfo *link;
+ RedsStream *stream;
+
+ ASSERT(reds == s);
if (!(link = reds_init_client_connection(socket))) {
red_printf("accept failed");
- close(socket);
- return;
+ return -1;
}
stream = link->stream;
@@ -2827,8 +2834,22 @@ static void reds_accept(int fd, int event, void *data)
stream->writev = stream_writev_cb;
reds_handle_new_link(link);
+ return 0;
}
+
+SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s, int socket)
+{
+ RedLinkInfo *link;
+
+ ASSERT(reds == s);
+ if (!(link = reds_init_client_ssl_connection(socket))) {
+ return -1;
+ }
+ return 0;
+}
+
+
static int reds_init_socket(const char *addr, int portnr, int family)
{
static const int on=1, off=0;
diff --git a/server/spice-server.syms b/server/spice-server.syms
index 3f93888a..d9beec35 100644
--- a/server/spice-server.syms
+++ b/server/spice-server.syms
@@ -96,3 +96,8 @@ global:
spice_server_get_num_clients;
} SPICE_SERVER_0.8.3;
+SPICE_SERVER_0.10.1 {
+global:
+ spice_server_add_client;
+ spice_server_add_ssl_client;
+} SPICE_SERVER_0.10.0;
diff --git a/server/spice.h b/server/spice.h
index 974975a7..fbd409a9 100644
--- a/server/spice.h
+++ b/server/spice.h
@@ -425,6 +425,9 @@ int spice_server_set_tls(SpiceServer *s, int port,
const char *private_key_file, const char *key_passwd,
const char *dh_key_file, const char *ciphersuite);
+int spice_server_add_client(SpiceServer *s, int socket);
+int spice_server_add_ssl_client(SpiceServer *s, int socket);
+
int spice_server_add_interface(SpiceServer *s,
SpiceBaseInstance *sin);
int spice_server_remove_interface(SpiceBaseInstance *sin);