diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/bits')
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/socket.h | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h index 2eb95f7e20..ef4629a743 100644 --- a/sysdeps/unix/sysv/linux/bits/socket.h +++ b/sysdeps/unix/sysv/linux/bits/socket.h @@ -27,6 +27,8 @@ #include <stddef.h> #include <sys/types.h> +#include <endian.h> +#include <bits/wordsize.h> /* Type for length arguments in socket calls. */ #ifndef __socklen_t_defined @@ -250,13 +252,32 @@ struct msghdr socklen_t msg_namelen; /* Length of address data. */ struct iovec *msg_iov; /* Vector of data to send/receive into. */ - size_t msg_iovlen; /* Number of elements in the vector. */ +#if __WORDSIZE == 64 +# if __BYTE_ORDER == __BIG_ENDIAN + int __glibc_reserved1; /* Pad to adjust Linux size to POSIX defined + size for msg_iovlen. */ + int msg_iovlen; /* Number of elements in the vector. */ +# else + int msg_iovlen; + int __glibc_reserved1; +# endif +#else + int msg_iovlen; +#endif void *msg_control; /* Ancillary data (eg BSD filedesc passing). */ - size_t msg_controllen; /* Ancillary data buffer length. - !! The type should be socklen_t but the - definition of the kernel is incompatible - with this. */ +#if __WORDSIZE == 64 +# if __BYTE_ORDER == __BIG_ENDIAN + int __glibc_reserved2; /* Pad to adjust Linux size to POSIX defined + size for msg_controllen. */ + socklen_t msg_controllen; /* Ancillary data buffer length. */ +# else + socklen_t msg_controllen; + int __glibc_reserved2; +# endif +#else + socklen_t msg_controllen; +#endif int msg_flags; /* Flags on received message. */ }; @@ -264,11 +285,19 @@ struct msghdr /* Structure used for storage of ancillary data object information. */ struct cmsghdr { - size_t cmsg_len; /* Length of data in cmsg_data plus length - of cmsghdr structure. - !! The type should be socklen_t but the - definition of the kernel is incompatible - with this. */ +#if __WORDSIZE == 64 +# if __BYTE_ORDER == __BIG_ENDIAN + int __glibc_reserved1; /* Pad toadjust Linux size to POSIX defined + size for cmsg_len. */ + socklen_t cmsg_len; /* Length of data in cmsg_data plus length + of cmsghdr structure. */ +# else + socklen_t cmsg_len; + int __glibc_reserved1; +# endif +#else + socklen_t cmsg_len; +#endif int cmsg_level; /* Originating protocol. */ int cmsg_type; /* Protocol specific type. */ #if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L |