summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2018-02-20 10:50:20 +0100
committerChristophe Fergeau <cfergeau@redhat.com>2018-03-06 14:41:30 +0100
commit23e7830f578615451fffd757f8b4092b26023551 (patch)
tree71a43803fd1b387bbbc77641a0939758d19549c7
parent235ea901d6157f274a396c079bb61b318cf3eee0 (diff)
reds: Remove RedsState::{secure_,}listen_socket
This commit replaces the socket/watch members in RedsState with 2 lists so that we can have an arbitrary number of these rather than just one plain-text socket, and one TLS socket.
-rw-r--r--server/reds-private.h6
-rw-r--r--server/reds.c63
2 files changed, 34 insertions, 35 deletions
diff --git a/server/reds-private.h b/server/reds-private.h
index 4b1ac116..8d7c4794 100644
--- a/server/reds-private.h
+++ b/server/reds-private.h
@@ -75,10 +75,8 @@ typedef struct RedServerConfig RedServerConfig;
struct RedsState {
RedServerConfig *config;
- int listen_socket;
- int secure_listen_socket;
- SpiceWatch *listen_watch;
- SpiceWatch *secure_listen_watch;
+ GList *sockets;
+ GList *watches;
bool use_tls;
RedCharDeviceVDIPort *agent_dev;
int pending_mouse_event;
diff --git a/server/reds.c b/server/reds.c
index 2d77dd7a..f61368fd 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -2472,7 +2472,7 @@ SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *reds, int socket
return 0;
}
-static SpiceWatch *reds_register_socket(RedsState *reds, int fd, bool use_tls)
+static bool reds_register_socket(RedsState *reds, int fd, bool use_tls)
{
SpiceWatch *watch;
@@ -2489,9 +2489,13 @@ static SpiceWatch *reds_register_socket(RedsState *reds, int fd, bool use_tls)
if (watch == NULL) {
spice_warning("set fd handle failed");
+ return false;
}
- return watch;
+ reds->watches = g_list_prepend(reds->watches, watch);
+ reds->sockets = g_list_prepend(reds->sockets, GINT_TO_POINTER(fd));
+
+ return true;
}
static int reds_init_socket(const char *addr, int portnr, int family)
@@ -2608,40 +2612,37 @@ void reds_set_client_mm_time_latency(RedsState *reds, RedClient *client, uint32_
static int reds_init_net(RedsState *reds)
{
if (reds->config->spice_port != -1 || reds->config->spice_family == AF_UNIX) {
- reds->listen_socket = reds_init_socket(reds->config->spice_addr, reds->config->spice_port, reds->config->spice_family);
- if (-1 == reds->listen_socket) {
+ int listen_socket;
+
+ listen_socket = reds_init_socket(reds->config->spice_addr, reds->config->spice_port, reds->config->spice_family);
+ if (-1 == listen_socket) {
return -1;
}
- reds->listen_watch = reds_register_socket(reds, reds->listen_socket, false);
- if (reds->listen_watch == NULL) {
- close(reds->listen_socket);
- reds->listen_socket = -1;
+ if (!reds_register_socket(reds, listen_socket, false)) {
+ close(listen_socket);
return -1;
}
}
if (reds->config->spice_secure_port != -1) {
- reds->secure_listen_socket = reds_init_socket(reds->config->spice_addr, reds->config->spice_secure_port,
- reds->config->spice_family);
- if (-1 == reds->secure_listen_socket) {
+ int listen_socket;
+
+ listen_socket = reds_init_socket(reds->config->spice_addr, reds->config->spice_secure_port,
+ reds->config->spice_family);
+ if (-1 == listen_socket) {
return -1;
}
- reds->secure_listen_watch = reds_register_socket(reds, reds->secure_listen_socket, true);
- if (reds->secure_listen_watch == NULL) {
- close(reds->secure_listen_socket);
- reds->secure_listen_socket = -1;
+ if (!reds_register_socket(reds, listen_socket, true)) {
+ close(listen_socket);
return -1;
}
}
/* FIXME: can we have both spice_listen_socket_fd and
* spice_port/spice_family/spice_addr set? */
- assert(reds->listen_watch == NULL);
+ assert(reds->watches == NULL);
if (reds->config->spice_listen_socket_fd != -1 ) {
- reds->listen_socket = reds->config->spice_listen_socket_fd;
- reds->listen_watch = reds_register_socket(reds, reds->listen_socket, false);
- if (reds->listen_watch == NULL) {
- reds->listen_socket = -1;
+ if (!reds_register_socket(reds, reds->config->spice_listen_socket_fd, false)) {
return -1;
}
}
@@ -3442,8 +3443,6 @@ SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void)
*/
stat_file_add_node(reds->stat_file, INVALID_STAT_REF, "default_channel", TRUE);
#endif
- reds->listen_socket = -1;
- reds->secure_listen_socket = -1;
/* This environment was in red-worker so the "WORKER" in it.
* For compatibility reason we maintain the old name */
@@ -3652,16 +3651,18 @@ SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *reds)
if (reds->main_dispatcher) {
g_object_unref(reds->main_dispatcher);
}
- if (reds->listen_socket != -1) {
- reds_core_watch_remove(reds, reds->listen_watch);
- if (reds->config->spice_listen_socket_fd != reds->listen_socket) {
- close(reds->listen_socket);
- }
- }
- if (reds->secure_listen_socket != -1) {
- reds_core_watch_remove(reds, reds->secure_listen_watch);
- close(reds->secure_listen_socket);
+ GList *it;
+ for (it = reds->watches; it != NULL; it = it->next) {
+ reds_core_watch_remove(reds, it->data);
+ }
+ g_clear_pointer(&reds->watches, g_list_free);
+ for (it = reds->sockets; it != NULL; it = it->next) {
+ int fd = GPOINTER_TO_INT(it->data);
+ if (reds->config->spice_listen_socket_fd != fd) {
+ close(fd);
+ }
}
+ g_clear_pointer(&reds->sockets, g_list_free);
g_clear_object(&reds->agent_dev);
spice_buffer_free(&reds->client_monitors_config);
red_record_unref(reds->record);