* [PATCH v4 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket()
2022-08-02 7:51 [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
@ 2022-08-02 7:51 ` Bin Meng
2022-08-02 7:51 ` [PATCH v4 2/4] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Bin Meng @ 2022-08-02 7:51 UTC (permalink / raw)
To: qemu-devel; +Cc: Bin Meng, Marc-André Lureau, Daniel P. Berrangé
From: Bin Meng <bin.meng@windriver.com>
close() is a *nix function. It works on any file descriptor, and
sockets in *nix are an example of a file descriptor.
closesocket() is a Windows-specific function, which works only
specifically with sockets. Sockets on Windows do not use *nix-style
file descriptors, and socket() returns a handle to a kernel object
instead, so it must be closed with closesocket().
In QEMU there is already a logic to handle such platform difference
in os-posix.h and os-win32.h, that:
* closesocket maps to close on POSIX
* closesocket maps to a wrapper that calls the real closesocket()
on Windows
Replace the call to close a socket with closesocket() instead.
Signed-off-by: Bin Meng <bin.meng@windriver.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
(no changes since v1)
util/qemu-sockets.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 13b5b197f9..0e2298278f 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -487,7 +487,7 @@ int inet_connect_saddr(InetSocketAddress *saddr, Error **errp)
if (ret < 0) {
error_setg_errno(errp, errno, "Unable to set KEEPALIVE");
- close(sock);
+ closesocket(sock);
return -1;
}
}
@@ -1050,7 +1050,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
return sock;
err:
- close(sock);
+ closesocket(sock);
return -1;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v4 2/4] util/qemu-sockets: Enable unix socket support on Windows
2022-08-02 7:51 [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
2022-08-02 7:51 ` [PATCH v4 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
@ 2022-08-02 7:51 ` Bin Meng
2022-08-02 11:39 ` Marc-André Lureau
2022-08-02 7:51 ` [PATCH v4 3/4] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
` (2 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2022-08-02 7:51 UTC (permalink / raw)
To: qemu-devel; +Cc: Bin Meng, Xuzhou Cheng, Daniel P. Berrangé, Stefan Weil
From: Bin Meng <bin.meng@windriver.com>
Support for the unix socket has existed both in BSD and Linux for the
longest time, but not on Windows. Since Windows 10 build 17063 [1],
the native support for the unix socket has come to Windows. Starting
this build, two Win32 processes can use the AF_UNIX address family
over Winsock API to communicate with each other.
[1] https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
Signed-off-by: Bin Meng <bin.meng@windriver.com>
---
Changes in v4:
- instead of introducing CONFIG_AF_UNIX, add fallback afunix.h header
in os-win32.h, and compile the AF_UNIX stuff for all Windows hosts
Changes in v3:
- drop the run-time check afunix_available()
Changes in v2:
- move #include <afunix.h> to os-win32.h
- define WIN_BUILD_AF_UNIX only when CONFIG_WIN32
meson.build | 3 +++
include/sysemu/os-win32.h | 17 +++++++++++++++++
util/qemu-sockets.c | 25 -------------------------
3 files changed, 20 insertions(+), 25 deletions(-)
diff --git a/meson.build b/meson.build
index 294e9a8f32..6749223f1a 100644
--- a/meson.build
+++ b/meson.build
@@ -1890,6 +1890,9 @@ config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
+if targetos == 'windows'
+ config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
+endif
# has_function
config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
index edc3b38a57..5b38c7bd04 100644
--- a/include/sysemu/os-win32.h
+++ b/include/sysemu/os-win32.h
@@ -30,6 +30,23 @@
#include <windows.h>
#include <ws2tcpip.h>
+#ifdef HAVE_AFUNIX_H
+#include <afunix.h>
+#else
+/*
+ * Fallback definitions of things we need in afunix.h, if not available from
+ * the used Windows SDK or MinGW headers.
+ */
+#define UNIX_PATH_MAX 108
+
+typedef struct sockaddr_un {
+ ADDRESS_FAMILY sun_family;
+ char sun_path[UNIX_PATH_MAX];
+} SOCKADDR_UN, *PSOCKADDR_UN;
+
+#define SIO_AF_UNIX_GETPEERPID _WSAIOR(IOC_VENDOR, 256)
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 0e2298278f..83f4bd6fd2 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -880,8 +880,6 @@ static int vsock_parse(VsockSocketAddress *addr, const char *str,
}
#endif /* CONFIG_AF_VSOCK */
-#ifndef _WIN32
-
static bool saddr_is_abstract(UnixSocketAddress *saddr)
{
#ifdef CONFIG_LINUX
@@ -1054,25 +1052,6 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
return -1;
}
-#else
-
-static int unix_listen_saddr(UnixSocketAddress *saddr,
- int num,
- Error **errp)
-{
- error_setg(errp, "unix sockets are not available on windows");
- errno = ENOTSUP;
- return -1;
-}
-
-static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
-{
- error_setg(errp, "unix sockets are not available on windows");
- errno = ENOTSUP;
- return -1;
-}
-#endif
-
/* compatibility wrapper */
int unix_listen(const char *str, Error **errp)
{
@@ -1335,7 +1314,6 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
}
-#ifndef WIN32
static SocketAddress *
socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
socklen_t salen,
@@ -1362,7 +1340,6 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
addr->u.q_unix.path = g_strndup(su->sun_path, salen);
return addr;
}
-#endif /* WIN32 */
#ifdef CONFIG_AF_VSOCK
static SocketAddress *
@@ -1394,10 +1371,8 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
case AF_INET6:
return socket_sockaddr_to_address_inet(sa, salen, errp);
-#ifndef WIN32
case AF_UNIX:
return socket_sockaddr_to_address_unix(sa, salen, errp);
-#endif /* WIN32 */
#ifdef CONFIG_AF_VSOCK
case AF_VSOCK:
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 2/4] util/qemu-sockets: Enable unix socket support on Windows
2022-08-02 7:51 ` [PATCH v4 2/4] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
@ 2022-08-02 11:39 ` Marc-André Lureau
0 siblings, 0 replies; 9+ messages in thread
From: Marc-André Lureau @ 2022-08-02 11:39 UTC (permalink / raw)
To: Bin Meng
Cc: qemu-devel, Bin Meng, Xuzhou Cheng, Daniel P. Berrangé,
Stefan Weil
[-- Attachment #1: Type: text/plain, Size: 4768 bytes --]
On Tue, Aug 2, 2022 at 12:39 PM Bin Meng <bmeng.cn@gmail.com> wrote:
> From: Bin Meng <bin.meng@windriver.com>
>
> Support for the unix socket has existed both in BSD and Linux for the
> longest time, but not on Windows. Since Windows 10 build 17063 [1],
> the native support for the unix socket has come to Windows. Starting
> this build, two Win32 processes can use the AF_UNIX address family
> over Winsock API to communicate with each other.
>
> [1] https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
>
> 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>
> ---
>
> Changes in v4:
> - instead of introducing CONFIG_AF_UNIX, add fallback afunix.h header
> in os-win32.h, and compile the AF_UNIX stuff for all Windows hosts
>
> Changes in v3:
> - drop the run-time check afunix_available()
>
> Changes in v2:
> - move #include <afunix.h> to os-win32.h
> - define WIN_BUILD_AF_UNIX only when CONFIG_WIN32
>
> meson.build | 3 +++
> include/sysemu/os-win32.h | 17 +++++++++++++++++
> util/qemu-sockets.c | 25 -------------------------
> 3 files changed, 20 insertions(+), 25 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 294e9a8f32..6749223f1a 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -1890,6 +1890,9 @@ config_host_data.set('HAVE_PTY_H',
> cc.has_header('pty.h'))
> config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
> config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
> config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
> +if targetos == 'windows'
> + config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
> +endif
>
> # has_function
> config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
> diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
> index edc3b38a57..5b38c7bd04 100644
> --- a/include/sysemu/os-win32.h
> +++ b/include/sysemu/os-win32.h
> @@ -30,6 +30,23 @@
> #include <windows.h>
> #include <ws2tcpip.h>
>
> +#ifdef HAVE_AFUNIX_H
> +#include <afunix.h>
> +#else
> +/*
> + * Fallback definitions of things we need in afunix.h, if not available
> from
> + * the used Windows SDK or MinGW headers.
> + */
> +#define UNIX_PATH_MAX 108
> +
> +typedef struct sockaddr_un {
> + ADDRESS_FAMILY sun_family;
> + char sun_path[UNIX_PATH_MAX];
> +} SOCKADDR_UN, *PSOCKADDR_UN;
> +
> +#define SIO_AF_UNIX_GETPEERPID _WSAIOR(IOC_VENDOR, 256)
> +#endif
> +
> #ifdef __cplusplus
> extern "C" {
> #endif
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index 0e2298278f..83f4bd6fd2 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -880,8 +880,6 @@ static int vsock_parse(VsockSocketAddress *addr, const
> char *str,
> }
> #endif /* CONFIG_AF_VSOCK */
>
> -#ifndef _WIN32
> -
> static bool saddr_is_abstract(UnixSocketAddress *saddr)
> {
> #ifdef CONFIG_LINUX
> @@ -1054,25 +1052,6 @@ static int unix_connect_saddr(UnixSocketAddress
> *saddr, Error **errp)
> return -1;
> }
>
> -#else
> -
> -static int unix_listen_saddr(UnixSocketAddress *saddr,
> - int num,
> - Error **errp)
> -{
> - error_setg(errp, "unix sockets are not available on windows");
> - errno = ENOTSUP;
> - return -1;
> -}
> -
> -static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
> -{
> - error_setg(errp, "unix sockets are not available on windows");
> - errno = ENOTSUP;
> - return -1;
> -}
> -#endif
> -
> /* compatibility wrapper */
> int unix_listen(const char *str, Error **errp)
> {
> @@ -1335,7 +1314,6 @@ socket_sockaddr_to_address_inet(struct
> sockaddr_storage *sa,
> }
>
>
> -#ifndef WIN32
> static SocketAddress *
> socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
> socklen_t salen,
> @@ -1362,7 +1340,6 @@ socket_sockaddr_to_address_unix(struct
> sockaddr_storage *sa,
> addr->u.q_unix.path = g_strndup(su->sun_path, salen);
> return addr;
> }
> -#endif /* WIN32 */
>
> #ifdef CONFIG_AF_VSOCK
> static SocketAddress *
> @@ -1394,10 +1371,8 @@ socket_sockaddr_to_address(struct sockaddr_storage
> *sa,
> case AF_INET6:
> return socket_sockaddr_to_address_inet(sa, salen, errp);
>
> -#ifndef WIN32
> case AF_UNIX:
> return socket_sockaddr_to_address_unix(sa, salen, errp);
> -#endif /* WIN32 */
>
> #ifdef CONFIG_AF_VSOCK
> case AF_VSOCK:
> --
> 2.34.1
>
>
>
--
Marc-André Lureau
[-- Attachment #2: Type: text/html, Size: 6257 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v4 3/4] chardev/char-socket: Update AF_UNIX for Windows
2022-08-02 7:51 [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
2022-08-02 7:51 ` [PATCH v4 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
2022-08-02 7:51 ` [PATCH v4 2/4] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
@ 2022-08-02 7:51 ` Bin Meng
2022-08-02 7:52 ` [PATCH v4 4/4] tests/unit: Update test-io-channel-socket.c " Bin Meng
2022-09-01 6:13 ` [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
4 siblings, 0 replies; 9+ messages in thread
From: Bin Meng @ 2022-08-02 7:51 UTC (permalink / raw)
To: qemu-devel; +Cc: Bin Meng, Marc-André Lureau, Paolo Bonzini
From: Bin Meng <bin.meng@windriver.com>
Now that AF_UNIX has come to Windows, update the existing logic in
qemu_chr_compute_filename() and qmp_chardev_open_socket() for Windows.
Signed-off-by: Bin Meng <bin.meng@windriver.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
Changes in v4:
- drop CONFIG_AF_UNIX
Changes in v2:
- drop #include <afunix.h> as it is now already included in osdep.h
chardev/char-socket.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index dc4e218eeb..879564aa8a 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -557,12 +557,10 @@ static char *qemu_chr_compute_filename(SocketChardev *s)
const char *left = "", *right = "";
switch (ss->ss_family) {
-#ifndef _WIN32
case AF_UNIX:
return g_strdup_printf("unix:%s%s",
((struct sockaddr_un *)(ss))->sun_path,
s->is_listen ? ",server=on" : "");
-#endif
case AF_INET6:
left = "[";
right = "]";
@@ -1372,10 +1370,12 @@ static void qmp_chardev_open_socket(Chardev *chr,
}
qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
+#ifndef _WIN32
/* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS);
}
+#endif
/*
* In the chardev-change special-case, we shouldn't register a new yank
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v4 4/4] tests/unit: Update test-io-channel-socket.c for Windows
2022-08-02 7:51 [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
` (2 preceding siblings ...)
2022-08-02 7:51 ` [PATCH v4 3/4] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
@ 2022-08-02 7:52 ` Bin Meng
2022-08-02 11:43 ` Marc-André Lureau
2022-09-01 6:13 ` [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
4 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2022-08-02 7:52 UTC (permalink / raw)
To: qemu-devel; +Cc: Bin Meng, Daniel P. Berrangé
From: Bin Meng <bin.meng@windriver.com>
Change to dynamically include the test cases by checking AF_UNIX
availability using a new helper socket_check_afunix_support().
With such changes testing on a Windows host can be covered as well.
Signed-off-by: Bin Meng <bin.meng@windriver.com>
---
Changes in v4:
- introduce a new helper socket_check_afunix_support() to runtime-check
the availability of AF_UNIX socket, and skip those appropriately
Changes in v2:
- new patch: tests/unit: Update test-io-channel-socket.c for Windows
tests/unit/socket-helpers.h | 9 +++++++
tests/unit/socket-helpers.c | 16 +++++++++++++
tests/unit/test-io-channel-socket.c | 37 ++++++++++++++++++-----------
3 files changed, 48 insertions(+), 14 deletions(-)
diff --git a/tests/unit/socket-helpers.h b/tests/unit/socket-helpers.h
index 512a004811..ed8477ceb3 100644
--- a/tests/unit/socket-helpers.h
+++ b/tests/unit/socket-helpers.h
@@ -32,4 +32,13 @@
*/
int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6);
+/*
+ * @has_afunix: set to true on return if unix socket support is available
+ *
+ * Check whether unix domain socket support is available for use.
+ * On success, @has_afunix will be set to indicate whether AF_UNIX protocol
+ * is available.
+ */
+void socket_check_afunix_support(bool *has_afunix);
+
#endif
diff --git a/tests/unit/socket-helpers.c b/tests/unit/socket-helpers.c
index 5af4de513b..eecadf3a3c 100644
--- a/tests/unit/socket-helpers.c
+++ b/tests/unit/socket-helpers.c
@@ -154,3 +154,19 @@ int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6)
return 0;
}
+
+void socket_check_afunix_support(bool *has_afunix)
+{
+ int fd;
+
+ fd = socket(PF_UNIX, SOCK_STREAM, 0);
+ closesocket(fd);
+
+#ifdef _WIN32
+ *has_afunix = (fd != (int)INVALID_SOCKET);
+#else
+ *has_afunix = (fd >= 0);
+#endif
+
+ return;
+}
diff --git a/tests/unit/test-io-channel-socket.c b/tests/unit/test-io-channel-socket.c
index 6713886d02..b36a5d972a 100644
--- a/tests/unit/test-io-channel-socket.c
+++ b/tests/unit/test-io-channel-socket.c
@@ -179,10 +179,12 @@ static void test_io_channel(bool async,
test_io_channel_setup_async(listen_addr, connect_addr,
&srv, &src, &dst);
+#ifndef _WIN32
g_assert(!passFD ||
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
g_assert(!passFD ||
qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_FD_PASS));
+#endif
g_assert(qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_SHUTDOWN));
g_assert(qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_SHUTDOWN));
@@ -206,10 +208,12 @@ static void test_io_channel(bool async,
test_io_channel_setup_async(listen_addr, connect_addr,
&srv, &src, &dst);
+#ifndef _WIN32
g_assert(!passFD ||
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
g_assert(!passFD ||
qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_FD_PASS));
+#endif
g_assert(qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_SHUTDOWN));
g_assert(qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_SHUTDOWN));
@@ -236,10 +240,12 @@ static void test_io_channel(bool async,
test_io_channel_setup_sync(listen_addr, connect_addr,
&srv, &src, &dst);
+#ifndef _WIN32
g_assert(!passFD ||
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
g_assert(!passFD ||
qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_FD_PASS));
+#endif
g_assert(qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_SHUTDOWN));
g_assert(qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_SHUTDOWN));
@@ -263,10 +269,12 @@ static void test_io_channel(bool async,
test_io_channel_setup_sync(listen_addr, connect_addr,
&srv, &src, &dst);
+#ifndef _WIN32
g_assert(!passFD ||
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
g_assert(!passFD ||
qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_FD_PASS));
+#endif
g_assert(qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_SHUTDOWN));
g_assert(qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_SHUTDOWN));
@@ -367,7 +375,6 @@ static void test_io_channel_ipv6_async(void)
}
-#ifndef _WIN32
static void test_io_channel_unix(bool async)
{
SocketAddress *listen_addr = g_new0(SocketAddress, 1);
@@ -398,6 +405,7 @@ static void test_io_channel_unix_async(void)
return test_io_channel_unix(true);
}
+#ifndef _WIN32
static void test_io_channel_unix_fd_pass(void)
{
SocketAddress *listen_addr = g_new0(SocketAddress, 1);
@@ -491,6 +499,7 @@ static void test_io_channel_unix_fd_pass(void)
}
g_free(fdrecv);
}
+#endif /* _WIN32 */
static void test_io_channel_unix_listen_cleanup(void)
{
@@ -522,9 +531,6 @@ static void test_io_channel_unix_listen_cleanup(void)
unlink(TEST_SOCKET);
}
-#endif /* _WIN32 */
-
-
static void test_io_channel_ipv4_fd(void)
{
QIOChannel *ioc;
@@ -555,7 +561,7 @@ static void test_io_channel_ipv4_fd(void)
int main(int argc, char **argv)
{
- bool has_ipv4, has_ipv6;
+ bool has_ipv4, has_ipv6, has_afunix;
module_call_init(MODULE_INIT_QOM);
qemu_init_main_loop(&error_abort);
@@ -588,16 +594,19 @@ int main(int argc, char **argv)
test_io_channel_ipv6_async);
}
+ socket_check_afunix_support(&has_afunix);
+ if (has_afunix) {
+ g_test_add_func("/io/channel/socket/unix-sync",
+ test_io_channel_unix_sync);
+ g_test_add_func("/io/channel/socket/unix-async",
+ test_io_channel_unix_async);
#ifndef _WIN32
- g_test_add_func("/io/channel/socket/unix-sync",
- test_io_channel_unix_sync);
- g_test_add_func("/io/channel/socket/unix-async",
- test_io_channel_unix_async);
- g_test_add_func("/io/channel/socket/unix-fd-pass",
- test_io_channel_unix_fd_pass);
- g_test_add_func("/io/channel/socket/unix-listen-cleanup",
- test_io_channel_unix_listen_cleanup);
-#endif /* _WIN32 */
+ g_test_add_func("/io/channel/socket/unix-fd-pass",
+ test_io_channel_unix_fd_pass);
+#endif
+ g_test_add_func("/io/channel/socket/unix-listen-cleanup",
+ test_io_channel_unix_listen_cleanup);
+ }
end:
return g_test_run();
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 4/4] tests/unit: Update test-io-channel-socket.c for Windows
2022-08-02 7:52 ` [PATCH v4 4/4] tests/unit: Update test-io-channel-socket.c " Bin Meng
@ 2022-08-02 11:43 ` Marc-André Lureau
0 siblings, 0 replies; 9+ messages in thread
From: Marc-André Lureau @ 2022-08-02 11:43 UTC (permalink / raw)
To: Bin Meng; +Cc: qemu-devel, Bin Meng, Daniel P. Berrangé
[-- Attachment #1: Type: text/plain, Size: 7698 bytes --]
Hi
On Tue, Aug 2, 2022 at 1:21 PM Bin Meng <bmeng.cn@gmail.com> wrote:
> From: Bin Meng <bin.meng@windriver.com>
>
> Change to dynamically include the test cases by checking AF_UNIX
> availability using a new helper socket_check_afunix_support().
> With such changes testing on a Windows host can be covered as well.
>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> ---
>
> Changes in v4:
> - introduce a new helper socket_check_afunix_support() to runtime-check
> the availability of AF_UNIX socket, and skip those appropriately
>
> Changes in v2:
> - new patch: tests/unit: Update test-io-channel-socket.c for Windows
>
> tests/unit/socket-helpers.h | 9 +++++++
> tests/unit/socket-helpers.c | 16 +++++++++++++
> tests/unit/test-io-channel-socket.c | 37 ++++++++++++++++++-----------
> 3 files changed, 48 insertions(+), 14 deletions(-)
>
> diff --git a/tests/unit/socket-helpers.h b/tests/unit/socket-helpers.h
> index 512a004811..ed8477ceb3 100644
> --- a/tests/unit/socket-helpers.h
> +++ b/tests/unit/socket-helpers.h
> @@ -32,4 +32,13 @@
> */
> int socket_check_protocol_support(bool *has_ipv4, bool *has_ipv6);
>
> +/*
> + * @has_afunix: set to true on return if unix socket support is available
> + *
> + * Check whether unix domain socket support is available for use.
> + * On success, @has_afunix will be set to indicate whether AF_UNIX
> protocol
> + * is available.
> + */
> +void socket_check_afunix_support(bool *has_afunix);
> +
> #endif
> diff --git a/tests/unit/socket-helpers.c b/tests/unit/socket-helpers.c
> index 5af4de513b..eecadf3a3c 100644
> --- a/tests/unit/socket-helpers.c
> +++ b/tests/unit/socket-helpers.c
> @@ -154,3 +154,19 @@ int socket_check_protocol_support(bool *has_ipv4,
> bool *has_ipv6)
>
> return 0;
> }
> +
> +void socket_check_afunix_support(bool *has_afunix)
>
Why not return TRUE for success? Ah, for consistency with
socket_check_protocol_support (). Maybe you should extend that function
instead then?
> +{
> + int fd;
> +
> + fd = socket(PF_UNIX, SOCK_STREAM, 0);
> + closesocket(fd);
> +
> +#ifdef _WIN32
> + *has_afunix = (fd != (int)INVALID_SOCKET);
> +#else
> + *has_afunix = (fd >= 0);
> +#endif
> +
> + return;
> +}
> diff --git a/tests/unit/test-io-channel-socket.c
> b/tests/unit/test-io-channel-socket.c
> index 6713886d02..b36a5d972a 100644
> --- a/tests/unit/test-io-channel-socket.c
> +++ b/tests/unit/test-io-channel-socket.c
> @@ -179,10 +179,12 @@ static void test_io_channel(bool async,
> test_io_channel_setup_async(listen_addr, connect_addr,
> &srv, &src, &dst);
>
> +#ifndef _WIN32
> g_assert(!passFD ||
> qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_FD_PASS));
> g_assert(!passFD ||
> qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_FD_PASS));
> +#endif
> g_assert(qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
> g_assert(qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
>
> @@ -206,10 +208,12 @@ static void test_io_channel(bool async,
> test_io_channel_setup_async(listen_addr, connect_addr,
> &srv, &src, &dst);
>
> +#ifndef _WIN32
> g_assert(!passFD ||
> qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_FD_PASS));
> g_assert(!passFD ||
> qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_FD_PASS));
> +#endif
> g_assert(qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
> g_assert(qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
>
> @@ -236,10 +240,12 @@ static void test_io_channel(bool async,
> test_io_channel_setup_sync(listen_addr, connect_addr,
> &srv, &src, &dst);
>
> +#ifndef _WIN32
> g_assert(!passFD ||
> qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_FD_PASS));
> g_assert(!passFD ||
> qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_FD_PASS));
> +#endif
> g_assert(qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
> g_assert(qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
>
> @@ -263,10 +269,12 @@ static void test_io_channel(bool async,
> test_io_channel_setup_sync(listen_addr, connect_addr,
> &srv, &src, &dst);
>
> +#ifndef _WIN32
> g_assert(!passFD ||
> qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_FD_PASS));
> g_assert(!passFD ||
> qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_FD_PASS));
> +#endif
> g_assert(qio_channel_has_feature(src,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
> g_assert(qio_channel_has_feature(dst,
> QIO_CHANNEL_FEATURE_SHUTDOWN));
>
> @@ -367,7 +375,6 @@ static void test_io_channel_ipv6_async(void)
> }
>
>
> -#ifndef _WIN32
> static void test_io_channel_unix(bool async)
> {
> SocketAddress *listen_addr = g_new0(SocketAddress, 1);
> @@ -398,6 +405,7 @@ static void test_io_channel_unix_async(void)
> return test_io_channel_unix(true);
> }
>
> +#ifndef _WIN32
> static void test_io_channel_unix_fd_pass(void)
> {
> SocketAddress *listen_addr = g_new0(SocketAddress, 1);
> @@ -491,6 +499,7 @@ static void test_io_channel_unix_fd_pass(void)
> }
> g_free(fdrecv);
> }
> +#endif /* _WIN32 */
>
> static void test_io_channel_unix_listen_cleanup(void)
> {
> @@ -522,9 +531,6 @@ static void test_io_channel_unix_listen_cleanup(void)
> unlink(TEST_SOCKET);
> }
>
> -#endif /* _WIN32 */
> -
> -
> static void test_io_channel_ipv4_fd(void)
> {
> QIOChannel *ioc;
> @@ -555,7 +561,7 @@ static void test_io_channel_ipv4_fd(void)
>
> int main(int argc, char **argv)
> {
> - bool has_ipv4, has_ipv6;
> + bool has_ipv4, has_ipv6, has_afunix;
>
> module_call_init(MODULE_INIT_QOM);
> qemu_init_main_loop(&error_abort);
> @@ -588,16 +594,19 @@ int main(int argc, char **argv)
> test_io_channel_ipv6_async);
> }
>
> + socket_check_afunix_support(&has_afunix);
> + if (has_afunix) {
> + g_test_add_func("/io/channel/socket/unix-sync",
> + test_io_channel_unix_sync);
> + g_test_add_func("/io/channel/socket/unix-async",
> + test_io_channel_unix_async);
>
(I would also have g_test_skip() inside the tests, but that's pre-existing
too)
#ifndef _WIN32
> - g_test_add_func("/io/channel/socket/unix-sync",
> - test_io_channel_unix_sync);
> - g_test_add_func("/io/channel/socket/unix-async",
> - test_io_channel_unix_async);
> - g_test_add_func("/io/channel/socket/unix-fd-pass",
> - test_io_channel_unix_fd_pass);
> - g_test_add_func("/io/channel/socket/unix-listen-cleanup",
> - test_io_channel_unix_listen_cleanup);
> -#endif /* _WIN32 */
> + g_test_add_func("/io/channel/socket/unix-fd-pass",
> + test_io_channel_unix_fd_pass);
> +#endif
> + g_test_add_func("/io/channel/socket/unix-listen-cleanup",
> + test_io_channel_unix_listen_cleanup);
> + }
>
> end:
> return g_test_run();
> --
> 2.34.1
>
>
>
So, lgtm
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
--
Marc-André Lureau
[-- Attachment #2: Type: text/html, Size: 9602 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 0/4] Enable unix socket support on Windows
2022-08-02 7:51 [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
` (3 preceding siblings ...)
2022-08-02 7:52 ` [PATCH v4 4/4] tests/unit: Update test-io-channel-socket.c " Bin Meng
@ 2022-09-01 6:13 ` Bin Meng
2022-09-01 7:16 ` Marc-André Lureau
4 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2022-09-01 6:13 UTC (permalink / raw)
To: qemu-devel@nongnu.org Developers
Cc: Daniel P. Berrangé, Marc-André Lureau, Paolo Bonzini,
Stefan Weil
Hi,
On Tue, Aug 2, 2022 at 3:52 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Support for the unix socket has existed both in BSD and Linux for the
> longest time, but not on Windows. Since Windows 10 build 17063 [1],
> the native support for the unix socket has come to Windows. Starting
> this build, two Win32 processes can use the AF_UNIX address family
> over Winsock API to communicate with each other.
>
> [1] https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
>
> Changes in v4:
> - instead of introducing CONFIG_AF_UNIX, add fallback afunix.h header
> in os-win32.h, and compile the AF_UNIX stuff for all Windows hosts
> - drop CONFIG_AF_UNIX
> - introduce a new helper socket_check_afunix_support() to runtime-check
> the availability of AF_UNIX socket, and skip those appropriately
>
All patches in this series have been reviewed. Would you please queue
this? Thanks!
Regards,
Bin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 0/4] Enable unix socket support on Windows
2022-09-01 6:13 ` [PATCH v4 0/4] Enable unix socket support on Windows Bin Meng
@ 2022-09-01 7:16 ` Marc-André Lureau
0 siblings, 0 replies; 9+ messages in thread
From: Marc-André Lureau @ 2022-09-01 7:16 UTC (permalink / raw)
To: Bin Meng
Cc: qemu-devel@nongnu.org Developers, Daniel P. Berrangé,
Paolo Bonzini, Stefan Weil
Hi
On Thu, Sep 1, 2022 at 10:13 AM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi,
>
> On Tue, Aug 2, 2022 at 3:52 PM Bin Meng <bmeng.cn@gmail.com> wrote:
> >
> > Support for the unix socket has existed both in BSD and Linux for the
> > longest time, but not on Windows. Since Windows 10 build 17063 [1],
> > the native support for the unix socket has come to Windows. Starting
> > this build, two Win32 processes can use the AF_UNIX address family
> > over Winsock API to communicate with each other.
> >
> > [1] https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
> >
> > Changes in v4:
> > - instead of introducing CONFIG_AF_UNIX, add fallback afunix.h header
> > in os-win32.h, and compile the AF_UNIX stuff for all Windows hosts
> > - drop CONFIG_AF_UNIX
> > - introduce a new helper socket_check_afunix_support() to runtime-check
> > the availability of AF_UNIX socket, and skip those appropriately
> >
>
> All patches in this series have been reviewed. Would you please queue
> this? Thanks!
Yes, I was going to do it. Thanks
^ permalink raw reply [flat|nested] 9+ messages in thread