This new function removes one place outside of RedsStream which needs to access RedsStream::socket --- server/reds-stream.c | 17 +++++++++++++++++ server/reds-stream.h | 1 + server/reds.c | 21 +++++++-------------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/server/reds-stream.c b/server/reds-stream.c index 8faa174..dd0eb8a 100644 --- a/server/reds-stream.c +++ b/server/reds-stream.c @@ -272,6 +272,23 @@ bool reds_stream_set_no_delay(RedsStream *stream, bool no_delay) return TRUE; } +bool reds_stream_set_non_blocking(RedsStream *stream, bool non_blocking) +{ + int flags; + + if ((flags = fcntl(stream->socket, F_GETFL)) == -1) { + spice_warning("fnctl(F_GETFL) failed, %s", strerror(errno)); + return FALSE; + } + + if (fcntl(stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) { + spice_warning("fnctl(F_SETFL) 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 568ec49..97cfcd5 100644 --- a/server/reds-stream.h +++ b/server/reds-stream.h @@ -74,6 +74,7 @@ int reds_stream_enable_ssl(RedsStream *stream, SSL_CTX *ctx); 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); int reds_stream_send_msgfd(RedsStream *stream, int fd); typedef enum { diff --git a/server/reds.c b/server/reds.c index f1c3ef9..77976e6 100644 --- a/server/reds.c +++ b/server/reds.c @@ -31,8 +31,6 @@ #include <limits.h> #include <pthread.h> #include <sys/mman.h> -#include <fcntl.h> -#include <errno.h> #include <ctype.h> #include <stdbool.h> @@ -2405,24 +2403,17 @@ static bool reds_init_keepalive(int socket) static RedLinkInfo *reds_init_client_connection(RedsState *reds, int socket) { - RedLinkInfo *link; - int flags; - - if ((flags = fcntl(socket, F_GETFL)) == -1) { - spice_warning("accept failed, %s", strerror(errno)); - goto error; - } - - if (fcntl(socket, F_SETFL, flags | O_NONBLOCK) == -1) { - spice_warning("accept failed, %s", strerror(errno)); - goto error; - } + RedLinkInfo *link = NULL; reds_init_keepalive(socket); link = spice_new0(RedLinkInfo, 1); link->reds = reds; link->stream = reds_stream_new(reds, socket); + if (!reds_stream_set_non_blocking(link->stream, TRUE)) + { + goto error; + } reds_stream_set_no_delay(link->stream, TRUE); /* gather info + send event */ @@ -2434,6 +2425,8 @@ static RedLinkInfo *reds_init_client_connection(RedsState *reds, int socket) return link; error: + free(link); + reds_stream_free(link->stream); return NULL; } -- 2.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel