diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2018-02-20 10:50:20 +0100 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2018-03-06 14:41:30 +0100 |
commit | 23e7830f578615451fffd757f8b4092b26023551 (patch) | |
tree | 71a43803fd1b387bbbc77641a0939758d19549c7 | |
parent | 235ea901d6157f274a396c079bb61b318cf3eee0 (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.h | 6 | ||||
-rw-r--r-- | server/reds.c | 63 |
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); |