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 <[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)) {
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