diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
61 files changed, 609 insertions, 1718 deletions
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index c26a12fa11..bfbabd4b4b 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -11,10 +11,6 @@ ifeq ($(subdir),malloc) CFLAGS-malloc.c += -DMORECORE_CLEARS=2 endif -ifeq ($(subdir),socket) -sysdep_routines += internal_accept4 internal_recvmmsg internal_sendmmsg -endif - ifeq ($(subdir),misc) include $(firstword $(wildcard $(sysdirs:=/sysctl.mk))) diff --git a/sysdeps/unix/sysv/linux/accept.S b/sysdeps/unix/sysv/linux/accept.S deleted file mode 100644 index 491ebe2ab2..0000000000 --- a/sysdeps/unix/sysv/linux/accept.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket accept -#define __socket __libc_accept -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -libc_hidden_def (accept) diff --git a/sysdeps/unix/sysv/linux/accept.c b/sysdeps/unix/sysv/linux/accept.c new file mode 100644 index 0000000000..72d42a7d85 --- /dev/null +++ b/sysdeps/unix/sysv/linux/accept.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +int +__libc_accept (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL_CANCEL (accept, fd, addr.__sockaddr__, len); +} +weak_alias (__libc_accept, accept) +libc_hidden_def (accept) diff --git a/sysdeps/unix/sysv/linux/accept4.c b/sysdeps/unix/sysv/linux/accept4.c index 5dbcef3ef0..ec6b4c236d 100644 --- a/sysdeps/unix/sysv/linux/accept4.c +++ b/sysdeps/unix/sysv/linux/accept4.c @@ -50,11 +50,14 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) return result; } #elif defined __NR_socketcall -# ifndef __ASSUME_ACCEPT4_SOCKETCALL -extern int __internal_accept4 (int fd, __SOCKADDR_ARG addr, - socklen_t *addr_len, int flags) - attribute_hidden; - +# include <socketcall.h> +# ifdef __ASSUME_ACCEPT4_SOCKETCALL +int +accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) +{ + return SOCKETCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, flags); +} +# else static int have_accept4; int @@ -62,7 +65,8 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) { if (__glibc_likely (have_accept4 >= 0)) { - int ret = __internal_accept4 (fd, addr, addr_len, flags); + int ret = SOCKETCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, + flags); /* The kernel returns -EINVAL for unknown socket operations. We need to convert that error to an ENOSYS error. */ if (__builtin_expect (ret < 0, 0) @@ -72,7 +76,7 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) /* Try another call, this time with the FLAGS parameter cleared and an invalid file descriptor. This call will not cause any harm and it will return immediately. */ - ret = __internal_accept4 (-1, addr, addr_len, 0); + ret = SOCKETCALL_CANCEL (invalid, -1); if (errno == EINVAL) { have_accept4 = -1; @@ -90,11 +94,8 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) __set_errno (ENOSYS); return -1; } -# else -/* When __ASSUME_ACCEPT4_SOCKETCALL accept4 is defined in - internal_accept4.S. */ -# endif -#else +# endif /* __ASSUME_ACCEPT4_SOCKETCALL */ +#else /* __NR_socketcall */ int accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) { diff --git a/sysdeps/unix/sysv/linux/arm/internal_accept4.S b/sysdeps/unix/sysv/linux/arm/internal_accept4.S deleted file mode 100644 index eeb5f50a26..0000000000 --- a/sysdeps/unix/sysv/linux/arm/internal_accept4.S +++ /dev/null @@ -1,6 +0,0 @@ -/* Tag_ABI_align8_preserved: This code preserves 8-byte - alignment in any callee. */ - .eabi_attribute 25, 1 -/* Tag_ABI_align8_needed: This code may require 8-byte alignment from - the caller. */ - .eabi_attribute 24, 1 diff --git a/sysdeps/unix/sysv/linux/arm/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/arm/internal_recvmmsg.S deleted file mode 100644 index eeb5f50a26..0000000000 --- a/sysdeps/unix/sysv/linux/arm/internal_recvmmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -/* Tag_ABI_align8_preserved: This code preserves 8-byte - alignment in any callee. */ - .eabi_attribute 25, 1 -/* Tag_ABI_align8_needed: This code may require 8-byte alignment from - the caller. */ - .eabi_attribute 24, 1 diff --git a/sysdeps/unix/sysv/linux/arm/internal_sendmmsg.S b/sysdeps/unix/sysv/linux/arm/internal_sendmmsg.S deleted file mode 100644 index eeb5f50a26..0000000000 --- a/sysdeps/unix/sysv/linux/arm/internal_sendmmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -/* Tag_ABI_align8_preserved: This code preserves 8-byte - alignment in any callee. */ - .eabi_attribute 25, 1 -/* Tag_ABI_align8_needed: This code may require 8-byte alignment from - the caller. */ - .eabi_attribute 24, 1 diff --git a/sysdeps/unix/sysv/linux/bind.S b/sysdeps/unix/sysv/linux/bind.S deleted file mode 100644 index 61fb5ebff8..0000000000 --- a/sysdeps/unix/sysv/linux/bind.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket bind -#define NARGS 3 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/bind.c b/sysdeps/unix/sysv/linux/bind.c new file mode 100644 index 0000000000..db72df6c77 --- /dev/null +++ b/sysdeps/unix/sysv/linux/bind.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +{ + return SOCKETCALL (bind, fd, addr.__sockaddr__, len, 0, 0, 0); +} +weak_alias (__bind, bind) diff --git a/sysdeps/unix/sysv/linux/connect.S b/sysdeps/unix/sysv/linux/connect.S deleted file mode 100644 index 21fc4a64c9..0000000000 --- a/sysdeps/unix/sysv/linux/connect.S +++ /dev/null @@ -1,7 +0,0 @@ -#define socket connect -#define __socket __libc_connect -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_connect, __connect) -libc_hidden_weak (__connect) diff --git a/sysdeps/unix/sysv/linux/connect.c b/sysdeps/unix/sysv/linux/connect.c new file mode 100644 index 0000000000..dd17e8ca97 --- /dev/null +++ b/sysdeps/unix/sysv/linux/connect.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +int +__libc_connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +{ + return SOCKETCALL_CANCEL (connect, fd, addr.__sockaddr__, len); +} +weak_alias (__libc_connect, connect) +weak_alias (__libc_connect, __connect) +libc_hidden_weak (__connect) diff --git a/sysdeps/unix/sysv/linux/getpeername.S b/sysdeps/unix/sysv/linux/getpeername.S deleted file mode 100644 index a6d8e86d4e..0000000000 --- a/sysdeps/unix/sysv/linux/getpeername.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getpeername -#define NARGS 3 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/getpeername.c b/sysdeps/unix/sysv/linux/getpeername.c new file mode 100644 index 0000000000..05fd2e8e31 --- /dev/null +++ b/sysdeps/unix/sysv/linux/getpeername.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__getpeername (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL (getpeername, fd, addr.__sockaddr__, len); +} +weak_alias (__getpeername, getpeername) diff --git a/sysdeps/unix/sysv/linux/getsockname.S b/sysdeps/unix/sysv/linux/getsockname.S deleted file mode 100644 index c138be9da5..0000000000 --- a/sysdeps/unix/sysv/linux/getsockname.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getsockname -#define NARGS 3 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/getsockname.c b/sysdeps/unix/sysv/linux/getsockname.c new file mode 100644 index 0000000000..6c84acec25 --- /dev/null +++ b/sysdeps/unix/sysv/linux/getsockname.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__getsockname (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return SOCKETCALL (getsockname, fd, addr.__sockaddr__, len); +} +weak_alias (__getsockname, getsockname) diff --git a/sysdeps/unix/sysv/linux/getsockopt.S b/sysdeps/unix/sysv/linux/getsockopt.S deleted file mode 100644 index 6f982082ae..0000000000 --- a/sysdeps/unix/sysv/linux/getsockopt.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket getsockopt -#define NARGS 5 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/getsockopt.c b/sysdeps/unix/sysv/linux/getsockopt.c new file mode 100644 index 0000000000..ba5681b410 --- /dev/null +++ b/sysdeps/unix/sysv/linux/getsockopt.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__getsockopt (int fd, int level, int optname, void *optval, socklen_t *len) +{ + return SOCKETCALL (getsockopt, fd, level, optname, optval, len); +} +weak_alias (__getsockopt, getsockopt) diff --git a/sysdeps/unix/sysv/linux/hppa/socket.S b/sysdeps/unix/sysv/linux/hppa/socket.S deleted file mode 100644 index dfbb721a82..0000000000 --- a/sysdeps/unix/sysv/linux/hppa/socket.S +++ /dev/null @@ -1,10 +0,0 @@ -#include <sysdep.h> - - .globl __socket -PSEUDO(__socket, socket, 3) - -PSEUDO_END(__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/i386/accept4.S b/sysdeps/unix/sysv/linux/i386/accept4.S deleted file mode 100644 index 6ed8395d09..0000000000 --- a/sysdeps/unix/sysv/linux/i386/accept4.S +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright (C) 1995-2015 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> -#include <tls.h> -#include <kernel-features.h> - -#define EINVAL 22 -#define ENOSYS 38 - -#ifdef __ASSUME_ACCEPT4_SOCKETCALL -# define errlabel SYSCALL_ERROR_LABEL -#else -# define errlabel .Lerr - .data -have_accept4: - .long 0 -#endif - - .text -/* The socket-oriented system calls are handled unusally in Linux/i386. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. */ - -.globl __libc_accept4 -ENTRY (__libc_accept4) -#ifdef CENABLE - SINGLE_THREAD_P - jne 1f -#endif - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - movl $SOCKOP_accept4, %ebx /* Subcode is first arg to syscall. */ - lea 4(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae errlabel - - /* Successful; return the syscall's value. */ - ret - - -#ifdef CENABLE - /* We need one more register. */ -1: pushl %esi - cfi_adjust_cfa_offset(4) - - /* Enable asynchronous cancellation. */ - CENABLE - movl %eax, %esi - cfi_offset(6, -8) /* %esi */ - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - movl $SOCKOP_accept4, %ebx /* Subcode is first arg to syscall. */ - lea 8(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* Restore the cancellation. */ - xchgl %esi, %eax - CDISABLE - - /* Restore registers. */ - movl %esi, %eax - popl %esi - cfi_restore (6) - cfi_adjust_cfa_offset(-4) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae errlabel - - /* Successful; return the syscall's value. */ - ret -#endif - -#ifndef __ASSUME_ACCEPT4_SOCKETCALL - /* The kernel returns -EINVAL for unknown socket operations. - We need to convert that error to an ENOSYS error. */ -.Lerr: cmpl $-EINVAL, %eax - jne SYSCALL_ERROR_LABEL - - /* Save registers. */ - pushl %ebx - cfi_adjust_cfa_offset(4) - cfi_offset(ebx, -8) - -# ifdef PIC - SETUP_PIC_REG (dx) - addl $_GLOBAL_OFFSET_TABLE_, %edx - movl have_accept4@GOTOFF(%edx), %eax -# else - movl have_accept4, %eax -# endif - testl %eax, %eax - jne 1f - - /* Try another call, this time with the FLAGS parameter - cleared and an invalid file descriptor. This call will not - cause any harm and it will return immediately. */ - movl $-1, 8(%esp) - movl $0, 20(%esp) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - movl $SOCKOP_accept4, %ebx /* Subcode is first arg to syscall. */ - lea 8(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - cmpl $-EINVAL, %eax - movl $-1, %eax - je 3f - movl $1, %eax -3: -# ifdef PIC - movl %eax, have_accept4@GOTOFF(%edx) -# else - movl %eax, have_accept4 -# endif - - testl %eax, %eax - -1: movl $-EINVAL, %eax - jns 2f - movl $-ENOSYS, %eax - - /* Restore registers. */ -2: popl %ebx - cfi_restore (ebx) - - jmp SYSCALL_ERROR_LABEL -#endif -PSEUDO_END (__libc_accept4) - -weak_alias (__libc_accept4, accept4) diff --git a/sysdeps/unix/sysv/linux/i386/internal_accept4.S b/sysdeps/unix/sysv/linux/i386/internal_accept4.S deleted file mode 100644 index c3f1630494..0000000000 --- a/sysdeps/unix/sysv/linux/i386/internal_accept4.S +++ /dev/null @@ -1 +0,0 @@ -/* Not needed, accept4.S has everything. */ diff --git a/sysdeps/unix/sysv/linux/i386/socket.S b/sysdeps/unix/sysv/linux/i386/socket.S deleted file mode 100644 index d87390c662..0000000000 --- a/sysdeps/unix/sysv/linux/i386/socket.S +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (C) 1995-2015 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> -#include <tls.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux/i386. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - -.globl __socket -ENTRY (__socket) -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - jne 1f -#endif - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - /* Use ## so `socket' is a separate token that might be #define'd. */ - movl $P(SOCKOP_,socket), %ebx /* Subcode is first arg to syscall. */ - lea 4(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - ret - - -#if defined NEED_CANCELLATION && defined CENABLE - /* We need one more register. */ -1: pushl %esi - cfi_adjust_cfa_offset(4) - - /* Enable asynchronous cancellation. */ - CENABLE - movl %eax, %esi - cfi_offset(6, -8) /* %esi */ - - /* Save registers. */ - movl %ebx, %edx - cfi_register (3, 2) - - movl $SYS_ify(socketcall), %eax /* System call number in %eax. */ - - /* Use ## so `socket' is a separate token that might be #define'd. */ - movl $P(SOCKOP_,socket), %ebx /* Subcode is first arg to syscall. */ - lea 8(%esp), %ecx /* Address of args is 2nd arg. */ - - /* Do the system call trap. */ - ENTER_KERNEL - - /* Restore registers. */ - movl %edx, %ebx - cfi_restore (3) - - /* Restore the cancellation. */ - xchgl %esi, %eax - CDISABLE - - /* Restore registers. */ - movl %esi, %eax - popl %esi - cfi_restore (6) - cfi_adjust_cfa_offset(-4) - - /* %eax is < 0 if there was an error. */ - cmpl $-125, %eax - jae SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - ret -#endif -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/internal_accept4.S b/sysdeps/unix/sysv/linux/internal_accept4.S deleted file mode 100644 index f0c61b55b1..0000000000 --- a/sysdeps/unix/sysv/linux/internal_accept4.S +++ /dev/null @@ -1,24 +0,0 @@ -#include <kernel-features.h> -#include <sys/syscall.h> - -/* Do not use the accept4 syscall on socketcall architectures unless - it was added at the same time as the socketcall support or can be - assumed to be present. */ -#if defined __ASSUME_SOCKETCALL \ - && !defined __ASSUME_ACCEPT4_SYSCALL_WITH_SOCKETCALL \ - && !defined __ASSUME_ACCEPT4_SYSCALL -# undef __NR_accept4 -#endif - -#if !defined __NR_accept4 && defined __NR_socketcall -# define socket accept4 -# ifdef __ASSUME_ACCEPT4_SOCKETCALL -# define __socket accept4 -# else -# define __socket __internal_accept4 -# endif -# define NARGS 4 -# define NEED_CANCELLATION -# define NO_WEAK_ALIAS -# include <socket.S> -#endif diff --git a/sysdeps/unix/sysv/linux/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/internal_recvmmsg.S deleted file mode 100644 index 6b776b9d6a..0000000000 --- a/sysdeps/unix/sysv/linux/internal_recvmmsg.S +++ /dev/null @@ -1,24 +0,0 @@ -#include <kernel-features.h> -#include <sys/syscall.h> - -/* Do not use the recvmmsg syscall on socketcall architectures unless - it was added at the same time as the socketcall support or can be - assumed to be present. */ -#if defined __ASSUME_SOCKETCALL \ - && !defined __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL \ - && !defined __ASSUME_RECVMMSG_SYSCALL -# undef __NR_recvmmsg -#endif - -#if !defined __NR_recvmmsg && defined __NR_socketcall -# define socket recvmmsg -# ifdef __ASSUME_RECVMMSG_SOCKETCALL -# define __socket recvmmsg -# else -# define __socket __internal_recvmmsg -# endif -# define NARGS 5 -# define NEED_CANCELLATION -# define NO_WEAK_ALIAS -# include <socket.S> -#endif diff --git a/sysdeps/unix/sysv/linux/internal_sendmmsg.S b/sysdeps/unix/sysv/linux/internal_sendmmsg.S deleted file mode 100644 index 4d903ea729..0000000000 --- a/sysdeps/unix/sysv/linux/internal_sendmmsg.S +++ /dev/null @@ -1,25 +0,0 @@ -#include <kernel-features.h> -#include <sys/syscall.h> - -/* Do not use the sendmmsg syscall on socketcall architectures unless - it was added at the same time as the socketcall support or can be - assumed to be present. */ -#if defined __ASSUME_SOCKETCALL \ - && !defined __ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL \ - && !defined __ASSUME_SENDMMSG_SYSCALL -# undef __NR_sendmmsg -#endif - -#if !defined __NR_sendmmsg && defined __NR_socketcall -# define socket sendmmsg -# ifndef __ASSUME_SENDMMSG_SOCKETCALL -# define __socket __internal_sendmmsg -# define NO_WEAK_ALIAS -# endif -# define NARGS 4 -# define NEED_CANCELLATION -# include <socket.S> -# ifdef __ASSUME_SENDMMSG_SOCKETCALL -libc_hidden_def (__sendmmsg) -# endif -#endif diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index 2ca6f101ec..8f09459b1c 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -41,9 +41,8 @@ #define __ASSUME_SENDFILE 1 /* Some architectures use the socketcall multiplexer for some or all - socket-related operations, via a socket.S file in glibc, instead of - separate syscalls. __ASSUME_SOCKETCALL is defined for such - architectures. */ + socket-related operations instead of separate syscalls. + __ASSUME_SOCKETCALL is defined for such architectures. */ /* Linux 2.3.39 introduced IPC64. Except for powerpc. Linux 2.4.0 on PPC introduced a correct IPC64. But PowerPC64 does not support a diff --git a/sysdeps/unix/sysv/linux/listen.S b/sysdeps/unix/sysv/linux/listen.S deleted file mode 100644 index bed6a05f25..0000000000 --- a/sysdeps/unix/sysv/linux/listen.S +++ /dev/null @@ -1,5 +0,0 @@ -#define socket listen -#define NARGS 2 -#define NO_WEAK_ALIAS 1 -#include <socket.S> -weak_alias (listen, __listen) diff --git a/sysdeps/unix/sysv/linux/listen.c b/sysdeps/unix/sysv/linux/listen.c new file mode 100644 index 0000000000..2e387a492c --- /dev/null +++ b/sysdeps/unix/sysv/linux/listen.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +listen (int fd, int backlog) +{ + return SOCKETCALL (listen, fd, backlog); +} +weak_alias (listen, __listen); diff --git a/sysdeps/unix/sysv/linux/m68k/socket.S b/sysdeps/unix/sysv/linux/m68k/socket.S deleted file mode 100644 index c1dc14c2fd..0000000000 --- a/sysdeps/unix/sysv/linux/m68k/socket.S +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (C) 1996-2015 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -.globl __socket -ENTRY (__socket) -#ifdef NEED_CANCELLATION -# if !defined CENABLE || !defined CDISABLE -# error CENABLE and/or CDISABLE is not defined -# endif - SINGLE_THREAD_P - jne 1f -#endif - - /* Save registers. */ - move.l %d2, %a0 - cfi_register (%d2, %a0) - - move.l #SYS_ify (socketcall), %d0 /* System call number in %d0. */ - - /* Use ## so `socket' is a separate token that might be #define'd. */ - move.l #P (SOCKOP_,socket), %d1 /* Subcode is first arg to syscall. */ - lea 4(%sp), %a1 /* Address of args is 2nd arg. */ - move.l %a1, %d2 - - /* Do the system call trap. */ - trap #0 - - /* Restore registers. */ - move.l %a0, %d2 - cfi_restore (%d2) - - /* %d0 is < 0 if there was an error. */ - tst.l %d0 - jmi SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - rts - -#ifdef NEED_CANCELLATION -1: /* Enable asynchronous cancellation. */ - CENABLE - - /* Save D2. */ - move.l %d2, -(%sp) - cfi_adjust_cfa_offset (4) - cfi_rel_offset (%d2, 0) - - /* Save the result of CENABLE. */ - move.l %d0, -(%sp) - cfi_adjust_cfa_offset (4) - - /* Use ## so `socket' is a separate token that might be #define'd. */ - move.l #P (SOCKOP_,socket), %d1 /* Subcode is first arg to syscall. */ - lea 4+8(%sp), %a1 /* Address of args is 2nd arg. */ - move.l %a1, %d2 - - move.l #SYS_ify (socketcall), %d0 /* System call number in %d0. */ - /* Do the system call trap. */ - trap #0 - - /* Restore cancellation. */ - move.l %d0, %d2 - CDISABLE - addq.l #4, %sp - cfi_adjust_cfa_offset (-4) - move.l %d2, %d0 - - /* Restore registers. */ - move.l (%sp)+, %d2 - cfi_adjust_cfa_offset (-4) - cfi_restore (%d2) - - /* %d0 is < 0 if there was an error. */ - tst.l %d0 - jmi SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - rts -#endif - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/microblaze/socket.S b/sysdeps/unix/sysv/linux/microblaze/socket.S deleted file mode 100644 index a3b40484fd..0000000000 --- a/sysdeps/unix/sysv/linux/microblaze/socket.S +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (C) 2009-2015 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 - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. - They also #define a 'number-of-arguments' word in NARGS, which - defaults to 3. */ - -#ifndef NARGS -# ifdef socket -# error NARGS not defined -# endif -# define NARGS 3 -#endif - -/* Stack usage: - 0 - r15 (return address) - 4 - 12 args to syscall - 16 - scratch for cancellation state - 20 - scratch for return value -*/ -#define stackadjust 24 - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .text -ENTRY(__socket) - addik r1,r1,-stackadjust - swi r15,r1,0 -#if NARGS >= 1 - swi r5,r1,stackadjust+4 -#endif -#if NARGS >= 2 - swi r6,r1,stackadjust+8 -#endif -#if NARGS >= 3 - swi r7,r1,stackadjust+12 -#endif -#if NARGS >= 4 - swi r8,r1,stackadjust+16 -#endif -#if NARGS >= 5 - swi r9,r1,stackadjust+20 -#endif -#if NARGS >= 6 - swi r10,r1,stackadjust+24 -#endif -/* The rest of the args (if any) are on the caller's stack already. */ - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P(r12) - bnei r12,L(socket_cancel) -#endif - - addik r12,r0,SYS_ify(socketcall) - addik r5,r0,P(SOCKOP_,socket) - addik r6,r1,stackadjust+4 - brki r14,8 - addk r0,r0,r0 - lwi r15,r1,0 - addik r1,r1,stackadjust - addik r4,r0,-4095 - cmpu r4,r4,r3 - bgei r4,SYSCALL_ERROR_LABEL - rtsd r15,8 - addk r0,r0,r0 - -#if defined NEED_CANCELLATION && defined CENABLE -L(socket_cancel): - CENABLE - swi r3,r1,16 - addik r12,r0,SYS_ify(socketcall) - addik r5,r0,P(SOCKOP_,socket) - addik r6,r1,stackadjust+4 - brki r14,8 - addk r0,r0,r0 - swi r3,r1,20 - lwi r5,r1,16 - CDISABLE - lwi r3,r1,20 - lwi r15,r1,0 - addik r1,r1,stackadjust - addik r4,r0,-4095 - cmpu r4,r4,r3 - bgei r4,SYSCALL_ERROR_LABEL - rtsd r15,8 - addk r0,r0,r0 -#endif - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips32/internal_accept4.S b/sysdeps/unix/sysv/linux/mips/mips32/internal_accept4.S deleted file mode 100644 index 30434d7334..0000000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/internal_accept4.S +++ /dev/null @@ -1,2 +0,0 @@ -/* MIPS does not have socket.S and the socketcall syscall should - generally be avoided, though it exists. */ diff --git a/sysdeps/unix/sysv/linux/mips/mips32/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/mips/mips32/internal_recvmmsg.S deleted file mode 100644 index 30434d7334..0000000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/internal_recvmmsg.S +++ /dev/null @@ -1,2 +0,0 @@ -/* MIPS does not have socket.S and the socketcall syscall should - generally be avoided, though it exists. */ diff --git a/sysdeps/unix/sysv/linux/mips/mips32/internal_sendmmsg.S b/sysdeps/unix/sysv/linux/mips/mips32/internal_sendmmsg.S deleted file mode 100644 index 30434d7334..0000000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/internal_sendmmsg.S +++ /dev/null @@ -1,2 +0,0 @@ -/* MIPS does not have socket.S and the socketcall syscall should - generally be avoided, though it exists. */ diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S deleted file mode 100644 index 7dc59b470f..0000000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/socket.S +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 1995-2015 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. - They also #define a 'number-of-arguments' word in NARGS, which - defaults to 3. */ - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - -/* 0(r1) and 4(r1) are reserved by the ABI, 8(r1), 12(r1), 16(r1) are used - for temp saves. 44(r1) is used to save r30. */ -#define stackblock 20 - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .text -ENTRY(__socket) - stwu r1,-48(r1) - cfi_adjust_cfa_offset(48) -#if NARGS >= 1 - stw r3,stackblock(r1) -#endif -#if NARGS >= 2 - stw r4,4+stackblock(r1) -#endif -#if NARGS >= 3 - stw r5,8+stackblock(r1) -#endif -#if NARGS >= 4 - stw r6,12+stackblock(r1) -#endif -#if NARGS >= 5 - stw r7,16+stackblock(r1) -#endif -#if NARGS >= 6 - stw r8,20+stackblock(r1) -#endif -#if NARGS >= 7 -#error too many arguments! -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - bne- .Lsocket_cancel -#endif - - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - addi r1,r1,48 - PSEUDO_RET - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - mflr r9 - stw r9,52(r1) - cfi_offset (lr, 4) - CENABLE - stw r3,16(r1) - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - mfcr r0 - stw r3,8(r1) - stw r0,12(r1) - lwz r3,16(r1) - CDISABLE - lwz r4,52(r1) - lwz r0,12(r1) - lwz r3,8(r1) - mtlr r4 - mtcr r0 - addi r1,r1,48 - PSEUDO_RET -#endif - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S deleted file mode 100644 index 102844416c..0000000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright (C) 1995-2015 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 - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. - They also #define a 'number-of-arguments' word in NARGS, which - defaults to 3. */ - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - -#if _CALL_ELF == 2 -#define FRAMESIZE (FRAME_MIN_SIZE+16+64) -#define stackblock (FRAME_MIN_SIZE+16) -#else -#define FRAMESIZE (FRAME_MIN_SIZE+16) -#define stackblock (FRAMESIZE+FRAME_PARM_SAVE) /* offset to parm save area. */ -#endif - - .text -ENTRY(__socket) - CALL_MCOUNT NARGS - stdu r1,-FRAMESIZE(r1) - cfi_adjust_cfa_offset(FRAMESIZE) -#if NARGS >= 1 - std r3,stackblock(r1) -#endif -#if NARGS >= 2 - std r4,8+stackblock(r1) -#endif -#if NARGS >= 3 - std r5,16+stackblock(r1) -#endif -#if NARGS >= 4 - std r6,24+stackblock(r1) -#endif -#if NARGS >= 5 - std r7,32+stackblock(r1) -#endif -#if NARGS >= 6 - std r8,40+stackblock(r1) -#endif -#if NARGS >= 7 - std r9,48+stackblock(r1) -#endif -#if NARGS >= 8 - std r10,56+stackblock(r1) -#endif -#if NARGS >= 9 -#error too many arguments! -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - bne- .Lsocket_cancel -#endif - - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - addi r1,r1,FRAMESIZE - cfi_adjust_cfa_offset(-FRAMESIZE) - PSEUDO_RET - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - cfi_adjust_cfa_offset(FRAMESIZE) - mflr r9 - std r9,FRAMESIZE+FRAME_LR_SAVE(r1) - cfi_offset (lr, FRAME_LR_SAVE) - CENABLE - std r3,FRAME_MIN_SIZE+8(r1) - li r3,P(SOCKOP_,socket) - addi r4,r1,stackblock - DO_CALL(SYS_ify(socketcall)) - mfcr r0 - std r3,FRAME_MIN_SIZE(r1) - std r0,FRAMESIZE+FRAME_CR_SAVE(r1) - cfi_offset (cr, FRAME_CR_SAVE) - ld r3,FRAME_MIN_SIZE+8(r1) - CDISABLE - ld r4,FRAMESIZE+FRAME_LR_SAVE(r1) - ld r0,FRAMESIZE+FRAME_CR_SAVE(r1) - ld r3,FRAME_MIN_SIZE(r1) - mtlr r4 - mtcr r0 - addi r1,r1,FRAMESIZE - cfi_adjust_cfa_offset(-FRAMESIZE) - cfi_restore(lr) - cfi_restore(cr) - PSEUDO_RET -#endif -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/recv.S b/sysdeps/unix/sysv/linux/recv.S deleted file mode 100644 index 331844abc1..0000000000 --- a/sysdeps/unix/sysv/linux/recv.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket recv -#define __socket __libc_recv -#define NARGS 4 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_recv, __recv) diff --git a/sysdeps/unix/sysv/linux/recv.c b/sysdeps/unix/sysv/linux/recv.c new file mode 100644 index 0000000000..d2e80d5a80 --- /dev/null +++ b/sysdeps/unix/sysv/linux/recv.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_recv (int fd, void *buf, size_t len, int flags) +{ + return SOCKETCALL_CANCEL (recv, fd, buf, len, flags); +} +weak_alias (__libc_recv, recv) +weak_alias (__libc_recv, __recv) diff --git a/sysdeps/unix/sysv/linux/recvfrom.S b/sysdeps/unix/sysv/linux/recvfrom.S deleted file mode 100644 index ccbb0a75da..0000000000 --- a/sysdeps/unix/sysv/linux/recvfrom.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket recvfrom -#define __socket __libc_recvfrom -#define NARGS 6 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_recvfrom, __recvfrom) diff --git a/sysdeps/unix/sysv/linux/recvfrom.c b/sysdeps/unix/sysv/linux/recvfrom.c new file mode 100644 index 0000000000..90eb40d603 --- /dev/null +++ b/sysdeps/unix/sysv/linux/recvfrom.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_recvfrom (int fd, void *buf, size_t len, int flags, + __SOCKADDR_ARG addr, socklen_t *addrlen) +{ + return SOCKETCALL_CANCEL (recvfrom, fd, buf, len, flags, addr.__sockaddr__, + addrlen); +} +weak_alias (__libc_recvfrom, recvfrom) +weak_alias (__libc_recvfrom, __recvfrom) diff --git a/sysdeps/unix/sysv/linux/recvmmsg.c b/sysdeps/unix/sysv/linux/recvmmsg.c index c3a4874447..1f9f04d360 100644 --- a/sysdeps/unix/sysv/linux/recvmmsg.c +++ b/sysdeps/unix/sysv/linux/recvmmsg.c @@ -49,12 +49,15 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, return result; } #elif defined __NR_socketcall -# ifndef __ASSUME_RECVMMSG_SOCKETCALL -extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages, - unsigned int vlen, int flags, - struct timespec *tmo) - attribute_hidden; - +# include <socketcall.h> +# ifdef __ASSUME_RECVMMSG_SOCKETCALL +int +recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, + struct timespec *tmo) +{ + return SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo); +} +# else static int have_recvmmsg; int @@ -63,7 +66,8 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, { if (__glibc_likely (have_recvmmsg >= 0)) { - int ret = __internal_recvmmsg (fd, vmessages, vlen, flags, tmo); + int ret = SOCKETCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, + tmo); /* The kernel returns -EINVAL for unknown socket operations. We need to convert that error to an ENOSYS error. */ if (__builtin_expect (ret < 0, 0) @@ -74,7 +78,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, descriptor and all other parameters cleared. This call will not cause any harm and it will return immediately. */ - ret = __internal_recvmmsg (-1, 0, 0, 0, 0); + ret = SOCKETCALL_CANCEL (invalid, -1); if (errno == EINVAL) { have_recvmmsg = -1; @@ -92,10 +96,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, __set_errno (ENOSYS); return -1; } -# else -/* When __ASSUME_RECVMMSG_SOCKETCALL recvmmsg is defined in - internal_recvmmsg.S. */ -# endif +# endif /* __ASSUME_RECVMMSG_SOCKETCALL */ #else # include <socket/recvmmsg.c> #endif diff --git a/sysdeps/unix/sysv/linux/recvmsg.S b/sysdeps/unix/sysv/linux/recvmsg.S deleted file mode 100644 index d44bc39f92..0000000000 --- a/sysdeps/unix/sysv/linux/recvmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket recvmsg -#define __socket __libc_recvmsg -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_recvmsg, __recvmsg) diff --git a/sysdeps/unix/sysv/linux/recvmsg.c b/sysdeps/unix/sysv/linux/recvmsg.c new file mode 100644 index 0000000000..cd7c9ca581 --- /dev/null +++ b/sysdeps/unix/sysv/linux/recvmsg.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_recvmsg (int fd, struct msghdr *msg, int flags) +{ + return SOCKETCALL_CANCEL (recvmsg, fd, msg, flags); +} +weak_alias (__libc_recvmsg, recvmsg) +weak_alias (__libc_recvmsg, __recvmsg) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/socket.S b/sysdeps/unix/sysv/linux/s390/s390-32/socket.S deleted file mode 100644 index 4611e52f24..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-32/socket.S +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (C) 2000-2015 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -/* &%/$&!! preprocessor */ -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -#ifndef NARGS /* the socket.o object is compiled directly ... */ -#define NARGS 3 -#endif - -.globl __socket -ENTRY(__socket) - /* Save registers and setup stack. */ - stm %r6,%r15,24(%r15) /* save registers */ - cfi_offset (%r15, -36) - cfi_offset (%r14, -40) - cfi_offset (%r13, -44) - cfi_offset (%r12, -48) - cfi_offset (%r11, -52) - cfi_offset (%r10, -56) - cfi_offset (%r9, -60) - cfi_offset (%r8, -64) - cfi_offset (%r7, -68) - cfi_offset (%r6, -72) - lr %r1,%r15 - l %r0,4(0,%r15) /* load eos */ - ahi %r15,-120 /* buy stack space */ - cfi_adjust_cfa_offset (120) - st %r1,0(0,%r15) /* store back chain */ - st %r0,4(0,%r15) /* store eos */ - - /* Reorder arguments */ -#if (NARGS >= 6) - mvc 0x74(4,%r15),216(%r15) /* move between parameter lists */ -#endif -#if (NARGS >= 5) - st %r6,0x70(0,%r15) /* store into parameter list */ -#endif -#if (NARGS >= 4) - st %r5,0x6C(0,%r15) /* store into parameter list */ -#endif -#if (NARGS >= 3) - st %r4,0x68(0,%r15) /* store into parameter list */ -#endif -#if (NARGS >= 2) - st %r3,0x64(0,%r15) /* store into parameter list */ - st %r2,0x60(0,%r15) -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P (%r4) - jne L(socket_cancel) -#endif - - /* load subcode for socket syscall */ - lhi %r2,P(SOCKOP_,socket) - la %r3,0x60(0,%r15) /* load address of parameter list */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - -4: - l %r15,0(0,%r15) /* load back chain */ - lm %r6,15,24(%r15) /* load registers */ - - /* gpr2 is < 0 if there was an error. */ - lhi %r0,-125 - clr %r2,%r0 - jnl SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - br %r14 - -#if defined NEED_CANCELLATION && defined CENABLE -L(socket_cancel): - basr %r13,0 -1: l %r1,2f-1b(%r13) - /* call CENABLE. */ - bas %r14,0(%r13,%r1) - lr %r0,%r2 - - /* load subcode for socket syscall */ - lhi %r2,P(SOCKOP_,socket) - la %r3,0x60(0,%r15) /* load address of parameter list */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - - l %r3,3f-1b(%r13) - lr %r12,%r2 - lr %r2,%r0 - /* call CDISABLE. */ - bas %r14,0(%r13,%r3) - lr %r2,%r12 - j 4b - -2: .long CENABLE-1b -3: .long CDISABLE-1b -#endif - - SYSCALL_ERROR_HANDLER -END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S b/sysdeps/unix/sysv/linux/s390/s390-64/socket.S deleted file mode 100644 index 26b39f9611..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-64/socket.S +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright (C) 2001-2015 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -/* &%/$&!! preprocessor */ -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -#ifndef NARGS /* The socket.o object is compiled directly ... */ -#define NARGS 3 -#endif - -.globl __socket -ENTRY(__socket) - /* Save registers and setup stack. */ - stmg %r6,%r15,48(%r15) /* Save registers. */ - cfi_offset (%r15,-40) - cfi_offset (%r14,-48) - cfi_offset (%r13,-56) - cfi_offset (%r12,-64) - cfi_offset (%r11,-72) - cfi_offset (%r10,-80) - cfi_offset (%r9,-88) - cfi_offset (%r8,-96) - cfi_offset (%r7,-104) - cfi_offset (%r6,-112) - lgr %r1,%r15 - lg %r0,8(%r15) /* Load eos. */ - aghi %r15,-208 /* Buy stack space. */ - cfi_adjust_cfa_offset (208) - stg %r1,0(%r15) /* Store back chain. */ - stg %r0,8(%r15) /* Store eos. */ - - /* Reorder arguments. */ -#if (NARGS >= 6) - mvc 200(8,%r15),368(%r15) /* Move between parameter lists. */ -#endif -#if (NARGS >= 5) - stg %r6,192(%r15) /* Store into parameter list. */ -#endif -#if (NARGS >= 4) - stg %r5,184(%r15) /* Store into parameter list. */ -#endif -#if (NARGS >= 3) - stg %r4,176(%r15) /* Store into parameter list. */ -#endif -#if (NARGS >= 2) - stg %r3,168(%r15) /* Store into parameter list. */ - stg %r2,160(%r15) -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - jne L(socket_cancel) -#endif - - /* Load subcode for socket syscall. */ - lghi %r2,P(SOCKOP_,socket) - la %r3,160(%r15) /* Load address of parameter list. */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - -4: - lg %r15,0(%r15) /* Load back chain. */ - lmg %r6,15,48(%r15) /* Load registers. */ - - /* gpr2 is < 0 if there was an error. */ - lghi %r0,-125 - clgr %r2,%r0 - jgnl SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - br %r14 - -#if defined NEED_CANCELLATION && defined CENABLE -L(socket_cancel): - brasl %r14,CENABLE - lr %r0,%r2 - - /* Load subcode for socket syscall. */ - lghi %r2,P(SOCKOP_,socket) - la %r3,160(%r15) /* Load address of parameter list. */ - - /* Do the system call trap. */ - svc SYS_ify(socketcall) - - lgr %r12,%r2 - lr %r2,%r0 - brasl %r14,CDISABLE - - lgr %r2,%r12 - j 4b -#endif - - SYSCALL_ERROR_HANDLER -END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif - diff --git a/sysdeps/unix/sysv/linux/send.S b/sysdeps/unix/sysv/linux/send.S deleted file mode 100644 index 259748f44c..0000000000 --- a/sysdeps/unix/sysv/linux/send.S +++ /dev/null @@ -1,7 +0,0 @@ -#define socket send -#define __socket __libc_send -#define NARGS 4 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_send, __send) -libc_hidden_def (__send) diff --git a/sysdeps/unix/sysv/linux/send.c b/sysdeps/unix/sysv/linux/send.c new file mode 100644 index 0000000000..f87ea86672 --- /dev/null +++ b/sysdeps/unix/sysv/linux/send.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_send (int fd, const void *buf, size_t len, int flags) +{ + return SOCKETCALL_CANCEL (send, fd, buf, len, flags); +} +weak_alias (__libc_send, send) +weak_alias (__libc_send, __send) +libc_hidden_def (__send) diff --git a/sysdeps/unix/sysv/linux/sendmmsg.c b/sysdeps/unix/sysv/linux/sendmmsg.c index a95aff19ef..e535cc0207 100644 --- a/sysdeps/unix/sysv/linux/sendmmsg.c +++ b/sysdeps/unix/sysv/linux/sendmmsg.c @@ -50,11 +50,14 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) libc_hidden_def (__sendmmsg) weak_alias (__sendmmsg, sendmmsg) #elif defined __NR_socketcall -# ifndef __ASSUME_SENDMMSG_SOCKETCALL -extern int __internal_sendmmsg (int fd, struct mmsghdr *vmessages, - unsigned int vlen, int flags) - attribute_hidden; - +# include <socketcall.h> +# ifdef __ASSUME_SENDMMSG_SOCKETCALL +int +__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) +{ + return SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags); +} +# else static int have_sendmmsg; int @@ -62,7 +65,7 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) { if (__glibc_likely (have_sendmmsg >= 0)) { - int ret = __internal_sendmmsg (fd, vmessages, vlen, flags); + int ret = SOCKETCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags); /* The kernel returns -EINVAL for unknown socket operations. We need to convert that error to an ENOSYS error. */ if (__builtin_expect (ret < 0, 0) @@ -73,7 +76,7 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) descriptor and all other parameters cleared. This call will not cause any harm and it will return immediately. */ - ret = __internal_sendmmsg (-1, 0, 0, 0); + ret = SOCKETCALL_CANCEL (invalid, -1); if (errno == EINVAL) { have_sendmmsg = -1; @@ -91,12 +94,9 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) __set_errno (ENOSYS); return -1; } +# endif /* __ASSUME_SENDMMSG_SOCKETCALL */ libc_hidden_def (__sendmmsg) weak_alias (__sendmmsg, sendmmsg) -# else -/* When __ASSUME_SENDMMSG_SOCKETCALL sendmmsg is defined in - internal_sendmmsg.S. */ -# endif #else # include <socket/sendmmsg.c> #endif diff --git a/sysdeps/unix/sysv/linux/sendmsg.S b/sysdeps/unix/sysv/linux/sendmsg.S deleted file mode 100644 index a220894cc6..0000000000 --- a/sysdeps/unix/sysv/linux/sendmsg.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket sendmsg -#define __socket __libc_sendmsg -#define NARGS 3 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_sendmsg, __sendmsg) diff --git a/sysdeps/unix/sysv/linux/sendmsg.c b/sysdeps/unix/sysv/linux/sendmsg.c new file mode 100644 index 0000000000..e69ac3e1b7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sendmsg.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_sendmsg (int fd, const struct msghdr *msg, int flags) +{ + return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags); +} +weak_alias (__libc_sendmsg, sendmsg) +weak_alias (__libc_sendmsg, __sendmsg) diff --git a/sysdeps/unix/sysv/linux/sendto.S b/sysdeps/unix/sysv/linux/sendto.S deleted file mode 100644 index a65e44fb61..0000000000 --- a/sysdeps/unix/sysv/linux/sendto.S +++ /dev/null @@ -1,6 +0,0 @@ -#define socket sendto -#define __socket __libc_sendto -#define NARGS 6 -#define NEED_CANCELLATION -#include <socket.S> -weak_alias (__libc_sendto, __sendto) diff --git a/sysdeps/unix/sysv/linux/sendto.c b/sysdeps/unix/sysv/linux/sendto.c new file mode 100644 index 0000000000..d2896a60ec --- /dev/null +++ b/sysdeps/unix/sysv/linux/sendto.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <sysdep-cancel.h> +#include <socketcall.h> + +ssize_t +__libc_sendto (int fd, const void *buf, size_t len, int flags, + __CONST_SOCKADDR_ARG addr, socklen_t addrlen) +{ + return SOCKETCALL_CANCEL (sendto, fd, buf, len, flags, addr.__sockaddr__, + addrlen); +} +weak_alias (__libc_sendto, sendto) +weak_alias (__libc_sendto, __sendto) diff --git a/sysdeps/unix/sysv/linux/setsockopt.S b/sysdeps/unix/sysv/linux/setsockopt.S deleted file mode 100644 index 4e40ccba57..0000000000 --- a/sysdeps/unix/sysv/linux/setsockopt.S +++ /dev/null @@ -1,5 +0,0 @@ -#define socket setsockopt -#define NARGS 5 -#define NO_WEAK_ALIAS 1 -#include <socket.S> -weak_alias (setsockopt, __setsockopt) diff --git a/sysdeps/unix/sysv/linux/setsockopt.c b/sysdeps/unix/sysv/linux/setsockopt.c new file mode 100644 index 0000000000..626c55b5a5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/setsockopt.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +setsockopt (int fd, int level, int optname, const void *optval, socklen_t len) +{ + return SOCKETCALL (setsockopt, fd, level, optname, optval, len); +} +weak_alias (setsockopt, __setsockopt) diff --git a/sysdeps/unix/sysv/linux/sh/socket.S b/sysdeps/unix/sysv/linux/sh/socket.S deleted file mode 100644 index ee99e840c1..0000000000 --- a/sysdeps/unix/sysv/linux/sh/socket.S +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright (C) 1999-2015 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> -#include <tls.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusally in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -#ifndef NO_WEAK_ALIAS -#define __socket P(__,socket) -#else -#define __socket socket -#endif -#endif - -#define PUSHARGS_1 mov.l r4,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r4, 0) -#define PUSHARGS_2 mov.l r5,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r5, 0); \ - PUSHARGS_1 -#define PUSHARGS_3 mov.l r6,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r6, 0); \ - PUSHARGS_2 -#define PUSHARGS_4 mov.l r7,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r7, 0); \ - PUSHARGS_3 -#define PUSHARGS_5 PUSHARGS_4 /* Caller has already pushed arg 5 */ -#define PUSHARGS_6 PUSHARGS_4 /* Caller has already pushed arg 5,6 */ - -#define POPARGS_1 add #4,r15; cfi_adjust_cfa_offset (-4) -#define POPARGS_2 add #8,r15; cfi_adjust_cfa_offset (-8) -#define POPARGS_3 add #12,r15; cfi_adjust_cfa_offset (-12) -#define POPARGS_4 add #16,r15; cfi_adjust_cfa_offset (-16) -#define POPARGS_5 POPARGS_4 -#define POPARGS_6 POPARGS_4 - -#define ADJUSTCFI_1 cfi_adjust_cfa_offset (4); \ - cfi_offset (r4, -4) -#define ADJUSTCFI_2 cfi_adjust_cfa_offset (8); \ - cfi_offset (r4, -4); \ - cfi_offset (r5, -8) -#define ADJUSTCFI_3 cfi_adjust_cfa_offset (12); \ - cfi_offset (r4, -4); \ - cfi_offset (r5, -8); \ - cfi_offset (r6, -12) -#define ADJUSTCFI_4 cfi_adjust_cfa_offset (16); \ - cfi_offset (r4, -4); \ - cfi_offset (r5, -8); \ - cfi_offset (r6, -12); \ - cfi_offset (r7, -16) -#define ADJUSTCFI_5 ADJUSTCFI_4 -#define ADJUSTCFI_6 ADJUSTCFI_4 - -#ifndef NARGS -/* If we were called with no wrapper, this is really socket(). */ -#define NARGS 3 -#endif - -.globl __socket -ENTRY (__socket) - /* This will not work in the case of a socket call being interrupted - by a signal. If the signal handler uses any stack the arguments - to socket will be trashed. The results of a restart of any - socket call are then unpredictable. */ - - /* Push args onto the stack. */ - P(PUSHARGS_,NARGS) - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - bf .Lsocket_cancel -#endif - - /* Do the system call trap. */ - mov #+P(SOCKOP_,socket), r4 - mov r15, r5 - mov.l .L1,r3 - trapa #0x12 - - /* Pop args off the stack */ - P(POPARGS_,NARGS) - - mov r0, r1 - mov #-12, r2 - shad r2, r1 - not r1, r1 // r1=0 means r0 = -1 to -4095 - tst r1, r1 // i.e. error in linux - bf .Lpseudo_end -.Lsyscall_error: - SYSCALL_ERROR_HANDLER -.Lpseudo_end: - /* Successful; return the syscall's value. */ - rts - nop - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - /* Enable asynchronous cancellation. */ - P(ADJUSTCFI_,NARGS) - sts.l pr,@-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (pr, 0) - CENABLE - lds.l @r15+,pr - cfi_adjust_cfa_offset (-4) - cfi_restore (pr) - - /* Do the system call trap. */ - mov #+P(SOCKOP_,socket), r4 - mov r15, r5 - mov.l .L1,r3 - trapa #0x12 - - sts.l pr,@-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (pr, 0) - mov.l r0,@-r15 - cfi_adjust_cfa_offset (4) - cfi_rel_offset (r0, 0) - CDISABLE - mov.l @r15+,r0 - cfi_adjust_cfa_offset (-4) - cfi_restore (r0) - lds.l @r15+,pr - cfi_adjust_cfa_offset (-4) - cfi_restore (pr) - - /* Pop args off the stack */ - P(POPARGS_,NARGS) - - mov r0, r1 - mov #-12, r2 - shad r2, r1 - not r1, r1 // r1=0 means r0 = -1 to -4095 - tst r1, r1 // i.e. error in linux - bf .Lpseudo_end - bra .Lsyscall_error - nop -#endif - - .align 2 -.L1: - .long SYS_ify(socketcall) - -PSEUDO_END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/shutdown.S b/sysdeps/unix/sysv/linux/shutdown.S deleted file mode 100644 index e2462d0eca..0000000000 --- a/sysdeps/unix/sysv/linux/shutdown.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket shutdown -#define NARGS 2 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/shutdown.c b/sysdeps/unix/sysv/linux/shutdown.c new file mode 100644 index 0000000000..8b3a3d87f5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/shutdown.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__shutdown (int fd, int how) +{ + return SOCKETCALL (shutdown, fd, how); +} +weak_alias (__shutdown, shutdown) diff --git a/sysdeps/unix/sysv/linux/socket.c b/sysdeps/unix/sysv/linux/socket.c new file mode 100644 index 0000000000..fcb4775c6b --- /dev/null +++ b/sysdeps/unix/sysv/linux/socket.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__socket (int fd, int type, int domain) +{ + return SOCKETCALL (socket, fd, type, domain); +} +weak_alias (__socket, socket) diff --git a/sysdeps/unix/sysv/linux/socketcall.h b/sysdeps/unix/sysv/linux/socketcall.h index e59067d34c..f652239ef3 100644 --- a/sysdeps/unix/sysv/linux/socketcall.h +++ b/sysdeps/unix/sysv/linux/socketcall.h @@ -25,6 +25,7 @@ We cannot use an enum here because the values are used in assembler code. */ +#define SOCKOP_invalid -1 #define SOCKOP_socket 1 #define SOCKOP_bind 2 #define SOCKOP_connect 3 @@ -46,4 +47,58 @@ #define SOCKOP_recvmmsg 19 #define SOCKOP_sendmmsg 20 +#define __SOCKETCALL1(name, a1) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [1]) { (long int) (a1) })) +#define __SOCKETCALL2(name, a1, a2) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [2]) { (long int) (a1), (long int) (a2) })) +#define __SOCKETCALL3(name, a1, a2, a3) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [3]) { (long int) (a1), (long int) (a2), (long int) (a3) })) +#define __SOCKETCALL4(name, a1, a2, a3, a4) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [4]) { (long int) (a1), (long int) (a2), (long int) (a3), \ + (long int) (a4) })) +#define __SOCKETCALL5(name, a1, a2, a3, a4, a5) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [5]) { (long int) (a1), (long int) (a2), (long int) (a3), \ + (long int) (a4), (long int) (a5) })) +#define __SOCKETCALL6(name, a1, a2, a3, a4, a5, a6) \ + INLINE_SYSCALL (socketcall, 2, name, \ + ((long int [6]) { (long int) (a1), (long int) (a2), (long int) (a3), \ + (long int) (a4), (long int) (a5), (long int) (a6) })) + +#define __SOCKETCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n +#define __SOCKETCALL_NARGS(...) \ + __SOCKETCALL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,) +#define __SOCKETCALL_CONCAT_X(a,b) a##b +#define __SOCKETCALL_CONCAT(a,b) __SOCKETCALL_CONCAT_X (a, b) +#define __SOCKETCALL_DISP(b,...) \ + __SOCKETCALL_CONCAT (b,__SOCKETCALL_NARGS(__VA_ARGS__))(__VA_ARGS__) + +#define __SOCKETCALL(...) __SOCKETCALL_DISP (__SOCKETCALL, __VA_ARGS__) + + +#define SOCKETCALL(name, args...) \ + ({ \ + long int sc_ret = __SOCKETCALL (SOCKOP_##name, args); \ + sc_ret; \ + }) + + +#if IS_IN (libc) +# define __pthread_enable_asynccancel __libc_enable_asynccancel +# define __pthread_disable_asynccancel __libc_disable_asynccancel +#endif + +#define SOCKETCALL_CANCEL(name, args...) \ + ({ \ + int oldtype = LIBC_CANCEL_ASYNC (); \ + long int sc_ret = __SOCKETCALL (SOCKOP_##name, args); \ + LIBC_CANCEL_RESET (oldtype); \ + sc_ret; \ + }) + + #endif /* sys/socketcall.h */ diff --git a/sysdeps/unix/sysv/linux/socketpair.S b/sysdeps/unix/sysv/linux/socketpair.S deleted file mode 100644 index c954ad1a4b..0000000000 --- a/sysdeps/unix/sysv/linux/socketpair.S +++ /dev/null @@ -1,3 +0,0 @@ -#define socket socketpair -#define NARGS 4 -#include <socket.S> diff --git a/sysdeps/unix/sysv/linux/socketpair.c b/sysdeps/unix/sysv/linux/socketpair.c new file mode 100644 index 0000000000..cb70bcf1f0 --- /dev/null +++ b/sysdeps/unix/sysv/linux/socketpair.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2015 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <sys/socket.h> + +#include <socketcall.h> + +int +__socketpair (int domain, int type, int protocol, int sv[2]) +{ + return SOCKETCALL (socketpair, domain, type, protocol, sv); +} +weak_alias (__socketpair, socketpair) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S deleted file mode 100644 index 59c81649ec..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 1997-2015 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - - .text -/* The socket-oriented system calls are handled unusually in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .globl __syscall_error -ENTRY (__socket) - - /* Drop up to 6 arguments (recvfrom) into the memory allocated by - the caller for varargs, since that's really what we have. */ - st %o0, [%sp + 68 + 0] - st %o1, [%sp + 68 + 4] -#if NARGS > 2 - st %o2, [%sp + 68 + 8] -#if NARGS > 3 - st %o3, [%sp + 68 + 12] -#if NARGS > 4 - st %o4, [%sp + 68 + 16] -#if NARGS > 5 - st %o5, [%sp + 68 + 20] -#endif -#endif -#endif -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - cmp %g1, 0 - bne .Lsocket_cancel -#endif - mov P(SOCKOP_,socket), %o0 /* arg 1: socket subfunction */ - add %sp, 68, %o1 /* arg 2: parameter block */ - LOADSYSCALL(socketcall) - t 0x10 - bcc 1f - mov %o7, %g1 - call __syscall_error - mov %g1, %o7 -1: jmpl %o7 + 8, %g0 - nop - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - save %sp, -96, %sp - cfi_def_cfa_register(%fp) - cfi_window_save - cfi_register(%o7, %i7) - CENABLE - nop - mov %o0, %l0 - add %sp, 68 + 96, %o1 - mov P(SOCKOP_,socket), %o0 - LOADSYSCALL(socketcall) - t 0x10 - bcc 1f - mov %o0, %l1 - CDISABLE; - mov %l0, %o0; - call __syscall_error; - mov %l1, %o0; - b 1f - mov -1, %l1; -1: CDISABLE - mov %l0, %o0 -2: jmpl %i7 + 8, %g0 - restore %g0, %l1, %o0 -#endif - -END (__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S deleted file mode 100644 index b680165653..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/socket.S +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 1997-2015 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#include <socketcall.h> - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - -#ifndef NARGS -#ifdef socket -#error NARGS not defined -#endif -#define NARGS 3 -#endif - - .text -/* The socket-oriented system calls are handled unusually in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -#ifndef __socket -# ifndef NO_WEAK_ALIAS -# define __socket P(__,socket) -# else -# define __socket socket -# endif -#endif - - .globl __syscall_error -ENTRY(__socket) - - /* Drop up to 6 arguments (recvfrom) into the memory allocated by - the caller for varargs, since that's really what we have. */ - stx %o0, [%sp + STACK_BIAS + 128 + 0] - stx %o1, [%sp + STACK_BIAS + 128 + 8] -#if NARGS > 2 - stx %o2, [%sp + STACK_BIAS + 128 + 16] -#if NARGS > 3 - stx %o3, [%sp + STACK_BIAS + 128 + 24] -#if NARGS > 4 - stx %o4, [%sp + STACK_BIAS + 128 + 32] -#if NARGS > 5 - stx %o5, [%sp + STACK_BIAS + 128 + 40] -#endif -#endif -#endif -#endif - -#if defined NEED_CANCELLATION && defined CENABLE - SINGLE_THREAD_P - cmp %g1, 0 - bne .Lsocket_cancel -#endif - mov P(SOCKOP_,socket), %o0 /* arg 1: socket subfunction */ - add %sp, STACK_BIAS + 128, %o1 /* arg 2: parameter block */ - LOADSYSCALL(socketcall) - ta 0x6d - - bcc,pt %xcc, 1f - mov %o7, %g1 - call __syscall_error - mov %g1, %o7 -1: retl - nop - -#if defined NEED_CANCELLATION && defined CENABLE -.Lsocket_cancel: - save %sp, -160, %sp - cfi_def_cfa_register (%fp) - cfi_window_save - cfi_register (%o7, %i7) - CENABLE - nop - mov %o0, %l0 - add %sp, 160 + STACK_BIAS + 128, %o1 - mov P(SOCKOP_,socket), %o0 - LOADSYSCALL(socketcall) - ta 0x6d - - bcc,pt %xcc, 1f - mov %o0, %l1 - CDISABLE; - mov %l0, %o0; - call __syscall_error; - mov %l1, %o0; - ba,pt %xcc, 2f - mov -1, %l1; -1: CDISABLE - mov %l0, %o0 -2: jmpl %i7 + 8, %g0 - restore %g0, %l1, %o0 -#endif - -END(__socket) - -#ifndef NO_WEAK_ALIAS -weak_alias (__socket, socket) -#endif |