In generic code we have qio_channel_set_blocking(), which takes bool parameter, and qemu_file_set_blocking(), which as well takes bool parameter.
At lower fd-layer we have a mess of functions: - enough direct calls to g_unix_set_fd_nonblocking() and several wrappers without bool parameter: - qemu_scoket_set_nonblock(), which asserts success for posix (still, in most cases we can handle the error in better way) and ignores error for win32 realization - qemu_socket_try_set_nonblock(), the best one - qemu_socket_set_block(), which simply ignores an error, the worst case And all three lack errp argument, so we have to handle it after the call. So let's introduce a new socket-layer wrapper, and use it consistently in following commits. Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> --- include/qemu/osdep.h | 1 + util/oslib-posix.c | 12 ++++++++++++ util/oslib-win32.c | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index be3460b32f..1b38cb7e45 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -687,6 +687,7 @@ ssize_t qemu_write_full(int fd, const void *buf, size_t count) G_GNUC_WARN_UNUSED_RESULT; void qemu_set_cloexec(int fd); +bool qemu_set_blocking(int fd, bool block, Error **errp); /* Return a dynamically allocated directory path that is appropriate for storing * local state. diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 4ff577e5de..e473938195 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -250,6 +250,18 @@ void qemu_anon_ram_free(void *ptr, size_t size) #endif } +bool qemu_set_blocking(int fd, bool block, Error **errp) +{ + if (!g_unix_set_fd_nonblocking(fd, !block, NULL)) { + error_setg_errno(errp, errno, + "Can't set file descriptor %d %s", fd, + block ? "blocking" : "non-blocking"); + return false; + } + + return true; +} + void qemu_socket_set_block(int fd) { g_unix_set_fd_nonblocking(fd, false, NULL); diff --git a/util/oslib-win32.c b/util/oslib-win32.c index b7351634ec..03044f5b59 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -177,6 +177,24 @@ static int socket_error(void) } } +bool qemu_set_blocking(int fd, bool block, Error **errp) +{ + unsigned long opt = block ? 0 : 1; + + if (block) { + qemu_socket_unselect(fd, NULL); + } + + if (ioctlsocket(fd, FIONBIO, &opt) != NO_ERROR) { + error_setg_errno(errp, socket_error(), + "Can't set file descriptor %d %s", fd, + block ? "blocking" : "non-blocking"); + return false; + } + + return true; +} + void qemu_socket_set_block(int fd) { unsigned long opt = 0; -- 2.48.1
