Deleted Added
full compact
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 ---