linux_socket.c (302408) | linux_socket.c (314107) |
---|---|
1/*- 2 * Copyright (c) 1995 S��ren Schmidt 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 13 unchanged lines hidden (view full) --- 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1995 S��ren Schmidt 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 13 unchanged lines hidden (view full) --- 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> |
30__FBSDID("$FreeBSD: stable/11/sys/compat/linux/linux_socket.c 302213 2016-06-26 16:59:59Z dchagin $"); | 30__FBSDID("$FreeBSD: stable/11/sys/compat/linux/linux_socket.c 314107 2017-02-22 19:57:59Z dchagin $"); |
31 32/* XXX we use functions that might not exist. */ 33#include "opt_compat.h" 34#include "opt_inet6.h" 35 36#include <sys/param.h> 37#include <sys/proc.h> 38#include <sys/systm.h> --- 927 unchanged lines hidden (view full) --- 966 else 967 bsd_args.protocol = 0; 968 bsd_args.rsv = (int *)PTRIN(args->rsv); 969 return (sys_socketpair(td, &bsd_args)); 970} 971 972#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 973struct linux_send_args { | 31 32/* XXX we use functions that might not exist. */ 33#include "opt_compat.h" 34#include "opt_inet6.h" 35 36#include <sys/param.h> 37#include <sys/proc.h> 38#include <sys/systm.h> --- 927 unchanged lines hidden (view full) --- 966 else 967 bsd_args.protocol = 0; 968 bsd_args.rsv = (int *)PTRIN(args->rsv); 969 return (sys_socketpair(td, &bsd_args)); 970} 971 972#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 973struct linux_send_args { |
974 int s; 975 l_uintptr_t msg; 976 int len; 977 int flags; | 974 register_t s; 975 register_t msg; 976 register_t len; 977 register_t flags; |
978}; 979 980static int 981linux_send(struct thread *td, struct linux_send_args *args) 982{ 983 struct sendto_args /* { 984 int s; 985 caddr_t buf; --- 8 unchanged lines hidden (view full) --- 994 bsd_args.len = args->len; 995 bsd_args.flags = args->flags; 996 bsd_args.to = NULL; 997 bsd_args.tolen = 0; 998 return (sys_sendto(td, &bsd_args)); 999} 1000 1001struct linux_recv_args { | 978}; 979 980static int 981linux_send(struct thread *td, struct linux_send_args *args) 982{ 983 struct sendto_args /* { 984 int s; 985 caddr_t buf; --- 8 unchanged lines hidden (view full) --- 994 bsd_args.len = args->len; 995 bsd_args.flags = args->flags; 996 bsd_args.to = NULL; 997 bsd_args.tolen = 0; 998 return (sys_sendto(td, &bsd_args)); 999} 1000 1001struct linux_recv_args { |
1002 int s; 1003 l_uintptr_t msg; 1004 int len; 1005 int flags; | 1002 register_t s; 1003 register_t msg; 1004 register_t len; 1005 register_t flags; |
1006}; 1007 1008static int 1009linux_recv(struct thread *td, struct linux_recv_args *args) 1010{ 1011 struct recvfrom_args /* { 1012 int s; 1013 caddr_t buf; --- 682 unchanged lines hidden (view full) --- 1696 error = sys_getsockopt(td, &bsd_args); 1697 1698 return (error); 1699} 1700 1701#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 1702 1703/* Argument list sizes for linux_socketcall */ | 1006}; 1007 1008static int 1009linux_recv(struct thread *td, struct linux_recv_args *args) 1010{ 1011 struct recvfrom_args /* { 1012 int s; 1013 caddr_t buf; --- 682 unchanged lines hidden (view full) --- 1696 error = sys_getsockopt(td, &bsd_args); 1697 1698 return (error); 1699} 1700 1701#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 1702 1703/* Argument list sizes for linux_socketcall */ |
1704 1705#define LINUX_AL(x) ((x) * sizeof(l_ulong)) 1706 1707static const unsigned char lxs_args[] = { 1708 LINUX_AL(0) /* unused*/, LINUX_AL(3) /* socket */, 1709 LINUX_AL(3) /* bind */, LINUX_AL(3) /* connect */, 1710 LINUX_AL(2) /* listen */, LINUX_AL(3) /* accept */, 1711 LINUX_AL(3) /* getsockname */, LINUX_AL(3) /* getpeername */, 1712 LINUX_AL(4) /* socketpair */, LINUX_AL(4) /* send */, 1713 LINUX_AL(4) /* recv */, LINUX_AL(6) /* sendto */, 1714 LINUX_AL(6) /* recvfrom */, LINUX_AL(2) /* shutdown */, 1715 LINUX_AL(5) /* setsockopt */, LINUX_AL(5) /* getsockopt */, 1716 LINUX_AL(3) /* sendmsg */, LINUX_AL(3) /* recvmsg */, 1717 LINUX_AL(4) /* accept4 */, LINUX_AL(5) /* recvmmsg */, 1718 LINUX_AL(4) /* sendmmsg */ | 1704static const unsigned char lxs_args_cnt[] = { 1705 0 /* unused*/, 3 /* socket */, 1706 3 /* bind */, 3 /* connect */, 1707 2 /* listen */, 3 /* accept */, 1708 3 /* getsockname */, 3 /* getpeername */, 1709 4 /* socketpair */, 4 /* send */, 1710 4 /* recv */, 6 /* sendto */, 1711 6 /* recvfrom */, 2 /* shutdown */, 1712 5 /* setsockopt */, 5 /* getsockopt */, 1713 3 /* sendmsg */, 3 /* recvmsg */, 1714 4 /* accept4 */, 5 /* recvmmsg */, 1715 4 /* sendmmsg */ |
1719}; | 1716}; |
1717#define LINUX_ARGS_CNT (nitems(lxs_args_cnt) - 1) 1718#define LINUX_ARG_SIZE(x) (lxs_args_cnt[x] * sizeof(l_ulong)) |
|
1720 | 1719 |
1721#define LINUX_AL_SIZE (nitems(lxs_args) - 1) 1722 | |
1723int 1724linux_socketcall(struct thread *td, struct linux_socketcall_args *args) 1725{ 1726 l_ulong a[6]; | 1720int 1721linux_socketcall(struct thread *td, struct linux_socketcall_args *args) 1722{ 1723 l_ulong a[6]; |
1724#if defined(__amd64__) && defined(COMPAT_LINUX32) 1725 register_t l_args[6]; 1726#endif |
|
1727 void *arg; 1728 int error; 1729 | 1727 void *arg; 1728 int error; 1729 |
1730 if (args->what < LINUX_SOCKET || args->what > LINUX_AL_SIZE) | 1730 if (args->what < LINUX_SOCKET || args->what > LINUX_ARGS_CNT) |
1731 return (EINVAL); | 1731 return (EINVAL); |
1732 error = copyin(PTRIN(args->args), a, lxs_args[args->what]); 1733 if (error) | 1732 error = copyin(PTRIN(args->args), a, LINUX_ARG_SIZE(args->what)); 1733 if (error != 0) |
1734 return (error); 1735 | 1734 return (error); 1735 |
1736#if defined(__amd64__) && defined(COMPAT_LINUX32) 1737 for (int i = 0; i < lxs_args_cnt[args->what]; ++i) 1738 l_args[i] = a[i]; 1739 arg = l_args; 1740#else |
|
1736 arg = a; | 1741 arg = a; |
1742#endif |
|
1737 switch (args->what) { 1738 case LINUX_SOCKET: 1739 return (linux_socket(td, arg)); 1740 case LINUX_BIND: 1741 return (linux_bind(td, arg)); 1742 case LINUX_CONNECT: 1743 return (linux_connect(td, arg)); 1744 case LINUX_LISTEN: --- 39 unchanged lines hidden --- | 1743 switch (args->what) { 1744 case LINUX_SOCKET: 1745 return (linux_socket(td, arg)); 1746 case LINUX_BIND: 1747 return (linux_bind(td, arg)); 1748 case LINUX_CONNECT: 1749 return (linux_connect(td, arg)); 1750 case LINUX_LISTEN: --- 39 unchanged lines hidden --- |