diff --git a/server/net-utils.c b/server/net-utils.c index 10f447b5..b017daa9 100644 --- a/server/net-utils.c +++ b/server/net-utils.c @@ -52,3 +52,33 @@ bool red_socket_set_no_delay(int fd, bool no_delay) return true; } + +/** + * red_socket_set_non_blocking: + * @fd: a socket file descriptor + * @non_blocking: whether to enable O_NONBLOCK on @fd + * + * Returns: #true if the operation succeeded, #false otherwise. + */ +bool red_socket_set_non_blocking(int fd, bool non_blocking) +{ + int flags; + + if ((flags = fcntl(fd, F_GETFL)) == -1) { + spice_warning("fnctl(F_GETFL) failed, %s", strerror(errno)); + return false; + } + + if (non_blocking) { + flags |= O_NONBLOCK; + } else { + flags &= ~O_NONBLOCK; + } + + if (fcntl(fd, F_SETFL, flags) == -1) { + spice_warning("fnctl(F_SETFL) failed, %s", strerror(errno)); + return false; + } + + return true; +} diff --git a/server/net-utils.h b/server/net-utils.h index 1c066416..8da6e429 100644 --- a/server/net-utils.h +++ b/server/net-utils.h @@ -21,5 +21,6 @@ #include bool red_socket_set_no_delay(int fd, bool no_delay); +bool red_socket_set_non_blocking(int fd, bool non_blocking); #endif /* RED_NET_UTILS_H_ */ diff --git a/server/reds.c b/server/reds.c index 643f324c..ebe26522 100644 --- a/server/reds.c +++ b/server/reds.c @@ -31,8 +31,6 @@ #include #include #include -#include -#include #include #include @@ -2406,16 +2404,9 @@ 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; + if (!red_socket_set_non_blocking(socket, TRUE)) { + goto error; } if (!red_socket_set_no_delay(socket, TRUE)) {