On 09.09.25 01:02, Peter Xu wrote:
On Wed, Sep 03, 2025 at 12:44:03PM +0300, Vladimir Sementsov-Ogievskiy wrote:
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 <vsement...@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)) {

If we want to do the best, we could also pass in GError** here, and convert
GError(.message) to errp?

Hmm, agree, will try.

Interesting, why we just don't sit on GError..


+        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




--
Best regards,
Vladimir

Reply via email to