Commit | Line | Data |
---|---|---|
5fd4459e VB |
1 | From 3b78843ee18a3099196a61c7d07c0e2d24d1fe84 Mon Sep 17 00:00:00 2001 |
2 | From: vishalbiswas <vshlbiswas@ymail.com> | |
3 | Date: Tue, 17 Jan 2017 10:10:23 +0530 | |
4 | Subject: [PATCH] syscall: Add clone | |
5 | ||
6 | Signed-off-by: vishalbiswas <vshlbiswas@ymail.com> | |
7 | --- | |
8 | src/common/compat.h | 4 ++++ | |
9 | src/lib/syscall.c | 21 +++++++++++++++++++++ | |
10 | 2 files changed, 25 insertions(+) | |
11 | ||
12 | diff --git a/src/common/compat.h b/src/common/compat.h | |
13 | index f490113..bf42f07 100644 | |
14 | --- a/src/common/compat.h | |
15 | +++ b/src/common/compat.h | |
16 | @@ -126,6 +126,9 @@ void tsocks_once(tsocks_once_t *o, void (*init_routine)(void)); | |
17 | #ifndef __NR_fork | |
18 | #define __NR_fork -18 | |
19 | #endif | |
20 | +#ifndef __NR_clone | |
21 | +#define __NR_clone -19 | |
22 | +#endif | |
23 | ||
24 | #define TSOCKS_NR_SOCKET __NR_socket | |
25 | #define TSOCKS_NR_CONNECT __NR_connect | |
26 | @@ -145,6 +148,7 @@ void tsocks_once(tsocks_once_t *o, void (*init_routine)(void)); | |
27 | #define TSOCKS_NR_GETTIMEOFDAY __NR_gettimeofday | |
28 | #define TSOCKS_NR_CLOCK_GETTIME __NR_clock_gettime | |
29 | #define TSOCKS_NR_FORK __NR_fork | |
30 | +#define TSOCKS_NR_CLONE __NR_clone | |
31 | ||
32 | /* | |
33 | * Despite glibc providing wrappers for these calls for a long time | |
34 | diff --git a/src/lib/syscall.c b/src/lib/syscall.c | |
35 | index d0fdaaa..c8a9b46 100644 | |
36 | --- a/src/lib/syscall.c | |
37 | +++ b/src/lib/syscall.c | |
38 | @@ -423,6 +423,24 @@ static LIBC_SYSCALL_RET_TYPE handle_fork(void) | |
39 | { | |
40 | return tsocks_libc_syscall(TSOCKS_NR_FORK); | |
41 | } | |
42 | + | |
43 | +/* | |
44 | + * * Handle clone(2) syscall. | |
45 | + * */ | |
46 | +static LIBC_SYSCALL_RET_TYPE handle_clone(va_list args) | |
47 | +{ | |
48 | + int (*fn)(void*); | |
49 | + void* child_stack; | |
50 | + int flags; | |
51 | + void* arg; | |
52 | + | |
53 | + fn = va_arg(args, __typeof__(fn)); | |
54 | + child_stack = va_arg(args, __typeof__(child_stack)); | |
55 | + flags = va_arg(args, __typeof__(flags)); | |
56 | + arg = va_arg(args, __typeof__(arg)); | |
57 | + | |
58 | + return tsocks_libc_syscall(TSOCKS_NR_CLONE, fn, child_stack, flags, arg); | |
59 | +} | |
60 | #endif /* __linux__ */ | |
61 | ||
62 | /* | |
63 | @@ -541,6 +559,9 @@ LIBC_SYSCALL_RET_TYPE tsocks_syscall(long int number, va_list args) | |
64 | case TSOCKS_NR_FORK: | |
65 | ret = handle_fork(); | |
66 | break; | |
67 | + case TSOCKS_NR_CLONE: | |
68 | + ret = handle_clone(args); | |
69 | + break; | |
70 | #endif /* __linux__ */ | |
71 | default: | |
72 | /* | |
73 | -- | |
74 | 2.11.0 | |
75 |