diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/recvmsg.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/recvmsg.c | 39 |
1 files changed, 8 insertions, 31 deletions
diff --git a/sysdeps/unix/sysv/linux/recvmsg.c b/sysdeps/unix/sysv/linux/recvmsg.c index 25a319358b..14ba67e72c 100644 --- a/sysdeps/unix/sysv/linux/recvmsg.c +++ b/sysdeps/unix/sysv/linux/recvmsg.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2015-2016 Free Software Foundation, Inc. +/* Linux recvmsg syscall wrapper. + Copyright (C) 2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,35 +24,11 @@ ssize_t __libc_recvmsg (int fd, struct msghdr *msg, int flags) { - ssize_t ret; - - /* POSIX specifies that both msghdr::msg_iovlen and msghdr::msg_controllen - to be int and socklen_t respectively. However Linux defines it as - both size_t. So for 64-bit it requires some adjustments by copying to - temporary header and zeroing the pad fields. */ -#if __WORDSIZE == 64 - struct msghdr hdr, *orig = msg; - if (msg != NULL) - { - hdr = *msg; - hdr.__glibc_reserved1 = 0; - hdr.__glibc_reserved2 = 0; - msg = &hdr; - } -#endif - -#ifdef __ASSUME_RECVMSG_SYSCALL - ret = SYSCALL_CANCEL (recvmsg, fd, msg, flags); -#else - ret = SOCKETCALL_CANCEL (recvmsg, fd, msg, flags); -#endif - -#if __WORDSIZE == 64 - if (orig != NULL) - *orig = hdr; -#endif - - return ret; +# ifdef __ASSUME_RECVMSG_SYSCALL + return SYSCALL_CANCEL (recvmsg, fd, msg, flags); +# else + return SOCKETCALL_CANCEL (recvmsg, fd, msg, flags); +# endif } +weak_alias (__libc_recvmsg, recvmsg) weak_alias (__libc_recvmsg, __recvmsg) -versioned_symbol (libc, __libc_recvmsg, recvmsg, GLIBC_2_24); |