qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/4] Enable unix socket support on Windows
@ 2022-07-30 14:50 Bin Meng
  2022-07-30 14:50 ` [PATCH v3 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Bin Meng @ 2022-07-30 14:50 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel P. Berrangé, Marc-André Lureau, Paolo Bonzini,
	Stefan Weil

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 v3:
- drop patch "util/oslib-win32: Add a helper to get the Windows version"
- drop patch "qga/commands-win32: Use os_get_win_version()"
- 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
- drop #include <afunix.h> as it is now already included in osdep.h
- new patch: tests/unit: Update test-io-channel-socket.c for Windows

Bin Meng (4):
  util/qemu-sockets: Replace the call to close a socket with
    closesocket()
  util/qemu-sockets: Enable unix socket support on Windows
  chardev/char-socket: Update AF_UNIX for Windows
  tests/unit: Update test-io-channel-socket.c for Windows

 meson.build                         |  6 ++++++
 include/sysemu/os-win32.h           |  4 ++++
 chardev/char-socket.c               |  4 +++-
 tests/unit/test-io-channel-socket.c | 16 ++++++++++++++--
 util/qemu-sockets.c                 | 18 +++++++++---------
 5 files changed, 36 insertions(+), 12 deletions(-)

-- 
2.34.1



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v3 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket()
  2022-07-30 14:50 [PATCH v3 0/4] Enable unix socket support on Windows Bin Meng
@ 2022-07-30 14:50 ` Bin Meng
  2022-07-30 14:50 ` [PATCH v3 2/4] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Bin Meng @ 2022-07-30 14:50 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 v3 2/4] util/qemu-sockets: Enable unix socket support on Windows
  2022-07-30 14:50 [PATCH v3 0/4] Enable unix socket support on Windows Bin Meng
  2022-07-30 14:50 ` [PATCH v3 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
@ 2022-07-30 14:50 ` Bin Meng
  2022-08-01  7:09   ` Marc-André Lureau
  2022-07-30 14:50 ` [PATCH v3 3/4] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
  2022-07-30 14:50 ` [PATCH v3 4/4] tests/unit: Update test-io-channel-socket.c " Bin Meng
  3 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2022-07-30 14:50 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 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               |  6 ++++++
 include/sysemu/os-win32.h |  4 ++++
 util/qemu-sockets.c       | 14 +++++++-------
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/meson.build b/meson.build
index 294e9a8f32..3663b925d4 100644
--- a/meson.build
+++ b/meson.build
@@ -2327,6 +2327,12 @@ have_afalg = get_option('crypto_afalg') \
   '''), error_message: 'AF_ALG requested but could not be detected').allowed()
 config_host_data.set('CONFIG_AF_ALG', have_afalg)
 
+if targetos != 'windows'
+  config_host_data.set('CONFIG_AF_UNIX', true)
+else
+  config_host_data.set('CONFIG_AF_UNIX', cc.has_header('afunix.h'))
+endif
+
 config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
   'linux/vm_sockets.h', 'AF_VSOCK',
   prefix: '#include <sys/socket.h>',
diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
index edc3b38a57..cebf260694 100644
--- a/include/sysemu/os-win32.h
+++ b/include/sysemu/os-win32.h
@@ -30,6 +30,10 @@
 #include <windows.h>
 #include <ws2tcpip.h>
 
+#ifdef CONFIG_AF_UNIX
+# include <afunix.h>
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 0e2298278f..f9892506de 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -880,7 +880,7 @@ static int vsock_parse(VsockSocketAddress *addr, const char *str,
 }
 #endif /* CONFIG_AF_VSOCK */
 
-#ifndef _WIN32
+#ifdef CONFIG_AF_UNIX
 
 static bool saddr_is_abstract(UnixSocketAddress *saddr)
 {
@@ -1060,14 +1060,14 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
                              int num,
                              Error **errp)
 {
-    error_setg(errp, "unix sockets are not available on windows");
+    error_setg(errp, "unix sockets are not available on your host");
     errno = ENOTSUP;
     return -1;
 }
 
 static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
 {
-    error_setg(errp, "unix sockets are not available on windows");
+    error_setg(errp, "unix sockets are not available on your host");
     errno = ENOTSUP;
     return -1;
 }
@@ -1335,7 +1335,7 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
 }
 
 
-#ifndef WIN32
+#ifdef CONFIG_AF_UNIX
 static SocketAddress *
 socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
                                 socklen_t salen,
@@ -1362,7 +1362,7 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
     addr->u.q_unix.path = g_strndup(su->sun_path, salen);
     return addr;
 }
-#endif /* WIN32 */
+#endif /* CONFIG_AF_UNIX */
 
 #ifdef CONFIG_AF_VSOCK
 static SocketAddress *
@@ -1394,10 +1394,10 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
     case AF_INET6:
         return socket_sockaddr_to_address_inet(sa, salen, errp);
 
-#ifndef WIN32
+#ifdef CONFIG_AF_UNIX
     case AF_UNIX:
         return socket_sockaddr_to_address_unix(sa, salen, errp);
-#endif /* WIN32 */
+#endif
 
 #ifdef CONFIG_AF_VSOCK
     case AF_VSOCK:
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v3 3/4] chardev/char-socket: Update AF_UNIX for Windows
  2022-07-30 14:50 [PATCH v3 0/4] Enable unix socket support on Windows Bin Meng
  2022-07-30 14:50 ` [PATCH v3 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
  2022-07-30 14:50 ` [PATCH v3 2/4] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
@ 2022-07-30 14:50 ` Bin Meng
  2022-08-01  7:19   ` Marc-André Lureau
  2022-07-30 14:50 ` [PATCH v3 4/4] tests/unit: Update test-io-channel-socket.c " Bin Meng
  3 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2022-07-30 14:50 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>
---

(no changes since v2)

Changes in v2:
- drop #include <afunix.h> as it is now already included in osdep.h

 chardev/char-socket.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index dc4e218eeb..14a56b7b13 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -557,7 +557,7 @@ static char *qemu_chr_compute_filename(SocketChardev *s)
     const char *left = "", *right = "";
 
     switch (ss->ss_family) {
-#ifndef _WIN32
+#ifdef CONFIG_AF_UNIX
     case AF_UNIX:
         return g_strdup_printf("unix:%s%s",
                                ((struct sockaddr_un *)(ss))->sun_path,
@@ -1372,10 +1372,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 v3 4/4] tests/unit: Update test-io-channel-socket.c for Windows
  2022-07-30 14:50 [PATCH v3 0/4] Enable unix socket support on Windows Bin Meng
                   ` (2 preceding siblings ...)
  2022-07-30 14:50 ` [PATCH v3 3/4] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
@ 2022-07-30 14:50 ` Bin Meng
  2022-08-01  7:32   ` Marc-André Lureau
  3 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2022-07-30 14:50 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bin Meng, Daniel P. Berrangé

From: Bin Meng <bin.meng@windriver.com>

Enable the following 3 test cases for Windows when AF_UNIX is available:

  * test_io_channel_unix_sync
  * test_io_channel_unix_async
  * test_io_channel_unix_listen_cleanup

Signed-off-by: Bin Meng <bin.meng@windriver.com>
---

(no changes since v2)

Changes in v2:
- new patch: tests/unit: Update test-io-channel-socket.c for Windows

 tests/unit/test-io-channel-socket.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/tests/unit/test-io-channel-socket.c b/tests/unit/test-io-channel-socket.c
index 6713886d02..ec5df32489 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,7 @@ static void test_io_channel_ipv6_async(void)
 }
 
 
-#ifndef _WIN32
+#ifdef CONFIG_AF_UNIX
 static void test_io_channel_unix(bool async)
 {
     SocketAddress *listen_addr = g_new0(SocketAddress, 1);
@@ -398,6 +406,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 +500,7 @@ static void test_io_channel_unix_fd_pass(void)
     }
     g_free(fdrecv);
 }
+#endif /* _WIN32 */
 
 static void test_io_channel_unix_listen_cleanup(void)
 {
@@ -588,13 +598,15 @@ int main(int argc, char **argv)
                         test_io_channel_ipv6_async);
     }
 
-#ifndef _WIN32
+#ifdef CONFIG_AF_UNIX
     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-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);
 #endif /* _WIN32 */
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/4] util/qemu-sockets: Enable unix socket support on Windows
  2022-07-30 14:50 ` [PATCH v3 2/4] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
@ 2022-08-01  7:09   ` Marc-André Lureau
  2022-08-01  9:39     ` Daniel P. Berrangé
  0 siblings, 1 reply; 9+ messages in thread
From: Marc-André Lureau @ 2022-08-01  7:09 UTC (permalink / raw)
  To: Bin Meng
  Cc: qemu-devel, Bin Meng, Xuzhou Cheng, Daniel P. Berrangé,
	Stefan Weil

[-- Attachment #1: Type: text/plain, Size: 4449 bytes --]

Hi

On Sat, Jul 30, 2022 at 6:52 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>
> ---
>
> 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               |  6 ++++++
>  include/sysemu/os-win32.h |  4 ++++
>  util/qemu-sockets.c       | 14 +++++++-------
>  3 files changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 294e9a8f32..3663b925d4 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2327,6 +2327,12 @@ have_afalg = get_option('crypto_afalg') \
>    '''), error_message: 'AF_ALG requested but could not be
> detected').allowed()
>  config_host_data.set('CONFIG_AF_ALG', have_afalg)
>
> +if targetos != 'windows'
> +  config_host_data.set('CONFIG_AF_UNIX', true)
>

Imho, we should simply define CONFIG_AFUNIX_H, regardless of the OS.


> +else
> +  config_host_data.set('CONFIG_AF_UNIX', cc.has_header('afunix.h'))
> +endif
>
+
>  config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
>    'linux/vm_sockets.h', 'AF_VSOCK',
>    prefix: '#include <sys/socket.h>',
> diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
> index edc3b38a57..cebf260694 100644
> --- a/include/sysemu/os-win32.h
> +++ b/include/sysemu/os-win32.h
> @@ -30,6 +30,10 @@
>  #include <windows.h>
>  #include <ws2tcpip.h>
>
> +#ifdef CONFIG_AF_UNIX
> +# include <afunix.h>
> +#endif
>

we could also provide a fallback, the same I did for glib:
https://gitlab.gnome.org/GNOME/glib/-/commit/4339192b5391a37ecd55816c713537fb1990cd07

So all Windows build will have afunix code compiled.

+
>  #ifdef __cplusplus
>  extern "C" {
>  #endif
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index 0e2298278f..f9892506de 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -880,7 +880,7 @@ static int vsock_parse(VsockSocketAddress *addr, const
> char *str,
>  }
>  #endif /* CONFIG_AF_VSOCK */
>
> -#ifndef _WIN32
> +#ifdef CONFIG_AF_UNIX
>
>  static bool saddr_is_abstract(UnixSocketAddress *saddr)
>  {
> @@ -1060,14 +1060,14 @@ static int unix_listen_saddr(UnixSocketAddress
> *saddr,
>                               int num,
>                               Error **errp)
>  {
> -    error_setg(errp, "unix sockets are not available on windows");
> +    error_setg(errp, "unix sockets are not available on your host");
>      errno = ENOTSUP;
>      return -1;
>  }
>
>  static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
>  {
> -    error_setg(errp, "unix sockets are not available on windows");
> +    error_setg(errp, "unix sockets are not available on your host");
>      errno = ENOTSUP;
>      return -1;
>  }
> @@ -1335,7 +1335,7 @@ socket_sockaddr_to_address_inet(struct
> sockaddr_storage *sa,
>  }
>
>
> -#ifndef WIN32
> +#ifdef CONFIG_AF_UNIX
>  static SocketAddress *
>  socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
>                                  socklen_t salen,
> @@ -1362,7 +1362,7 @@ socket_sockaddr_to_address_unix(struct
> sockaddr_storage *sa,
>      addr->u.q_unix.path = g_strndup(su->sun_path, salen);
>      return addr;
>  }
> -#endif /* WIN32 */
> +#endif /* CONFIG_AF_UNIX */
>
>  #ifdef CONFIG_AF_VSOCK
>  static SocketAddress *
> @@ -1394,10 +1394,10 @@ socket_sockaddr_to_address(struct sockaddr_storage
> *sa,
>      case AF_INET6:
>          return socket_sockaddr_to_address_inet(sa, salen, errp);
>
> -#ifndef WIN32
> +#ifdef CONFIG_AF_UNIX
>      case AF_UNIX:
>          return socket_sockaddr_to_address_unix(sa, salen, errp);
> -#endif /* WIN32 */
> +#endif
>
>  #ifdef CONFIG_AF_VSOCK
>      case AF_VSOCK:
> --
> 2.34.1
>
>
>

-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 6305 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 3/4] chardev/char-socket: Update AF_UNIX for Windows
  2022-07-30 14:50 ` [PATCH v3 3/4] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
@ 2022-08-01  7:19   ` Marc-André Lureau
  0 siblings, 0 replies; 9+ messages in thread
From: Marc-André Lureau @ 2022-08-01  7:19 UTC (permalink / raw)
  To: Bin Meng; +Cc: qemu-devel, Bin Meng, Paolo Bonzini

[-- Attachment #1: Type: text/plain, Size: 1654 bytes --]

Hi

On Sat, Jul 30, 2022 at 6:54 PM Bin Meng <bmeng.cn@gmail.com> wrote:

> 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>
> ---
>
> (no changes since v2)
>
> Changes in v2:
> - drop #include <afunix.h> as it is now already included in osdep.h
>
>  chardev/char-socket.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/chardev/char-socket.c b/chardev/char-socket.c
> index dc4e218eeb..14a56b7b13 100644
> --- a/chardev/char-socket.c
> +++ b/chardev/char-socket.c
> @@ -557,7 +557,7 @@ static char *qemu_chr_compute_filename(SocketChardev
> *s)
>      const char *left = "", *right = "";
>
>      switch (ss->ss_family) {
> -#ifndef _WIN32
> +#ifdef CONFIG_AF_UNIX
>      case AF_UNIX:
>          return g_strdup_printf("unix:%s%s",
>                                 ((struct sockaddr_un *)(ss))->sun_path,
> @@ -1372,10 +1372,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
>
>
With the fallback for afunix.h header on windows, we can enable various
code paths with AF_UNIX, without condition.



-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 2426 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 4/4] tests/unit: Update test-io-channel-socket.c for Windows
  2022-07-30 14:50 ` [PATCH v3 4/4] tests/unit: Update test-io-channel-socket.c " Bin Meng
@ 2022-08-01  7:32   ` Marc-André Lureau
  0 siblings, 0 replies; 9+ messages in thread
From: Marc-André Lureau @ 2022-08-01  7:32 UTC (permalink / raw)
  To: Bin Meng; +Cc: qemu-devel, Bin Meng, Daniel P. Berrangé

[-- Attachment #1: Type: text/plain, Size: 4738 bytes --]

Hi

On Sat, Jul 30, 2022 at 6:53 PM Bin Meng <bmeng.cn@gmail.com> wrote:

> From: Bin Meng <bin.meng@windriver.com>
>
> Enable the following 3 test cases for Windows when AF_UNIX is available:
>
>   * test_io_channel_unix_sync
>   * test_io_channel_unix_async
>   * test_io_channel_unix_listen_cleanup
>

The test should runtime-check the availability of AF_UNIX socket, and skip
those appropriately (not failing the test).
(for ex, in glib I wrote
https://gitlab.gnome.org/GNOME/glib/-/blob/main/gio/tests/gdbus-peer.c#L305)


> diff --git a/tests/unit/test-io-channel-socket.c
> b/tests/unit/test-io-channel-socket.c
> index 6713886d02..ec5df32489 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,7 @@ static void test_io_channel_ipv6_async(void)
>  }
>
>
> -#ifndef _WIN32
> +#ifdef CONFIG_AF_UNIX
>  static void test_io_channel_unix(bool async)
>  {
>      SocketAddress *listen_addr = g_new0(SocketAddress, 1);
> @@ -398,6 +406,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 +500,7 @@ static void test_io_channel_unix_fd_pass(void)
>      }
>      g_free(fdrecv);
>  }
> +#endif /* _WIN32 */
>
>  static void test_io_channel_unix_listen_cleanup(void)
>  {
> @@ -588,13 +598,15 @@ int main(int argc, char **argv)
>                          test_io_channel_ipv6_async);
>      }
>
> -#ifndef _WIN32
> +#ifdef CONFIG_AF_UNIX
>      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-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);
>  #endif /* _WIN32 */
>

The comments needs to be updated


-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 6092 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/4] util/qemu-sockets: Enable unix socket support on Windows
  2022-08-01  7:09   ` Marc-André Lureau
@ 2022-08-01  9:39     ` Daniel P. Berrangé
  0 siblings, 0 replies; 9+ messages in thread
From: Daniel P. Berrangé @ 2022-08-01  9:39 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Bin Meng, qemu-devel, Bin Meng, Xuzhou Cheng, Stefan Weil

On Mon, Aug 01, 2022 at 11:09:24AM +0400, Marc-André Lureau wrote:
> Hi
> 
> On Sat, Jul 30, 2022 at 6:52 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>
> > ---
> >
> > 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               |  6 ++++++
> >  include/sysemu/os-win32.h |  4 ++++
> >  util/qemu-sockets.c       | 14 +++++++-------
> >  3 files changed, 17 insertions(+), 7 deletions(-)
> >
> > diff --git a/meson.build b/meson.build
> > index 294e9a8f32..3663b925d4 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -2327,6 +2327,12 @@ have_afalg = get_option('crypto_afalg') \
> >    '''), error_message: 'AF_ALG requested but could not be
> > detected').allowed()
> >  config_host_data.set('CONFIG_AF_ALG', have_afalg)
> >
> > +if targetos != 'windows'
> > +  config_host_data.set('CONFIG_AF_UNIX', true)
> >
> 
> Imho, we should simply define CONFIG_AFUNIX_H, regardless of the OS.
> 
> 
> > +else
> > +  config_host_data.set('CONFIG_AF_UNIX', cc.has_header('afunix.h'))
> > +endif
> >
> +
> >  config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
> >    'linux/vm_sockets.h', 'AF_VSOCK',
> >    prefix: '#include <sys/socket.h>',
> > diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
> > index edc3b38a57..cebf260694 100644
> > --- a/include/sysemu/os-win32.h
> > +++ b/include/sysemu/os-win32.h
> > @@ -30,6 +30,10 @@
> >  #include <windows.h>
> >  #include <ws2tcpip.h>
> >
> > +#ifdef CONFIG_AF_UNIX
> > +# include <afunix.h>
> > +#endif
> >
> 
> we could also provide a fallback, the same I did for glib:
> https://gitlab.gnome.org/GNOME/glib/-/commit/4339192b5391a37ecd55816c713537fb1990cd07
> 
> So all Windows build will have afunix code compiled.

That's much nicer. It lets us get rid of the conditionals around all
the UNIX socket handling code across the codebase, except for the
FD passing checks which have to remain.


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-08-01  9:42 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-07-30 14:50 [PATCH v3 0/4] Enable unix socket support on Windows Bin Meng
2022-07-30 14:50 ` [PATCH v3 1/4] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
2022-07-30 14:50 ` [PATCH v3 2/4] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
2022-08-01  7:09   ` Marc-André Lureau
2022-08-01  9:39     ` Daniel P. Berrangé
2022-07-30 14:50 ` [PATCH v3 3/4] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
2022-08-01  7:19   ` Marc-André Lureau
2022-07-30 14:50 ` [PATCH v3 4/4] tests/unit: Update test-io-channel-socket.c " Bin Meng
2022-08-01  7:32   ` Marc-André Lureau

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).