Re: [PATCH 4/5] util/qemu-sockets: Enable unix socket support on Windows

2022-07-28 Thread Bin Meng
On Thu, Jul 28, 2022 at 9:11 PM Marc-André Lureau
 wrote:
>
> Hi
>
> On Wed, Jul 27, 2022 at 2:05 PM Bin Meng  wrote:
>>
>> On Wed, Jul 27, 2022 at 4:53 PM Konstantin Kostiuk  
>> wrote:
>> >
>> >
>> >
>> >
>> >
>> > On Wed, Jul 27, 2022 at 10:47 AM Bin Meng  wrote:
>> >>
>> >> From: Bin Meng 
>> >>
>> >> 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 
>> >> Signed-off-by: Bin Meng 
>> >> ---
>> >>
>> >>  meson.build |  6 ++
>> >>  util/qemu-sockets.c | 48 ++---
>> >>  2 files changed, 47 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 ',
>> >> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
>> >> index 0e2298278f..d85f3ea3ee 100644
>> >> --- a/util/qemu-sockets.c
>> >> +++ b/util/qemu-sockets.c
>> >> @@ -17,6 +17,15 @@
>> >>   */
>> >>  #include "qemu/osdep.h"
>> >>
>> >> +#if defined(CONFIG_WIN32) && defined(CONFIG_AF_UNIX)
>> >> +# include 
>> >> +/*
>> >> + * 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
>> >> +#endif /* CONFIG_WIN32 && CONFIG_AF_UNIX */
>> >> +
>> >>  #ifdef CONFIG_AF_VSOCK
>> >>  #include 
>> >>  #endif /* CONFIG_AF_VSOCK */
>> >> @@ -880,7 +889,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 +909,17 @@ static bool saddr_is_tight(UnixSocketAddress *saddr)
>> >>  #endif
>> >>  }
>> >>
>> >> +#ifdef CONFIG_WIN32
>> >> +static bool afunix_available(void)
>> >> +{
>> >> +OSVERSIONINFOEXW os_version = { 0 };
>> >> +
>> >> +os_get_win_version(&os_version);
>> >> +
>> >> +return os_version.dwBuildNumber >= WIN_BUILD_AF_UNIX;
>> >
>> >
>> > I think this is a bad variant to check feature support by checking
>> > Windows build. From my point, you should try to create an AF_UNIX
>> > socket and if it fails then fall back to the old behavior.
>> >
>>
>> The caller intends to create an AF_UNIX socket, and if Windows does
>> not have the capability, it fails, and we return -1 to the caller.
>> I am not sure what old behavior we should fall back to.
>>
>
> I agree with Konstantin, we shouldn't check the Windows version, but assume 
> the socket creation can work, and just report a regular error if not.
>
> (you can drop some of the preliminary patch then)
>

Sure, will do in v3.

Regards,
Bin



Re: [PATCH 4/5] util/qemu-sockets: Enable unix socket support on Windows

2022-07-28 Thread Marc-André Lureau
Hi

On Wed, Jul 27, 2022 at 2:05 PM Bin Meng  wrote:

> On Wed, Jul 27, 2022 at 4:53 PM Konstantin Kostiuk 
> wrote:
> >
> >
> >
> >
> >
> > On Wed, Jul 27, 2022 at 10:47 AM Bin Meng  wrote:
> >>
> >> From: Bin Meng 
> >>
> >> 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 
> >> Signed-off-by: Bin Meng 
> >> ---
> >>
> >>  meson.build |  6 ++
> >>  util/qemu-sockets.c | 48 ++---
> >>  2 files changed, 47 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 ',
> >> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> >> index 0e2298278f..d85f3ea3ee 100644
> >> --- a/util/qemu-sockets.c
> >> +++ b/util/qemu-sockets.c
> >> @@ -17,6 +17,15 @@
> >>   */
> >>  #include "qemu/osdep.h"
> >>
> >> +#if defined(CONFIG_WIN32) && defined(CONFIG_AF_UNIX)
> >> +# include 
> >> +/*
> >> + * 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
> >> +#endif /* CONFIG_WIN32 && CONFIG_AF_UNIX */
> >> +
> >>  #ifdef CONFIG_AF_VSOCK
> >>  #include 
> >>  #endif /* CONFIG_AF_VSOCK */
> >> @@ -880,7 +889,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 +909,17 @@ static bool saddr_is_tight(UnixSocketAddress
> *saddr)
> >>  #endif
> >>  }
> >>
> >> +#ifdef CONFIG_WIN32
> >> +static bool afunix_available(void)
> >> +{
> >> +OSVERSIONINFOEXW os_version = { 0 };
> >> +
> >> +os_get_win_version(&os_version);
> >> +
> >> +return os_version.dwBuildNumber >= WIN_BUILD_AF_UNIX;
> >
> >
> > I think this is a bad variant to check feature support by checking
> > Windows build. From my point, you should try to create an AF_UNIX
> > socket and if it fails then fall back to the old behavior.
> >
>
> The caller intends to create an AF_UNIX socket, and if Windows does
> not have the capability, it fails, and we return -1 to the caller.
> I am not sure what old behavior we should fall back to.
>
>
I agree with Konstantin, we shouldn't check the Windows version, but assume
the socket creation can work, and just report a regular error if not.

(you can drop some of the preliminary patch then)

-- 
Marc-André Lureau


Re: [PATCH 4/5] util/qemu-sockets: Enable unix socket support on Windows

2022-07-27 Thread Bin Meng
On Wed, Jul 27, 2022 at 4:53 PM Konstantin Kostiuk  wrote:
>
>
>
>
>
> On Wed, Jul 27, 2022 at 10:47 AM Bin Meng  wrote:
>>
>> From: Bin Meng 
>>
>> 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 
>> Signed-off-by: Bin Meng 
>> ---
>>
>>  meson.build |  6 ++
>>  util/qemu-sockets.c | 48 ++---
>>  2 files changed, 47 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 ',
>> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
>> index 0e2298278f..d85f3ea3ee 100644
>> --- a/util/qemu-sockets.c
>> +++ b/util/qemu-sockets.c
>> @@ -17,6 +17,15 @@
>>   */
>>  #include "qemu/osdep.h"
>>
>> +#if defined(CONFIG_WIN32) && defined(CONFIG_AF_UNIX)
>> +# include 
>> +/*
>> + * 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
>> +#endif /* CONFIG_WIN32 && CONFIG_AF_UNIX */
>> +
>>  #ifdef CONFIG_AF_VSOCK
>>  #include 
>>  #endif /* CONFIG_AF_VSOCK */
>> @@ -880,7 +889,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 +909,17 @@ static bool saddr_is_tight(UnixSocketAddress *saddr)
>>  #endif
>>  }
>>
>> +#ifdef CONFIG_WIN32
>> +static bool afunix_available(void)
>> +{
>> +OSVERSIONINFOEXW os_version = { 0 };
>> +
>> +os_get_win_version(&os_version);
>> +
>> +return os_version.dwBuildNumber >= WIN_BUILD_AF_UNIX;
>
>
> I think this is a bad variant to check feature support by checking
> Windows build. From my point, you should try to create an AF_UNIX
> socket and if it fails then fall back to the old behavior.
>

The caller intends to create an AF_UNIX socket, and if Windows does
not have the capability, it fails, and we return -1 to the caller.
I am not sure what old behavior we should fall back to.

Regards,
Bin



Re: [PATCH 4/5] util/qemu-sockets: Enable unix socket support on Windows

2022-07-27 Thread Bin Meng
On Wed, Jul 27, 2022 at 4:51 PM Yan Vugenfirer  wrote:
>
> On Wed, Jul 27, 2022 at 10:46 AM Bin Meng  wrote:
> >
> > From: Bin Meng 
> >
> > 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 
> > Signed-off-by: Bin Meng 
> > ---
> >
> >  meson.build |  6 ++
> >  util/qemu-sockets.c | 48 ++---
> >  2 files changed, 47 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 ',
> > diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> > index 0e2298278f..d85f3ea3ee 100644
> > --- a/util/qemu-sockets.c
> > +++ b/util/qemu-sockets.c
> > @@ -17,6 +17,15 @@
> >   */
> >  #include "qemu/osdep.h"
> >
> > +#if defined(CONFIG_WIN32) && defined(CONFIG_AF_UNIX)
> > +# include 
> > +/*
> > + * 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
> > +#endif /* CONFIG_WIN32 && CONFIG_AF_UNIX */
> > +
> >  #ifdef CONFIG_AF_VSOCK
> >  #include 
> >  #endif /* CONFIG_AF_VSOCK */
> > @@ -880,7 +889,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 +909,17 @@ static bool saddr_is_tight(UnixSocketAddress *saddr)
> >  #endif
> >  }
> >
> > +#ifdef CONFIG_WIN32
> > +static bool afunix_available(void)
> > +{
> > +OSVERSIONINFOEXW os_version = { 0 };
> > +
> > +os_get_win_version(&os_version);
> > +
> > +return os_version.dwBuildNumber >= WIN_BUILD_AF_UNIX;
> It can be that CONFIG_WIN32 is defined,but CONFIG_AF_UNIX is not. In
> this case WIN_BUILD_AF_UNIX will be undefined.
> Also, WIN_BUILD_AF_UNIX is just a build constant, why not define it
> always under CONFIG_WIN32?
>

Thanks for the review.

Will put WIN_BUILD_AF_UNIX under CONFIG_WIN32 only.

Regards,
Bin



Re: [PATCH 4/5] util/qemu-sockets: Enable unix socket support on Windows

2022-07-27 Thread Yan Vugenfirer
On Wed, Jul 27, 2022 at 10:46 AM Bin Meng  wrote:
>
> From: Bin Meng 
>
> 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 
> Signed-off-by: Bin Meng 
> ---
>
>  meson.build |  6 ++
>  util/qemu-sockets.c | 48 ++---
>  2 files changed, 47 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 ',
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index 0e2298278f..d85f3ea3ee 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -17,6 +17,15 @@
>   */
>  #include "qemu/osdep.h"
>
> +#if defined(CONFIG_WIN32) && defined(CONFIG_AF_UNIX)
> +# include 
> +/*
> + * 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
> +#endif /* CONFIG_WIN32 && CONFIG_AF_UNIX */
> +
>  #ifdef CONFIG_AF_VSOCK
>  #include 
>  #endif /* CONFIG_AF_VSOCK */
> @@ -880,7 +889,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 +909,17 @@ static bool saddr_is_tight(UnixSocketAddress *saddr)
>  #endif
>  }
>
> +#ifdef CONFIG_WIN32
> +static bool afunix_available(void)
> +{
> +OSVERSIONINFOEXW os_version = { 0 };
> +
> +os_get_win_version(&os_version);
> +
> +return os_version.dwBuildNumber >= WIN_BUILD_AF_UNIX;
It can be that CONFIG_WIN32 is defined,but CONFIG_AF_UNIX is not. In
this case WIN_BUILD_AF_UNIX will be undefined.
Also, WIN_BUILD_AF_UNIX is just a build constant, why not define it
always under CONFIG_WIN32?

Best regards,
Yan.


> +}
> +#endif
> +
>  static int unix_listen_saddr(UnixSocketAddress *saddr,
>   int num,
>   Error **errp)
> @@ -912,6 +932,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 +1031,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 +1094,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 +1369,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 +1396,7 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage 
> *sa,
>  addr->u.q_unix.p

Re: [PATCH 4/5] util/qemu-sockets: Enable unix socket support on Windows

2022-07-27 Thread Konstantin Kostiuk
On Wed, Jul 27, 2022 at 10:47 AM Bin Meng  wrote:

> From: Bin Meng 
>
> 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 
> Signed-off-by: Bin Meng 
> ---
>
>  meson.build |  6 ++
>  util/qemu-sockets.c | 48 ++---
>  2 files changed, 47 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 ',
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index 0e2298278f..d85f3ea3ee 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -17,6 +17,15 @@
>   */
>  #include "qemu/osdep.h"
>
> +#if defined(CONFIG_WIN32) && defined(CONFIG_AF_UNIX)
> +# include 
> +/*
> + * 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
> +#endif /* CONFIG_WIN32 && CONFIG_AF_UNIX */
> +
>  #ifdef CONFIG_AF_VSOCK
>  #include 
>  #endif /* CONFIG_AF_VSOCK */
> @@ -880,7 +889,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 +909,17 @@ static bool saddr_is_tight(UnixSocketAddress *saddr)
>  #endif
>  }
>
> +#ifdef CONFIG_WIN32
> +static bool afunix_available(void)
> +{
> +OSVERSIONINFOEXW os_version = { 0 };
> +
> +os_get_win_version(&os_version);
> +
> +return os_version.dwBuildNumber >= WIN_BUILD_AF_UNIX;
>

I think this is a bad variant to check feature support by checking
Windows build. From my point, you should try to create an AF_UNIX
socket and if it fails then fall back to the old behavior.


> +}
> +#endif
> +
>  static int unix_listen_saddr(UnixSocketAddress *saddr,
>   int num,
>   Error **errp)
> @@ -912,6 +932,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 +1031,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 +1094,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 +1369,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 +1396,7 @@ socket_sockaddr_to_address_unix(struct
> sockaddr_storage *sa,
>  addr->u.q_unix.path = g_strndup(su->sun_path, salen);

[PATCH 4/5] util/qemu-sockets: Enable unix socket support on Windows

2022-07-27 Thread Bin Meng
From: Bin Meng 

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 
Signed-off-by: Bin Meng 
---

 meson.build |  6 ++
 util/qemu-sockets.c | 48 ++---
 2 files changed, 47 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 ',
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 0e2298278f..d85f3ea3ee 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -17,6 +17,15 @@
  */
 #include "qemu/osdep.h"
 
+#if defined(CONFIG_WIN32) && defined(CONFIG_AF_UNIX)
+# include 
+/*
+ * 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
+#endif /* CONFIG_WIN32 && CONFIG_AF_UNIX */
+
 #ifdef CONFIG_AF_VSOCK
 #include 
 #endif /* CONFIG_AF_VSOCK */
@@ -880,7 +889,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 +909,17 @@ static bool saddr_is_tight(UnixSocketAddress *saddr)
 #endif
 }
 
+#ifdef CONFIG_WIN32
+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 +932,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 +1031,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 +1094,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 +1369,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 +1396,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 +1428,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