This new function removes one place outside of RedsStream which needs to access RedsStream::socket --- server/reds-stream.c | 26 ++++++++++++++++++++++++++ server/reds-stream.h | 1 + server/reds.c | 26 +------------------------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/server/reds-stream.c b/server/reds-stream.c index dd0eb8a..9f4450b 100644 --- a/server/reds-stream.c +++ b/server/reds-stream.c @@ -289,6 +289,32 @@ bool reds_stream_set_non_blocking(RedsStream *stream, bool non_blocking) return TRUE; } +bool reds_stream_set_keepalive(RedsStream *stream, bool enable, int timeout) +{ + int keepalive = !!enable; + + if (setsockopt(stream->socket, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)) == -1) { + if (errno != ENOTSUP) { + spice_printerr("setsockopt for keepalive failed, %s", strerror(errno)); + return FALSE; + } + } + + if (!enable) { + return TRUE; + } + + if (setsockopt(stream->socket, SOL_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout)) == -1) { + if (errno != ENOTSUP) { + spice_printerr("setsockopt for keepalive timeout failed, %s", strerror(errno)); + return FALSE; + } + } + + return TRUE; +} + + int reds_stream_send_msgfd(RedsStream *stream, int fd) { struct msghdr msgh = { 0, }; diff --git a/server/reds-stream.h b/server/reds-stream.h index 97cfcd5..ee71c30 100644 --- a/server/reds-stream.h +++ b/server/reds-stream.h @@ -75,6 +75,7 @@ int reds_stream_get_family(const RedsStream *stream); int reds_stream_is_plain_unix(const RedsStream *stream); bool reds_stream_set_no_delay(RedsStream *stream, bool no_delay); bool reds_stream_set_non_blocking(RedsStream *stream, bool non_blocking); +bool reds_stream_set_keepalive(RedsStream *stream, bool enable, int timeout); int reds_stream_send_msgfd(RedsStream *stream, int fd); typedef enum { diff --git a/server/reds.c b/server/reds.c index 77976e6..7c8d1d8 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2378,35 +2378,10 @@ static void reds_handle_ssl_accept(int fd, int event, void *data) #define KEEPALIVE_TIMEOUT (10*60) -static bool reds_init_keepalive(int socket) -{ - int keepalive = 1; - int keepalive_timeout = KEEPALIVE_TIMEOUT; - - if (setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)) == -1) { - if (errno != ENOTSUP) { - spice_printerr("setsockopt for keepalive failed, %s", strerror(errno)); - return false; - } - } - - if (setsockopt(socket, SOL_TCP, TCP_KEEPIDLE, - &keepalive_timeout, sizeof(keepalive_timeout)) == -1) { - if (errno != ENOTSUP) { - spice_printerr("setsockopt for keepalive timeout failed, %s", strerror(errno)); - return false; - } - } - - return true; -} - static RedLinkInfo *reds_init_client_connection(RedsState *reds, int socket) { RedLinkInfo *link = NULL; - reds_init_keepalive(socket); - link = spice_new0(RedLinkInfo, 1); link->reds = reds; link->stream = reds_stream_new(reds, socket); @@ -2415,6 +2390,7 @@ static RedLinkInfo *reds_init_client_connection(RedsState *reds, int socket) goto error; } reds_stream_set_no_delay(link->stream, TRUE); + reds_stream_set_keepalive(link->stream, TRUE, KEEPALIVE_TIMEOUT); /* gather info + send event */ -- 2.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel