Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/red-common.h | 4 +- server/reds-private.h | 4 +- server/reds.c | 94 +++++++++++++++++++++++-------------------- server/reds.h | 2 +- 4 files changed, 56 insertions(+), 48 deletions(-) diff --git a/server/red-common.h b/server/red-common.h index 181ed283..eb2fef96 100644 --- a/server/red-common.h +++ b/server/red-common.h @@ -35,6 +35,7 @@ #include "spice.h" #include "utils.h" +#include "sys-socket.h" #define SPICE_UPCAST(type, ptr) \ (verify_expr(SPICE_OFFSETOF(type, base) == 0,SPICE_CONTAINEROF(ptr, type, base))) @@ -47,7 +48,8 @@ struct SpiceCoreInterfaceInternal { void (*timer_cancel)(const SpiceCoreInterfaceInternal *iface, SpiceTimer *timer); void (*timer_remove)(const SpiceCoreInterfaceInternal *iface, SpiceTimer *timer); - SpiceWatch *(*watch_add)(const SpiceCoreInterfaceInternal *iface, int fd, int event_mask, SpiceWatchFunc func, void *opaque); + SpiceWatch *(*watch_add)(const SpiceCoreInterfaceInternal *iface, socket_t fd, int event_mask, + SpiceWatchFunc func, void *opaque); void (*watch_update_mask)(const SpiceCoreInterfaceInternal *iface, SpiceWatch *watch, int event_mask); void (*watch_remove)(const SpiceCoreInterfaceInternal *iface, SpiceWatch *watch); diff --git a/server/reds-private.h b/server/reds-private.h index 920edc5c..17e45caf 100644 --- a/server/reds-private.h +++ b/server/reds-private.h @@ -75,8 +75,8 @@ typedef struct RedServerConfig RedServerConfig; struct RedsState { RedServerConfig *config; - int listen_socket; - int secure_listen_socket; + socket_t listen_socket; + socket_t secure_listen_socket; SpiceWatch *listen_watch; SpiceWatch *secure_listen_watch; RedCharDeviceVDIPort *agent_dev; diff --git a/server/reds.c b/server/reds.c index ec7fbc38..0421fd76 100644 --- a/server/reds.c +++ b/server/reds.c @@ -106,9 +106,10 @@ static void adapter_timer_remove(const SpiceCoreInterfaceInternal *iface, SpiceT } static SpiceWatch *adapter_watch_add(const SpiceCoreInterfaceInternal *iface, - int fd, int event_mask, SpiceWatchFunc func, void *opaque) + socket_t fd, int event_mask, SpiceWatchFunc func, void *opaque) { - return iface->public_interface->watch_add(fd, event_mask, func, opaque); + // note: Qemu API is fine having a SOCKET on Windows + return iface->public_interface->watch_add(socket_get_raw(fd), event_mask, func, opaque); } static void adapter_watch_update_mask(const SpiceCoreInterfaceInternal *iface, SpiceWatch *watch, int event_mask) @@ -168,7 +169,7 @@ struct RedServerConfig { int spice_port; int spice_secure_port; - int spice_listen_socket_fd; + socket_t spice_listen_socket_fd; char spice_addr[256]; int spice_family; TicketAuthentication taTicket; @@ -2383,7 +2384,7 @@ static void reds_handle_ssl_accept(int fd, int event, void *data) #define KEEPALIVE_TIMEOUT (10*60) -static RedLinkInfo *reds_init_client_connection(RedsState *reds, int socket) +static RedLinkInfo *reds_init_client_connection(RedsState *reds, socket_t socket) { RedLinkInfo *link; @@ -2414,7 +2415,7 @@ error: } -static RedLinkInfo *reds_init_client_ssl_connection(RedsState *reds, int socket) +static RedLinkInfo *reds_init_client_ssl_connection(RedsState *reds, socket_t socket) { RedLinkInfo *link; RedStreamSslStatus ssl_status; @@ -2447,7 +2448,7 @@ static RedLinkInfo *reds_init_client_ssl_connection(RedsState *reds, int socket) error: /* close the stream but do not close the socket, this API is * supposed to not close it if it fails */ - link->stream->socket = -1; + link->stream->socket = SOCKET_INVALID; reds_link_free(link); return NULL; } @@ -2459,11 +2460,12 @@ static void reds_accept_ssl_connection(int fd, int event, void *data) int socket; if ((socket = accept(fd, NULL, 0)) == -1) { + socket_win32_set_errno(); spice_warning("accept failed, %s", strerror(errno)); return; } - if (!(link = reds_init_client_ssl_connection(reds, socket))) { + if (!(link = reds_init_client_ssl_connection(reds, SOCKET_FROM_INT(socket)))) { close(socket); return; } @@ -2476,6 +2478,7 @@ static void reds_accept(int fd, int event, void *data) int socket; if ((socket = accept(fd, NULL, 0)) == -1) { + socket_win32_set_errno(); spice_warning("accept failed, %s", strerror(errno)); return; } @@ -2489,7 +2492,7 @@ SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *reds, int socket, in { RedLinkInfo *link; - if (!(link = reds_init_client_connection(reds, socket))) { + if (!(link = reds_init_client_connection(reds, SOCKET_FROM_INT(socket)))) { spice_warning("accept failed"); return -1; } @@ -2505,7 +2508,7 @@ SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *reds, int socket { RedLinkInfo *link; - if (!(link = reds_init_client_ssl_connection(reds, socket))) { + if (!(link = reds_init_client_ssl_connection(reds, SOCKET_FROM_INT(socket)))) { return -1; } @@ -2514,29 +2517,32 @@ SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *reds, int socket } -static int reds_init_socket(const char *addr, int portnr, int family) +static socket_t reds_init_socket(const char *addr, int portnr, int family) { static const int on=1, off=0; struct addrinfo ai,*res,*e; char port[33]; - int slisten, rc, len; + int rc; + socket_t slisten; if (family == AF_UNIX) { + int len; struct sockaddr_un local = { 0, }; - if ((slisten = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { + slisten = socket_new(AF_UNIX, SOCK_STREAM, 0); + if (!socket_is_valid(slisten)) { perror("socket"); - return -1; + return SOCKET_INVALID; } local.sun_family = AF_UNIX; g_strlcpy(local.sun_path, addr, sizeof(local.sun_path)); unlink(local.sun_path); len = SUN_LEN(&local); - if (bind(slisten, (struct sockaddr *)&local, len) == -1) { + if (socket_bind(slisten, (struct sockaddr *)&local, len) == -1) { perror("bind"); - close(slisten); - return -1; + socket_close(slisten); + return SOCKET_INVALID; } goto listen; @@ -2552,24 +2558,23 @@ static int reds_init_socket(const char *addr, int portnr, int family) if (rc != 0) { spice_warning("getaddrinfo(%s,%s): %s", addr, port, gai_strerror(rc)); - return -1; + return SOCKET_INVALID; } for (e = res; e != NULL; e = e->ai_next) { - slisten = socket(e->ai_family, e->ai_socktype, e->ai_protocol); - if (slisten < 0) { + slisten = socket_new(e->ai_family, e->ai_socktype, e->ai_protocol); + if (!socket_is_valid(slisten)) { continue; } - setsockopt(slisten,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); + socket_setopt(slisten, SOL_SOCKET, SO_REUSEADDR, (void*)&on, sizeof(on)); #ifdef IPV6_V6ONLY if (e->ai_family == PF_INET6) { /* listen on both ipv4 and ipv6 */ - setsockopt(slisten,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&off, - sizeof(off)); + socket_setopt(slisten, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&off, sizeof(off)); } #endif - if (bind(slisten, e->ai_addr, e->ai_addrlen) == 0) { + if (socket_bind(slisten, e->ai_addr, e->ai_addrlen) == 0) { char uaddr[INET6_ADDRSTRLEN+1]; char uport[33]; rc = getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen, @@ -2583,17 +2588,17 @@ static int reds_init_socket(const char *addr, int portnr, int family) freeaddrinfo(res); goto listen; } - close(slisten); + socket_close(slisten); } spice_warning("binding socket to %s:%d failed", addr, portnr); freeaddrinfo(res); - return -1; + return SOCKET_INVALID; listen: - if (listen(slisten, SOMAXCONN) != 0) { + if (socket_listen(slisten, SOMAXCONN) != 0) { spice_warning("listen: %s", strerror(errno)); - close(slisten); - return -1; + socket_close(slisten); + return SOCKET_INVALID; } return slisten; } @@ -2627,19 +2632,20 @@ void reds_set_client_mm_time_latency(RedsState *reds, RedClient *client, uint32_ static void reds_cleanup_net(SpiceServer *reds) { - if (reds->listen_socket != -1) { + if (socket_is_valid(reds->listen_socket)) { reds_core_watch_remove(reds, reds->listen_watch); - if (reds->config->spice_listen_socket_fd != reds->listen_socket) { - close(reds->listen_socket); + if (socket_get_raw(reds->config->spice_listen_socket_fd) != + socket_get_raw(reds->listen_socket)) { + socket_close(reds->listen_socket); } reds->listen_watch = NULL; - reds->listen_socket = -1; + reds->listen_socket = SOCKET_INVALID; } - if (reds->secure_listen_socket != -1) { + if (socket_is_valid(reds->secure_listen_socket)) { reds_core_watch_remove(reds, reds->secure_listen_watch); - close(reds->secure_listen_socket); + socket_close(reds->secure_listen_socket); reds->secure_listen_watch = NULL; - reds->secure_listen_socket = -1; + reds->secure_listen_socket = SOCKET_INVALID; } } @@ -2647,7 +2653,7 @@ 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) { + if (!socket_is_valid(reds->listen_socket)) { return -1; } reds->listen_watch = reds_core_watch_add(reds, reds->listen_socket, @@ -2661,7 +2667,7 @@ static int reds_init_net(RedsState *reds) 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) { + if (!socket_is_valid(reds->secure_listen_socket)) { return -1; } reds->secure_listen_watch = reds_core_watch_add(reds, reds->secure_listen_socket, @@ -2672,7 +2678,7 @@ static int reds_init_net(RedsState *reds) } } - if (reds->config->spice_listen_socket_fd != -1 ) { + if (socket_is_valid(reds->config->spice_listen_socket_fd)) { reds->listen_socket = reds->config->spice_listen_socket_fd; reds->listen_watch = reds_core_watch_add(reds, reds->listen_socket, SPICE_WATCH_EVENT_READ, @@ -3400,7 +3406,7 @@ static int do_spice_init(RedsState *reds, SpiceCoreInterface *core_interface) spice_warning("Failed to open SPICE sockets"); goto err; } - if (reds->secure_listen_socket != -1) { + if (socket_is_valid(reds->secure_listen_socket)) { if (reds_init_ssl(reds) < 0) { goto err; } @@ -3456,7 +3462,7 @@ SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void) reds->config->renderers = g_array_sized_new(FALSE, TRUE, sizeof(uint32_t), RED_RENDERER_LAST); reds->config->spice_port = -1; reds->config->spice_secure_port = -1; - reds->config->spice_listen_socket_fd = -1; + reds->config->spice_listen_socket_fd = SOCKET_INVALID; reds->config->spice_family = PF_UNSPEC; reds->config->sasl_enabled = 0; // sasl disabled by default #if HAVE_SASL @@ -3482,8 +3488,8 @@ 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; + reds->listen_socket = SOCKET_INVALID; + reds->secure_listen_socket = SOCKET_INVALID; /* This environment was in red-worker so the "WORKER" in it. * For compatibility reason we maintain the old name */ @@ -3770,7 +3776,7 @@ SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *reds, const char *add SPICE_GNUC_VISIBLE int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd) { - s->config->spice_listen_socket_fd = listen_fd; + s->config->spice_listen_socket_fd = SOCKET_FROM_INT(listen_fd); return 0; } @@ -4236,7 +4242,7 @@ SpiceCoreInterfaceInternal* reds_get_core_interface(RedsState *reds) } SpiceWatch *reds_core_watch_add(RedsState *reds, - int fd, int event_mask, + socket_t fd, int event_mask, SpiceWatchFunc func, void *opaque) { diff --git a/server/reds.h b/server/reds.h index 106310eb..8481d7c6 100644 --- a/server/reds.h +++ b/server/reds.h @@ -105,7 +105,7 @@ struct RedRecord *reds_get_record(RedsState *reds); /* fd watches/timers */ SpiceWatch *reds_core_watch_add(RedsState *reds, - int fd, int event_mask, + socket_t fd, int event_mask, SpiceWatchFunc func, void *opaque); void reds_core_watch_update_mask(RedsState *reds, -- 2.20.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel