util/qemu-sockets: Enable unix socket support on Windows
Support for the unix socket has existed both in BSD and Linux for the longest time, but not on Windows. Since Windows 10 build 17063 [1], the native support for the unix socket has come to Windows. Starting this build, two Win32 processes can use the AF_UNIX address family over Winsock API to communicate with each other. [1] https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/ Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com> Signed-off-by: Bin Meng <bin.meng@windriver.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20220802075200.907360-3-bmeng.cn@gmail.com>
This commit is contained in:
parent
93fac696d2
commit
d409373b9d
@ -30,6 +30,23 @@
|
||||
#include <windows.h>
|
||||
#include <ws2tcpip.h>
|
||||
|
||||
#ifdef HAVE_AFUNIX_H
|
||||
#include <afunix.h>
|
||||
#else
|
||||
/*
|
||||
* Fallback definitions of things we need in afunix.h, if not available from
|
||||
* the used Windows SDK or MinGW headers.
|
||||
*/
|
||||
#define UNIX_PATH_MAX 108
|
||||
|
||||
typedef struct sockaddr_un {
|
||||
ADDRESS_FAMILY sun_family;
|
||||
char sun_path[UNIX_PATH_MAX];
|
||||
} SOCKADDR_UN, *PSOCKADDR_UN;
|
||||
|
||||
#define SIO_AF_UNIX_GETPEERPID _WSAIOR(IOC_VENDOR, 256)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -1890,6 +1890,9 @@ config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
|
||||
config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
|
||||
config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
|
||||
config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
|
||||
if targetos == 'windows'
|
||||
config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
|
||||
endif
|
||||
|
||||
# has_function
|
||||
config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
|
||||
|
@ -880,8 +880,6 @@ static int vsock_parse(VsockSocketAddress *addr, const char *str,
|
||||
}
|
||||
#endif /* CONFIG_AF_VSOCK */
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
static bool saddr_is_abstract(UnixSocketAddress *saddr)
|
||||
{
|
||||
#ifdef CONFIG_LINUX
|
||||
@ -1054,25 +1052,6 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static int unix_listen_saddr(UnixSocketAddress *saddr,
|
||||
int num,
|
||||
Error **errp)
|
||||
{
|
||||
error_setg(errp, "unix sockets are not available on windows");
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
|
||||
{
|
||||
error_setg(errp, "unix sockets are not available on windows");
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* compatibility wrapper */
|
||||
int unix_listen(const char *str, Error **errp)
|
||||
{
|
||||
@ -1335,7 +1314,6 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
|
||||
}
|
||||
|
||||
|
||||
#ifndef WIN32
|
||||
static SocketAddress *
|
||||
socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
|
||||
socklen_t salen,
|
||||
@ -1362,7 +1340,6 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
|
||||
addr->u.q_unix.path = g_strndup(su->sun_path, salen);
|
||||
return addr;
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
#ifdef CONFIG_AF_VSOCK
|
||||
static SocketAddress *
|
||||
@ -1394,10 +1371,8 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
|
||||
case AF_INET6:
|
||||
return socket_sockaddr_to_address_inet(sa, salen, errp);
|
||||
|
||||
#ifndef WIN32
|
||||
case AF_UNIX:
|
||||
return socket_sockaddr_to_address_unix(sa, salen, errp);
|
||||
#endif /* WIN32 */
|
||||
|
||||
#ifdef CONFIG_AF_VSOCK
|
||||
case AF_VSOCK:
|
||||
|
Loading…
Reference in New Issue
Block a user