All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/6] Enable unix socket support on Windows
@ 2022-07-27 13:27 Bin Meng
  2022-07-27 13:27 ` [PATCH v2 1/6] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Bin Meng @ 2022-07-27 13:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel P. Berrangé,
	Konstantin Kostiuk, Marc-André Lureau, Michael Roth,
	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 came to Windows. Starting
this build, two Win32 processes can use the AF_UNIX address family
over Winsock API to communicate with each other.

Introduce a new build time config option CONFIG_AF_UNIX when the build
host has such a capability, and a run-time check afunix_available() for
Windows host in the QEMU sockets util codes.

[1] https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/

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 (6):
  util/qemu-sockets: Replace the call to close a socket with
    closesocket()
  util/oslib-win32: Add a helper to get the Windows version
  qga/commands-win32: Use os_get_win_version()
  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           |  6 ++++
 chardev/char-socket.c               |  4 ++-
 qga/commands-win32.c                | 27 +---------------
 tests/unit/test-io-channel-socket.c | 16 ++++++++--
 util/oslib-win32.c                  | 15 +++++++++
 util/qemu-sockets.c                 | 49 +++++++++++++++++++++++------
 7 files changed, 85 insertions(+), 38 deletions(-)

-- 
2.34.1



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

* [PATCH v2 1/6] util/qemu-sockets: Replace the call to close a socket with closesocket()
  2022-07-27 13:27 [PATCH v2 0/6] Enable unix socket support on Windows Bin Meng
@ 2022-07-27 13:27 ` Bin Meng
  2022-07-28 12:51   ` Marc-André Lureau
  2022-07-27 13:27 ` [PATCH v2 2/6] util/oslib-win32: Add a helper to get the Windows version Bin Meng
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Bin Meng @ 2022-07-27 13:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bin Meng, 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>
---

(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] 11+ messages in thread

* [PATCH v2 2/6] util/oslib-win32: Add a helper to get the Windows version
  2022-07-27 13:27 [PATCH v2 0/6] Enable unix socket support on Windows Bin Meng
  2022-07-27 13:27 ` [PATCH v2 1/6] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
@ 2022-07-27 13:27 ` Bin Meng
  2022-07-28 12:54   ` Marc-André Lureau
  2022-07-27 13:27 ` [PATCH v2 3/6] qga/commands-win32: Use os_get_win_version() Bin Meng
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Bin Meng @ 2022-07-27 13:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bin Meng, Xuzhou Cheng, Stefan Weil

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

This adds a helper to get the Windows version via the RtlGetVersion
call, for QEMU codes to determine the Windows version at run-time.

Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
Signed-off-by: Bin Meng <bin.meng@windriver.com>
---

(no changes since v1)

 include/sysemu/os-win32.h |  2 ++
 util/oslib-win32.c        | 15 +++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
index edc3b38a57..1e324026a4 100644
--- a/include/sysemu/os-win32.h
+++ b/include/sysemu/os-win32.h
@@ -204,6 +204,8 @@ ssize_t qemu_recv_wrap(int sockfd, void *buf, size_t len, int flags);
 ssize_t qemu_recvfrom_wrap(int sockfd, void *buf, size_t len, int flags,
                            struct sockaddr *addr, socklen_t *addrlen);
 
+void os_get_win_version(RTL_OSVERSIONINFOEXW *info);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/util/oslib-win32.c b/util/oslib-win32.c
index 5723d3eb4c..6d2387b9ff 100644
--- a/util/oslib-win32.c
+++ b/util/oslib-win32.c
@@ -547,3 +547,18 @@ int qemu_msync(void *addr, size_t length, int fd)
      */
     return qemu_fdatasync(fd);
 }
+
+void os_get_win_version(RTL_OSVERSIONINFOEXW *info)
+{
+    typedef LONG (WINAPI *rtl_get_version_t)(PRTL_OSVERSIONINFOEXW);
+
+    /* RtlGetVersion is available starting with Windows 2000 */
+    HMODULE module = GetModuleHandle("ntdll");
+    PVOID fun = GetProcAddress(module, "RtlGetVersion");
+    rtl_get_version_t rtl_get_version = (rtl_get_version_t)fun;
+
+    info->dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
+    rtl_get_version(info);
+
+    return;
+}
-- 
2.34.1



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

* [PATCH v2 3/6] qga/commands-win32: Use os_get_win_version()
  2022-07-27 13:27 [PATCH v2 0/6] Enable unix socket support on Windows Bin Meng
  2022-07-27 13:27 ` [PATCH v2 1/6] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
  2022-07-27 13:27 ` [PATCH v2 2/6] util/oslib-win32: Add a helper to get the Windows version Bin Meng
@ 2022-07-27 13:27 ` Bin Meng
  2022-07-28 12:55   ` Marc-André Lureau
  2022-07-27 13:28 ` [PATCH v2 4/6] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Bin Meng @ 2022-07-27 13:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bin Meng, Konstantin Kostiuk, Michael Roth

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

Drop its own ga_get_win_version() implementation, and use the one
provided in oslib-win32 instead.

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

(no changes since v1)

 qga/commands-win32.c | 27 +--------------------------
 1 file changed, 1 insertion(+), 26 deletions(-)

diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 7ed7664715..6186f2e1f2 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -2178,26 +2178,6 @@ static ga_win_10_0_t const WIN_10_0_CLIENT_VERSION_MATRIX[3] = {
     {0, 0}
 };
 
-static void ga_get_win_version(RTL_OSVERSIONINFOEXW *info, Error **errp)
-{
-    typedef NTSTATUS(WINAPI *rtl_get_version_t)(
-        RTL_OSVERSIONINFOEXW *os_version_info_ex);
-
-    info->dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
-
-    HMODULE module = GetModuleHandle("ntdll");
-    PVOID fun = GetProcAddress(module, "RtlGetVersion");
-    if (fun == NULL) {
-        error_setg(errp, QERR_QGA_COMMAND_FAILED,
-            "Failed to get address of RtlGetVersion");
-        return;
-    }
-
-    rtl_get_version_t rtl_get_version = (rtl_get_version_t)fun;
-    rtl_get_version(info);
-    return;
-}
-
 static char *ga_get_win_name(OSVERSIONINFOEXW const *os_version, bool id)
 {
     DWORD major = os_version->dwMajorVersion;
@@ -2312,17 +2292,12 @@ static char *ga_get_current_arch(void)
 
 GuestOSInfo *qmp_guest_get_osinfo(Error **errp)
 {
-    Error *local_err = NULL;
     OSVERSIONINFOEXW os_version = {0};
     bool server;
     char *product_name;
     GuestOSInfo *info;
 
-    ga_get_win_version(&os_version, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
-        return NULL;
-    }
+    os_get_win_version(&os_version);
 
     server = os_version.wProductType != VER_NT_WORKSTATION;
     product_name = ga_get_win_product_name(errp);
-- 
2.34.1



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

* [PATCH v2 4/6] util/qemu-sockets: Enable unix socket support on Windows
  2022-07-27 13:27 [PATCH v2 0/6] Enable unix socket support on Windows Bin Meng
                   ` (2 preceding siblings ...)
  2022-07-27 13:27 ` [PATCH v2 3/6] qga/commands-win32: Use os_get_win_version() Bin Meng
@ 2022-07-27 13:28 ` Bin Meng
  2022-07-27 13:28 ` [PATCH v2 5/6] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
  2022-07-27 13:28 ` [PATCH v2 6/6] tests/unit: Update test-io-channel-socket.c " Bin Meng
  5 siblings, 0 replies; 11+ messages in thread
From: Bin Meng @ 2022-07-27 13:28 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 came to Windows. Starting
this build, two Win32 processes can use the AF_UNIX address family
over Winsock API to communicate with each other.

Introduce a new build time config option CONFIG_AF_UNIX when the build
host has such a capability, and a run-time check afunix_available() for
Windows host in the QEMU sockets util codes.

[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 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       | 45 +++++++++++++++++++++++++++++++++------
 3 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/meson.build b/meson.build
index 75aaca8462..73e5de5957 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 1e324026a4..62aac7c930 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..c5c1c3bbaf 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)
 {
@@ -900,6 +900,23 @@ static bool saddr_is_tight(UnixSocketAddress *saddr)
 #endif
 }
 
+#ifdef CONFIG_WIN32
+/*
+ * AF_UNIX support is available since Windows 10 build 17063
+ * See https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
+ */
+#define WIN_BUILD_AF_UNIX 17063
+
+static bool afunix_available(void)
+{
+    OSVERSIONINFOEXW os_version = { 0 };
+
+    os_get_win_version(&os_version);
+
+    return os_version.dwBuildNumber >= WIN_BUILD_AF_UNIX;
+}
+#endif
+
 static int unix_listen_saddr(UnixSocketAddress *saddr,
                              int num,
                              Error **errp)
@@ -912,6 +929,13 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
     size_t pathlen;
     size_t addrlen;
 
+#ifdef CONFIG_WIN32
+    if (!afunix_available()) {
+        error_setg(errp, "AF_UNIX is not available on your Windows");
+        return -1;
+    }
+#endif
+
     sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
     if (sock < 0) {
         error_setg_errno(errp, errno, "Failed to create Unix socket");
@@ -1004,6 +1028,13 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
         return -1;
     }
 
+#ifdef CONFIG_WIN32
+    if (!afunix_available()) {
+        error_setg(errp, "AF_UNIX is not available on your Windows");
+        return -1;
+    }
+#endif
+
     sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
     if (sock < 0) {
         error_setg_errno(errp, errno, "Failed to create socket");
@@ -1060,14 +1091,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 +1366,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 +1393,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 +1425,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] 11+ messages in thread

* [PATCH v2 5/6] chardev/char-socket: Update AF_UNIX for Windows
  2022-07-27 13:27 [PATCH v2 0/6] Enable unix socket support on Windows Bin Meng
                   ` (3 preceding siblings ...)
  2022-07-27 13:28 ` [PATCH v2 4/6] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
@ 2022-07-27 13:28 ` Bin Meng
  2022-07-28 13:03   ` Marc-André Lureau
  2022-07-27 13:28 ` [PATCH v2 6/6] tests/unit: Update test-io-channel-socket.c " Bin Meng
  5 siblings, 1 reply; 11+ messages in thread
From: Bin Meng @ 2022-07-27 13:28 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>
---

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] 11+ messages in thread

* [PATCH v2 6/6] tests/unit: Update test-io-channel-socket.c for Windows
  2022-07-27 13:27 [PATCH v2 0/6] Enable unix socket support on Windows Bin Meng
                   ` (4 preceding siblings ...)
  2022-07-27 13:28 ` [PATCH v2 5/6] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
@ 2022-07-27 13:28 ` Bin Meng
  5 siblings, 0 replies; 11+ messages in thread
From: Bin Meng @ 2022-07-27 13:28 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>
---

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] 11+ messages in thread

* Re: [PATCH v2 1/6] util/qemu-sockets: Replace the call to close a socket with closesocket()
  2022-07-27 13:27 ` [PATCH v2 1/6] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
@ 2022-07-28 12:51   ` Marc-André Lureau
  0 siblings, 0 replies; 11+ messages in thread
From: Marc-André Lureau @ 2022-07-28 12:51 UTC (permalink / raw)
  To: Bin Meng; +Cc: qemu-devel, Bin Meng, Daniel P. Berrangé

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

On Wed, Jul 27, 2022 at 5:28 PM Bin Meng <bmeng.cn@gmail.com> wrote:

> 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>
>

This is a fix, could go in 7.1. Daniel, do you take it?

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Thanks

---
>
> (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
>
>
>

-- 
Marc-André Lureau

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

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

* Re: [PATCH v2 2/6] util/oslib-win32: Add a helper to get the Windows version
  2022-07-27 13:27 ` [PATCH v2 2/6] util/oslib-win32: Add a helper to get the Windows version Bin Meng
@ 2022-07-28 12:54   ` Marc-André Lureau
  0 siblings, 0 replies; 11+ messages in thread
From: Marc-André Lureau @ 2022-07-28 12:54 UTC (permalink / raw)
  To: Bin Meng; +Cc: qemu-devel, Bin Meng, Xuzhou Cheng, Stefan Weil

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

Hi

On Wed, Jul 27, 2022 at 5:35 PM Bin Meng <bmeng.cn@gmail.com> wrote:

> From: Bin Meng <bin.meng@windriver.com>
>
> This adds a helper to get the Windows version via the RtlGetVersion
> call, for QEMU codes to determine the Windows version at run-time.
>
> Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> ---
>
> (no changes since v1)
>

It looks like you are introducing new code, but in fact it's almost
identical as the  ga_get_win_version() function. Please do the move in the
same patch.


>  include/sysemu/os-win32.h |  2 ++
>  util/oslib-win32.c        | 15 +++++++++++++++
>  2 files changed, 17 insertions(+)
>
> diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
> index edc3b38a57..1e324026a4 100644
> --- a/include/sysemu/os-win32.h
> +++ b/include/sysemu/os-win32.h
> @@ -204,6 +204,8 @@ ssize_t qemu_recv_wrap(int sockfd, void *buf, size_t
> len, int flags);
>  ssize_t qemu_recvfrom_wrap(int sockfd, void *buf, size_t len, int flags,
>                             struct sockaddr *addr, socklen_t *addrlen);
>
> +void os_get_win_version(RTL_OSVERSIONINFOEXW *info);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/util/oslib-win32.c b/util/oslib-win32.c
> index 5723d3eb4c..6d2387b9ff 100644
> --- a/util/oslib-win32.c
> +++ b/util/oslib-win32.c
> @@ -547,3 +547,18 @@ int qemu_msync(void *addr, size_t length, int fd)
>       */
>      return qemu_fdatasync(fd);
>  }
> +
> +void os_get_win_version(RTL_OSVERSIONINFOEXW *info)
> +{
> +    typedef LONG (WINAPI *rtl_get_version_t)(PRTL_OSVERSIONINFOEXW);
> +
> +    /* RtlGetVersion is available starting with Windows 2000 */
> +    HMODULE module = GetModuleHandle("ntdll");
> +    PVOID fun = GetProcAddress(module, "RtlGetVersion");
> +    rtl_get_version_t rtl_get_version = (rtl_get_version_t)fun;
> +
> +    info->dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
> +    rtl_get_version(info);
> +
> +    return;
> +}
> --
> 2.34.1
>
>
>

-- 
Marc-André Lureau

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

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

* Re: [PATCH v2 3/6] qga/commands-win32: Use os_get_win_version()
  2022-07-27 13:27 ` [PATCH v2 3/6] qga/commands-win32: Use os_get_win_version() Bin Meng
@ 2022-07-28 12:55   ` Marc-André Lureau
  0 siblings, 0 replies; 11+ messages in thread
From: Marc-André Lureau @ 2022-07-28 12:55 UTC (permalink / raw)
  To: Bin Meng; +Cc: qemu-devel, Bin Meng, Konstantin Kostiuk, Michael Roth

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

Hi

On Wed, Jul 27, 2022 at 5:30 PM Bin Meng <bmeng.cn@gmail.com> wrote:

> From: Bin Meng <bin.meng@windriver.com>
>
> Drop its own ga_get_win_version() implementation, and use the one
> provided in oslib-win32 instead.
>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
>

Will be squashed with the previous patch, since the move should be done
together.


> ---
>
> (no changes since v1)
>
>  qga/commands-win32.c | 27 +--------------------------
>  1 file changed, 1 insertion(+), 26 deletions(-)
>
> diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> index 7ed7664715..6186f2e1f2 100644
> --- a/qga/commands-win32.c
> +++ b/qga/commands-win32.c
> @@ -2178,26 +2178,6 @@ static ga_win_10_0_t const
> WIN_10_0_CLIENT_VERSION_MATRIX[3] = {
>      {0, 0}
>  };
>
> -static void ga_get_win_version(RTL_OSVERSIONINFOEXW *info, Error **errp)
> -{
> -    typedef NTSTATUS(WINAPI *rtl_get_version_t)(
> -        RTL_OSVERSIONINFOEXW *os_version_info_ex);
> -
> -    info->dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
> -
> -    HMODULE module = GetModuleHandle("ntdll");
> -    PVOID fun = GetProcAddress(module, "RtlGetVersion");
> -    if (fun == NULL) {
> -        error_setg(errp, QERR_QGA_COMMAND_FAILED,
> -            "Failed to get address of RtlGetVersion");
> -        return;
> -    }
> -
> -    rtl_get_version_t rtl_get_version = (rtl_get_version_t)fun;
> -    rtl_get_version(info);
> -    return;
> -}
> -
>  static char *ga_get_win_name(OSVERSIONINFOEXW const *os_version, bool id)
>  {
>      DWORD major = os_version->dwMajorVersion;
> @@ -2312,17 +2292,12 @@ static char *ga_get_current_arch(void)
>
>  GuestOSInfo *qmp_guest_get_osinfo(Error **errp)
>  {
> -    Error *local_err = NULL;
>      OSVERSIONINFOEXW os_version = {0};
>      bool server;
>      char *product_name;
>      GuestOSInfo *info;
>
> -    ga_get_win_version(&os_version, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> -        return NULL;
> -    }
> +    os_get_win_version(&os_version);
>
>      server = os_version.wProductType != VER_NT_WORKSTATION;
>      product_name = ga_get_win_product_name(errp);
> --
> 2.34.1
>
>
>

-- 
Marc-André Lureau

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

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

* Re: [PATCH v2 5/6] chardev/char-socket: Update AF_UNIX for Windows
  2022-07-27 13:28 ` [PATCH v2 5/6] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
@ 2022-07-28 13:03   ` Marc-André Lureau
  0 siblings, 0 replies; 11+ messages in thread
From: Marc-André Lureau @ 2022-07-28 13:03 UTC (permalink / raw)
  To: Bin Meng; +Cc: qemu-devel, Bin Meng, Paolo Bonzini

Hi

On Wed, Jul 27, 2022 at 5:28 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>

lgtm,

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>
> 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	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-07-28 13:06 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-27 13:27 [PATCH v2 0/6] Enable unix socket support on Windows Bin Meng
2022-07-27 13:27 ` [PATCH v2 1/6] util/qemu-sockets: Replace the call to close a socket with closesocket() Bin Meng
2022-07-28 12:51   ` Marc-André Lureau
2022-07-27 13:27 ` [PATCH v2 2/6] util/oslib-win32: Add a helper to get the Windows version Bin Meng
2022-07-28 12:54   ` Marc-André Lureau
2022-07-27 13:27 ` [PATCH v2 3/6] qga/commands-win32: Use os_get_win_version() Bin Meng
2022-07-28 12:55   ` Marc-André Lureau
2022-07-27 13:28 ` [PATCH v2 4/6] util/qemu-sockets: Enable unix socket support on Windows Bin Meng
2022-07-27 13:28 ` [PATCH v2 5/6] chardev/char-socket: Update AF_UNIX for Windows Bin Meng
2022-07-28 13:03   ` Marc-André Lureau
2022-07-27 13:28 ` [PATCH v2 6/6] tests/unit: Update test-io-channel-socket.c " Bin Meng

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.