Hi Bastien, On 1/20/23 21:32, Bastien Roucariès wrote: [...] >> diff --git a/bits/socket.h b/bits/socket.h >> index aac8c49b00..c0c23b4e84 100644 >> --- a/bits/socket.h >> +++ b/bits/socket.h >> @@ -168,9 +168,14 @@ struct sockaddr >> >> struct sockaddr_storage >> { >> - __SOCKADDR_COMMON (ss_); /* Address family, etc. */ >> - char __ss_padding[_SS_PADSIZE]; >> - __ss_aligntype __ss_align; /* Force desired alignment. */ > no this is not correct you break ABI by reducing size >> + union >> + { >> + __SOCKADDR_COMMON (ss_); /* Address family, etc. */ >> + struct sockaddr sa; >> + struct sockaddr_in sin; >> + struct sockaddr_in6 sin6; >> + struct sockaddr_un sun; >> + }; >> }; > > Correct one structure is > > struct __private_sock_storage { > __SOCKADDR_COMMON (ssprivate_); /* Address family, etc. */ > char __ss_padding[_SS_PADSIZE]; > __ss_aligntype __ss_align; /* Force desired alignment. */ > } What is this structure for? I expect that it's for declaring a wide-enough and correctly aligned type, but the union containing all the other types already guarantees a size as wide as any other sockaddr_* and with the widest alignment. Also, any member that is necessary for superalignment or padding could be added at the end of sockaddr_storage, after the anon union; you don't need the extra struct, I guess. Right? > > struct sockaddr_storage > { > union > { > __SOCKADDR_COMMON (ss_); /* Address family, etc. */ > struct sockaddr sa; > struct sockaddr_in sin; > struct sockaddr_in6 sin6; > struct sockaddr_un sun; > struct __private_sock_storage _private; > }; > }; > > May it could be dropped later using align construct for modern C and padding > Cheers, Alex > Bastien >> >> >> > --