From 5d9ecc4c01cafe858eab089b951b6c820e2f10b8 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 26 Jan 2025 15:45:37 +0100 Subject: [PATCH] Assert socket struct equality --- src/windows-emulator/devices/afd_endpoint.cpp | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/windows-emulator/devices/afd_endpoint.cpp b/src/windows-emulator/devices/afd_endpoint.cpp index 558e714a..c6e27460 100644 --- a/src/windows-emulator/devices/afd_endpoint.cpp +++ b/src/windows-emulator/devices/afd_endpoint.cpp @@ -22,6 +22,65 @@ namespace // ... }; + struct win_sockaddr + { + int16_t sa_family; + uint8_t sa_data[14]; + }; + + struct win_sockaddr_in + { + int16_t sin_family; + uint16_t sin_port; + in_addr sin_addr; + uint8_t sin_zero[8]; + }; + + struct win_sockaddr_in6 + { + int16_t sin6_family; + uint16_t sin6_port; + uint32_t sin6_flowinfo; + in6_addr sin6_addr; + uint32_t sin6_scope_id; + }; + + static_assert(sizeof(win_sockaddr) == 16); + static_assert(sizeof(win_sockaddr_in) == 16); + static_assert(sizeof(win_sockaddr_in6) == 28); + + static_assert(sizeof(win_sockaddr) == sizeof(sockaddr)); + static_assert(sizeof(win_sockaddr_in) == sizeof(sockaddr_in)); + static_assert(sizeof(win_sockaddr_in6) == sizeof(sockaddr_in6)); + + static_assert(offsetof(win_sockaddr, sa_family) == offsetof(sockaddr, sa_family)); + static_assert(offsetof(win_sockaddr, sa_data) == offsetof(sockaddr, sa_data)); + + static_assert(sizeof(win_sockaddr::sa_family) == sizeof(sockaddr::sa_family)); + static_assert(sizeof(win_sockaddr::sa_data) == sizeof(sockaddr::sa_data)); + + static_assert(offsetof(win_sockaddr_in, sin_family) == offsetof(sockaddr_in, sin_family)); + static_assert(offsetof(win_sockaddr_in, sin_port) == offsetof(sockaddr_in, sin_port)); + static_assert(offsetof(win_sockaddr_in, sin_addr) == offsetof(sockaddr_in, sin_addr)); + static_assert(offsetof(win_sockaddr_in, sin_zero) == offsetof(sockaddr_in, sin_zero)); + + static_assert(sizeof(win_sockaddr_in::sin_family) == sizeof(sockaddr_in::sin_family)); + static_assert(sizeof(win_sockaddr_in::sin_port) == sizeof(sockaddr_in::sin_port)); + static_assert(sizeof(win_sockaddr_in::sin_addr) == sizeof(sockaddr_in::sin_addr)); + static_assert(sizeof(win_sockaddr_in::sin_zero) == sizeof(sockaddr_in::sin_zero)); + + static_assert(offsetof(win_sockaddr_in6, sin6_family) == offsetof(sockaddr_in6, sin6_family)); + static_assert(offsetof(win_sockaddr_in6, sin6_port) == offsetof(sockaddr_in6, sin6_port)); + static_assert(offsetof(win_sockaddr_in6, sin6_flowinfo) == offsetof(sockaddr_in6, sin6_flowinfo)); + static_assert(offsetof(win_sockaddr_in6, sin6_addr) == offsetof(sockaddr_in6, sin6_addr)); + static_assert(offsetof(win_sockaddr_in6, sin6_scope_id) == offsetof(sockaddr_in6, sin6_scope_id)); + + static_assert(sizeof(win_sockaddr_in6::sin6_family) == sizeof(sockaddr_in6::sin6_family)); + static_assert(sizeof(win_sockaddr_in6::sin6_port) == sizeof(sockaddr_in6::sin6_port)); + static_assert(sizeof(win_sockaddr_in6::sin6_flowinfo) == sizeof(sockaddr_in6::sin6_flowinfo)); + static_assert(sizeof(win_sockaddr_in6::sin6_addr) == sizeof(sockaddr_in6::sin6_addr)); + static_assert(sizeof(win_sockaddr_in6::sin6_scope_id) == sizeof(sockaddr_in6::sin6_scope_id)); + const std::map address_family_map{ {0, AF_UNSPEC}, // {2, AF_INET}, //