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? > + 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 > -- Peter Xu