From: "Alex Bennée" <alex.bennee@linaro.org>
To: Bin Meng <bmeng.cn@gmail.com>
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Xuzhou Cheng" <xuzhou.cheng@windriver.com>,
"Bin Meng" <bin.meng@windriver.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Laurent Vivier" <lvivier@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
qemu-devel@nongnu.org
Subject: Re: [PATCH v5 09/18] tests/qtest: Use send/recv for socket communication
Date: Tue, 18 Oct 2022 17:47:20 +0100 [thread overview]
Message-ID: <87o7u9axjr.fsf@linaro.org> (raw)
In-Reply-To: <20221006151927.2079583-10-bmeng.cn@gmail.com>
Bin Meng <bmeng.cn@gmail.com> writes:
> From: Xuzhou Cheng <xuzhou.cheng@windriver.com>
>
> Socket communication in the libqtest and libqmp codes uses read()
> and write() which work on any file descriptor on *nix, and sockets
> in *nix are an example of a file descriptor.
>
> However sockets on Windows do not use *nix-style file descriptors,
> so read() and write() cannot be used on sockets on Windows.
> Switch over to use send() and recv() instead which work on both
> Windows and *nix.
>
> Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>
> (no changes since v2)
>
> Changes in v2:
> - Introduce qemu_send_full() and use it
>
> include/qemu/sockets.h | 2 ++
> tests/qtest/libqmp.c | 5 +++--
> tests/qtest/libqtest.c | 4 ++--
> util/osdep.c | 33 +++++++++++++++++++++++++++++++++
> 4 files changed, 40 insertions(+), 4 deletions(-)
>
> diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
> index 036745e586..adf2b21bd9 100644
> --- a/include/qemu/sockets.h
> +++ b/include/qemu/sockets.h
> @@ -33,6 +33,8 @@ int qemu_socketpair(int domain, int type, int protocol, int sv[2]);
> #endif
>
> int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
> +ssize_t qemu_send_full(int s, const void *buf, size_t count)
> + G_GNUC_WARN_UNUSED_RESULT;
> int socket_set_cork(int fd, int v);
> int socket_set_nodelay(int fd);
> void qemu_socket_set_block(int fd);
> diff --git a/tests/qtest/libqmp.c b/tests/qtest/libqmp.c
> index ade26c15f0..2b08382e5d 100644
> --- a/tests/qtest/libqmp.c
> +++ b/tests/qtest/libqmp.c
> @@ -23,6 +23,7 @@
> #endif
>
> #include "qemu/cutils.h"
> +#include "qemu/sockets.h"
> #include "qapi/error.h"
> #include "qapi/qmp/json-parser.h"
> #include "qapi/qmp/qjson.h"
> @@ -36,7 +37,7 @@ typedef struct {
>
> static void socket_send(int fd, const char *buf, size_t size)
> {
> - size_t res = qemu_write_full(fd, buf, size);
> + ssize_t res = qemu_send_full(fd, buf, size);
>
> assert(res == size);
> }
> @@ -69,7 +70,7 @@ QDict *qmp_fd_receive(int fd)
> ssize_t len;
> char c;
>
> - len = read(fd, &c, 1);
> + len = recv(fd, &c, 1, 0);
> if (len == -1 && errno == EINTR) {
> continue;
> }
> diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> index 4f4b2d6477..8228262938 100644
> --- a/tests/qtest/libqtest.c
> +++ b/tests/qtest/libqtest.c
> @@ -436,7 +436,7 @@ void qtest_quit(QTestState *s)
>
> static void socket_send(int fd, const char *buf, size_t size)
> {
> - size_t res = qemu_write_full(fd, buf, size);
> + ssize_t res = qemu_send_full(fd, buf, size);
>
> assert(res == size);
> }
> @@ -468,7 +468,7 @@ static GString *qtest_client_socket_recv_line(QTestState *s)
> ssize_t len;
> char buffer[1024];
>
> - len = read(s->fd, buffer, sizeof(buffer));
> + len = recv(s->fd, buffer, sizeof(buffer), 0);
> if (len == -1 && errno == EINTR) {
> continue;
> }
> diff --git a/util/osdep.c b/util/osdep.c
> index 60fcbbaebe..0342e754e1 100644
> --- a/util/osdep.c
> +++ b/util/osdep.c
> @@ -502,6 +502,39 @@ int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
> return ret;
> }
>
> +/*
> + * A variant of send(2) which handles partial send.
> + *
> + * Return the number of bytes transferred over the socket.
> + * Set errno if fewer than `count' bytes are sent.
> + *
> + * This function don't work with non-blocking socket's.
> + * Any of the possibilities with non-blocking socket's is bad:
> + * - return a short write (then name is wrong)
> + * - busy wait adding (errno == EAGAIN) to the loop
> + */
> +ssize_t qemu_send_full(int s, const void *buf, size_t count)
> +{
> + ssize_t ret = 0;
> + ssize_t total = 0;
> +
> + while (count) {
> + ret = send(s, buf, count, 0);
> + if (ret < 0) {
> + if (errno == EINTR) {
> + continue;
> + }
> + break;
> + }
> +
> + count -= ret;
> + buf += ret;
> + total += ret;
> + }
> +
> + return total;
> +}
> +
> void qemu_set_hw_version(const char *version)
> {
> hw_version = version;
Hmm something goes wrong here:
FAILED: tests/qtest/libqos/libqos.fa.p/.._libqtest.c.o
cc -m64 -mcx16 -Itests/qtest/libqos/libqos.fa.p -Itests/qtest/libqos -I../../tests/qtest/libqos -I. -Iqapi -Itrace -Iui -Iui/shader -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -fdiagnostics-color=auto -Wall -Winvalid-pch -Werror -std=gnu11 -O2 -g -isystem /home/alex/lsrc/qemu.git/linux-headers -isystem linux-headers -iquote . -iquote /home/alex/lsrc/qemu.git -iquote /home/alex/lsrc/qemu.git/include -iquote /home/alex/lsrc/qemu.git/tcg/i386 -pthread -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wold-style-declaration -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2 -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong -fPIE -MD -MQ tests/qtest/libqos/libqos.fa.p/.._libqtest.c.o -MF tests/qtest/libqos/libqos.fa.p/.._libqtest.c.o.d -o tests/qtest/libqos/libqos.fa.p/.._libqtest.c.o -c ../../tests/qtest/libqtest.c
../../tests/qtest/libqtest.c: In function ‘socket_send’:
../../tests/qtest/libqtest.c:431:19: error: implicit declaration of function ‘qemu_send_full’; did you mean ‘qemu_write_full’? [-Werror=implicit-function-declaration]
431 | ssize_t res = qemu_send_full(fd, buf, size);
| ^~~~~~~~~~~~~~
| qemu_write_full
../../tests/qtest/libqtest.c:431:19: error: nested extern declaration of ‘qemu_send_full’ [-Werror=nested-externs]
cc1: all warnings being treated as errors
dropping this patch.
--
Alex Bennée
next prev parent reply other threads:[~2022-10-18 17:00 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-06 15:19 [PATCH v5 00/18] tests/qtest: Enable running qtest on Windows Bin Meng
2022-10-06 15:19 ` [PATCH v5 01/18] semihosting/arm-compat-semi: Avoid using hardcoded /tmp Bin Meng
2022-10-06 15:19 ` [PATCH v5 02/18] tcg: " Bin Meng
2022-10-06 15:19 ` [PATCH v5 03/18] util/qemu-sockets: Use g_get_tmp_dir() to get the directory for temporary files Bin Meng
2022-10-06 15:19 ` [PATCH v5 04/18] tests/qtest: migration-test: Avoid using hardcoded /tmp Bin Meng
2022-10-25 23:44 ` Richard Henderson
2022-10-26 0:44 ` Bin Meng
2022-10-26 1:25 ` Richard Henderson
2022-10-06 15:19 ` [PATCH v5 05/18] block/vvfat: Unify the mkdir() call Bin Meng
2022-10-06 15:19 ` [PATCH v5 06/18] fsdev/virtfs-proxy-helper: Use g_mkdir() Bin Meng
2022-10-06 15:19 ` [PATCH v5 07/18] hw/usb: dev-mtp: " Bin Meng
2022-10-06 15:19 ` [PATCH v5 08/18] accel/qtest: Support qtest accelerator for Windows Bin Meng
2022-10-11 12:32 ` Thomas Huth
2022-10-11 12:37 ` Bin Meng
2022-10-06 15:19 ` [PATCH v5 09/18] tests/qtest: Use send/recv for socket communication Bin Meng
2022-10-18 16:47 ` Alex Bennée [this message]
2022-10-19 7:09 ` Bin Meng
2022-10-19 9:28 ` Thomas Huth
2022-10-18 17:09 ` Peter Maydell
2022-10-18 17:14 ` Daniel P. Berrangé
2022-10-06 15:19 ` [PATCH v5 10/18] tests/qtest: libqtest: Install signal handler via signal() Bin Meng
2022-10-11 14:14 ` Thomas Huth
2022-10-11 14:54 ` Bin Meng
2022-10-06 15:19 ` [PATCH v5 11/18] tests/qtest: Support libqtest to build and run on Windows Bin Meng
2022-10-12 7:43 ` Marc-André Lureau
2022-10-06 15:19 ` [PATCH v5 12/18] tests/qtest: migration-test: Make sure QEMU process "to" exited after migration is canceled Bin Meng
2022-10-12 7:57 ` Marc-André Lureau
2022-10-06 15:19 ` [PATCH v5 13/18] tests/qtest: libqtest: Correct the timeout unit of blocking receive calls for win32 Bin Meng
2022-10-06 15:19 ` [PATCH v5 14/18] io/channel-watch: Drop a superfluous '#ifdef WIN32' Bin Meng
2022-10-06 15:19 ` [PATCH v5 15/18] io/channel-watch: Drop the unnecessary cast Bin Meng
2022-10-06 15:19 ` [PATCH v5 16/18] io/channel-watch: Fix socket watch on Windows Bin Meng
2022-10-06 15:19 ` [PATCH v5 17/18] .gitlab-ci.d/windows.yml: Increase the timeout to 90 minutes Bin Meng
2022-10-07 9:57 ` Marc-André Lureau
2022-10-08 1:11 ` Bin Meng
2022-10-11 14:41 ` Thomas Huth
2022-10-11 15:10 ` Bin Meng
2022-10-06 15:19 ` [PATCH v5 18/18] tests/qtest: Enable qtest build on Windows Bin Meng
2022-10-06 20:33 ` [PATCH v5 00/18] tests/qtest: Enable running qtest " Alex Bennée
2022-10-07 5:31 ` Bin Meng
2022-10-17 15:00 ` Bin Meng
2022-10-17 16:40 ` Christian Schoenebeck
2022-10-18 15:59 ` Alex Bennée
2022-10-19 7:07 ` Bin Meng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87o7u9axjr.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=berrange@redhat.com \
--cc=bin.meng@windriver.com \
--cc=bmeng.cn@gmail.com \
--cc=lvivier@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
--cc=xuzhou.cheng@windriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.