| ... | ... | @@ -4186,18 +4186,45 @@ pub const msghdr = switch (native_os) { |
| 4186 | 4186 | else => void, |
| 4187 | 4187 | }; |
| 4188 | 4188 | |
| 4189 | /// There are several instances of struct fields that POSIX defines as either int or socklen_t, but |
| 4190 | /// on Linux are size_t. glibc ignores POSIX, and uses the Linux kernel's definitions. musl on the |
| 4191 | /// other hand aims to be POSIX-ly correct, and defines those fields in a manner aligning with |
| 4192 | /// POSIX. |
| 4193 | /// |
| 4194 | /// musl works around this incompatibility between the 64-bit Linux ABI and the POSIX specification |
| 4195 | /// by adding padding fields on either side depending on host endianness: |
| 4196 | /// |
| 4197 | /// #if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __BIG_ENDIAN |
| 4198 | /// int __pad2; |
| 4199 | /// #endif |
| 4200 | /// socklen_t msg_controllen; |
| 4201 | /// #if __LONG_MAX > 0x7fffffff && __BYTE_ORDER == __LITTLE_ENDIAN |
| 4202 | /// int __pad2; |
| 4203 | /// #endif |
| 4204 | /// |
| 4205 | /// To emulate this quirk of musl, the MuslOnlyPadding field is used in these structs |
| 4206 | /// |
| 4207 | /// pad0: MuslOnlyPadding(.big) = 0, |
| 4208 | /// msg_controllen: socklen_t, |
| 4209 | /// pad1: MuslOnlyPadding(.little) = 0, |
| 4210 | /// |
| 4211 | /// On 32-bit and non-musl systems, these fields will be zero sized, and ignored. |
| 4212 | fn MuslOnlyPadding(endian: std.builtin.Endian) type { |
| 4213 | return if (builtin.abi.isMusl() and @sizeOf(usize) == 8 and native_endian == endian) u32 else u0; |
| 4214 | } |
| 4215 | |
| 4189 | 4216 | /// https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_socket.h.html |
| 4190 | 4217 | const posix_msghdr = extern struct { |
| 4191 | 4218 | name: ?*sockaddr, |
| 4192 | 4219 | namelen: socklen_t, |
| 4193 | 4220 | iov: [*]iovec, |
| 4194 | | pad0: if (@sizeOf(usize) == 8 and native_endian == .big) u32 else u0 = 0, |
| 4221 | pad0: MuslOnlyPadding(.big) = 0, |
| 4195 | 4222 | iovlen: u32, |
| 4196 | | pad1: if (@sizeOf(usize) == 8 and native_endian == .little) u32 else u0 = 0, |
| 4223 | pad1: MuslOnlyPadding(.little) = 0, |
| 4197 | 4224 | control: ?*anyopaque, |
| 4198 | | pad2: if (@sizeOf(usize) == 8 and native_endian == .big) u32 else u0 = 0, |
| 4225 | pad2: MuslOnlyPadding(.big) = 0, |
| 4199 | 4226 | controllen: socklen_t, |
| 4200 | | pad3: if (@sizeOf(usize) == 8 and native_endian == .little) u32 else u0 = 0, |
| 4227 | pad3: MuslOnlyPadding(.little) = 0, |
| 4201 | 4228 | flags: u32, |
| 4202 | 4229 | }; |
| 4203 | 4230 | |
| ... | ... | @@ -4226,13 +4253,13 @@ const posix_msghdr_const = extern struct { |
| 4226 | 4253 | name: ?*const sockaddr, |
| 4227 | 4254 | namelen: socklen_t, |
| 4228 | 4255 | iov: [*]const iovec_const, |
| 4229 | | pad0: if (@sizeOf(usize) == 8 and native_endian == .big) u32 else u0 = 0, |
| 4256 | pad0: MuslOnlyPadding(.big) = 0, |
| 4230 | 4257 | iovlen: u32, |
| 4231 | | pad1: if (@sizeOf(usize) == 8 and native_endian == .little) u32 else u0 = 0, |
| 4258 | pad1: MuslOnlyPadding(.little) = 0, |
| 4232 | 4259 | control: ?*const anyopaque, |
| 4233 | | pad2: if (@sizeOf(usize) == 8 and native_endian == .big) u32 else u0 = 0, |
| 4260 | pad2: MuslOnlyPadding(.big) = 0, |
| 4234 | 4261 | controllen: socklen_t, |
| 4235 | | pad3: if (@sizeOf(usize) == 8 and native_endian == .little) u32 else u0 = 0, |
| 4262 | pad3: MuslOnlyPadding(.little) = 0, |
| 4236 | 4263 | flags: u32, |
| 4237 | 4264 | }; |
| 4238 | 4265 | |
| ... | ... | @@ -4276,9 +4303,9 @@ pub const cmsghdr = switch (native_os) { |
| 4276 | 4303 | }; |
| 4277 | 4304 | |
| 4278 | 4305 | const posix_cmsghdr = extern struct { |
| 4279 | | pad0: if (@sizeOf(usize) == 8 and native_endian == .big) u32 else u0 = 0, |
| 4306 | pad0: MuslOnlyPadding(.big) = 0, |
| 4280 | 4307 | len: socklen_t, |
| 4281 | | pad1: if (@sizeOf(usize) == 8 and native_endian == .little) u32 else u0 = 0, |
| 4308 | pad1: MuslOnlyPadding(.little) = 0, |
| 4282 | 4309 | level: c_int, |
| 4283 | 4310 | type: c_int, |
| 4284 | 4311 | }; |