split up constants.h some
[trinity.git] / syscalls / socketcall.c
blobcd729ec3e3dce32448669f4e142dbe621aba3db0
1 /*
2 * SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
3 */
4 #include <stdlib.h>
5 #include <linux/net.h>
6 #include <sys/types.h> /* See NOTES */
7 #include <sys/socket.h>
8 #include "compat.h"
9 #include "net.h"
10 #include "sanitise.h"
11 #include "shm.h"
12 #include "utils.h"
14 static void socketcall_socket(unsigned long *args)
16 struct socket_triplet st;
18 gen_socket_args(&st);
20 args[0] = st.family;
21 args[1] = st.type;
22 args[2] = st.protocol;
25 struct socketcall_ptr {
26 unsigned int call;
27 void (*func)(unsigned long *args);
30 static const struct socketcall_ptr socketcallptrs[] = {
31 { .call = SYS_SOCKET, .func = socketcall_socket },
32 // { .call = SYS_BIND, .func = socketcall_bind },
33 // { .call = SYS_CONNECT, .func = socketcall_connect },
34 // { .call = SYS_LISTEN, .func = socketcall_listen },
35 // { .call = SYS_ACCEPT, .func = socketcall_accept },
36 // { .call = SYS_GETSOCKNAME, .func = socketcall_getsockname },
37 // { .call = SYS_GETPEERNAME, .func = socketcall_getpeername },
38 // { .call = SYS_SOCKETPAIR, .func = socketcall_socketpair },
39 // { .call = SYS_SEND, .func = socketcall_send },
40 // { .call = SYS_RECV, .func = socketcall_recv },
41 // { .call = SYS_SENDTO, .func = socketcall_sendto },
42 // { .call = SYS_RECVFROM, .func = socketcall_recvfrom },
43 // { .call = SYS_SHUTDOWN, .func = socketcall_shutdown },
44 // { .call = SYS_SETSOCKOPT, .func = socketcall_setsockopt },
45 // { .call = SYS_GETSOCKOPT, .func = socketcall_getsockopt },
46 // { .call = SYS_SENDMSG, .func = socketcall_sendmsg },
47 // { .call = SYS_RECVMSG, .func = socketcall_recvmsg },
48 // { .call = SYS_ACCEPT4, .func = socketcall_accept },
49 // { .call = SYS_RECVMMSG, .func = socketcall_recvmmsg },
50 // { .call = SYS_SENDMMSG, .func = socketcall_sendmmsg },
54 static void sanitise_socketcall(int childno)
56 unsigned long *args;
57 unsigned int i;
59 args = malloc(6 * sizeof(unsigned long));
61 shm->syscall[childno].a1 = rand() % 20;
62 shm->syscall[childno].a1 = SYS_SOCKET;
64 for (i = 0; i < ARRAY_SIZE(socketcallptrs); i++) {
65 if (socketcallptrs[i].call == shm->syscall[childno].a1)
66 socketcallptrs[i].func(args);
69 shm->syscall[childno].a2 = (unsigned long) args;
72 struct syscallentry syscall_socketcall = {
73 .name = "socketcall",
74 .num_args = 2,
75 .arg1name = "call",
76 .arg2name = "args",
77 .arg2type = ARG_ADDRESS,
78 .sanitise = sanitise_socketcall,