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 <vsementsov@yandex-team.ru>
---
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