Some systems may have the sockaddr fields in a different arrangement and need #ifdef'ing this makes this obvious to any future porters.
Signed-off-by: Daniel Gröber <d...@darkboxed.org> --- src/containers.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/containers.h b/src/containers.h index 2f3d88f..357df77 100644 --- a/src/containers.h +++ b/src/containers.h @@ -8,6 +8,8 @@ #include <stdint.h> #include <stdlib.h> +#include <stddef.h> +#include <assert.h> #include <time.h> #include <sys/socket.h> #include <net/if.h> @@ -44,6 +46,25 @@ struct sockaddr_inet { }; }; +#if defined(_MSC_VER) +#define static_assert(x) static_assert(x, #x) +#elif !defined(static_assert) +#define static_assert(x) _Static_assert((x), #x) +#endif + +static_assert(offsetof(struct sockaddr_in, sin_port) == + offsetof(struct sockaddr_inet, sinet_port)); +static_assert(offsetof(struct sockaddr_in6, sin6_port) == + offsetof(struct sockaddr_inet, sinet_port)); + +#define assert_offsets_match(tyx, tyy, field) \ + static_assert(offsetof(tyx, field) == offsetof(tyy, field)) + +assert_offsets_match(struct sockaddr_in, struct sockaddr_inet, sin_addr); +assert_offsets_match(struct sockaddr_in6, struct sockaddr_inet, sin6_flowinfo); +assert_offsets_match(struct sockaddr_in6, struct sockaddr_inet, sin6_addr); +assert_offsets_match(struct sockaddr_in6, struct sockaddr_inet, sin6_scope_id); + struct wgallowedip { uint16_t family; union { -- 2.39.2