1 | /* $NetBSD: linux32_socketcall.c,v 1.9 2014/06/21 10:23:07 maxv Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. |
5 | * |
6 | * Redistribution and use in source and binary forms, with or without |
7 | * modification, are permitted provided that the following conditions |
8 | * are met: |
9 | * 1. Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * 2. Redistributions in binary form must reproduce the above copyright |
12 | * notice, this list of conditions and the following disclaimer in the |
13 | * documentation and/or other materials provided with the distribution. |
14 | * 3. All advertising materials mentioning features or use of this software |
15 | * must display the following acknowledgement: |
16 | * This product includes software developed by Emmanuel Dreyfus |
17 | * 4. The name of the author may not be used to endorse or promote |
18 | * products derived from this software without specific prior written |
19 | * permission. |
20 | * |
21 | * THIS SOFTWARE IS PROVIDED BY THE THE AUTHOR AND CONTRIBUTORS ``AS IS'' |
22 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
23 | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS |
25 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
26 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
27 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
28 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
29 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
30 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
31 | * POSSIBILITY OF SUCH DAMAGE. |
32 | */ |
33 | #include <sys/cdefs.h> |
34 | __KERNEL_RCSID(0, "$NetBSD: linux32_socketcall.c,v 1.9 2014/06/21 10:23:07 maxv Exp $" ); |
35 | |
36 | #include <sys/types.h> |
37 | #include <sys/param.h> |
38 | #include <sys/time.h> |
39 | #include <sys/proc.h> |
40 | #include <sys/ucred.h> |
41 | #include <sys/ktrace.h> |
42 | |
43 | #include <compat/netbsd32/netbsd32.h> |
44 | #include <compat/netbsd32/netbsd32_syscallargs.h> |
45 | |
46 | #include <compat/linux/common/linux_types.h> |
47 | #include <compat/linux/common/linux_signal.h> |
48 | #include <compat/linux/common/linux_ipc.h> |
49 | #include <compat/linux/common/linux_sem.h> |
50 | #include <compat/linux/linux_syscallargs.h> |
51 | |
52 | #include <compat/linux32/common/linux32_types.h> |
53 | #include <compat/linux32/common/linux32_signal.h> |
54 | #include <compat/linux32/common/linux32_machdep.h> |
55 | #include <compat/linux32/common/linux32_sysctl.h> |
56 | #include <compat/linux32/common/linux32_socketcall.h> |
57 | #include <compat/linux32/linux32_syscallargs.h> |
58 | |
59 | #define sc(emul, fn) { "linux32/" #fn, sizeof (struct emul##_##fn##_args), \ |
60 | (int (*)(struct lwp *, const void *, register_t *))emul##_##fn } |
61 | |
62 | static const struct { |
63 | const char *name; |
64 | int argsize; |
65 | int (*syscall)(struct lwp *, const void *, register_t *); |
66 | } linux32_socketcall[LINUX32_MAX_SOCKETCALL+1] = { |
67 | {"invalid" , -1, NULL}, |
68 | sc(linux32_sys, socket), |
69 | sc(linux32_sys, bind), |
70 | sc(linux32_sys, connect), |
71 | sc(netbsd32, listen), |
72 | sc(linux32_sys, accept), |
73 | sc(linux32_sys, getsockname), |
74 | sc(linux32_sys, getpeername), |
75 | sc(linux32_sys, socketpair), |
76 | sc(linux32_sys, send), |
77 | sc(linux32_sys, recv), |
78 | sc(linux32_sys, sendto), |
79 | sc(linux32_sys, recvfrom), |
80 | sc(netbsd32, shutdown), |
81 | sc(linux32_sys, setsockopt), |
82 | sc(linux32_sys, getsockopt), |
83 | sc(linux32_sys, sendmsg), |
84 | sc(linux32_sys, recvmsg), |
85 | }; |
86 | #undef sc |
87 | |
88 | |
89 | int |
90 | linux32_sys_socketcall(struct lwp *l, const struct linux32_sys_socketcall_args *uap, register_t *retval) |
91 | { |
92 | /* { |
93 | syscallarg(int) what; |
94 | syscallarg(netbsd32_voidp) args; |
95 | } */ |
96 | union linux32_socketcall_args ua; |
97 | int error; |
98 | |
99 | if (SCARG(uap, what) <= 0 || SCARG(uap, what) > LINUX32_MAX_SOCKETCALL) |
100 | return ENOSYS; |
101 | |
102 | if ((error = copyin(SCARG_P32(uap, args), &ua, |
103 | linux32_socketcall[SCARG(uap, what)].argsize)) != 0) |
104 | return error; |
105 | |
106 | /* Trace the socket-call arguments as 'GIO' on fd -1 */ |
107 | ktrkuser(linux32_socketcall[SCARG(uap, what)].name, &ua, |
108 | linux32_socketcall[SCARG(uap, what)].argsize); |
109 | |
110 | return linux32_socketcall[SCARG(uap, what)].syscall(l, &ua, retval); |
111 | } |
112 | |