diff options
Diffstat (limited to 'meta/packages/qemu/qemu-0.9.0+cvs20071121/32_syscall_sysctl.patch')
-rw-r--r-- | meta/packages/qemu/qemu-0.9.0+cvs20071121/32_syscall_sysctl.patch | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/meta/packages/qemu/qemu-0.9.0+cvs20071121/32_syscall_sysctl.patch b/meta/packages/qemu/qemu-0.9.0+cvs20071121/32_syscall_sysctl.patch new file mode 100644 index 0000000000..5e8dd75b0e --- /dev/null +++ b/meta/packages/qemu/qemu-0.9.0+cvs20071121/32_syscall_sysctl.patch | |||
@@ -0,0 +1,55 @@ | |||
1 | #DPATCHLEVEL=0 | ||
2 | --- | ||
3 | # linux-user/syscall.c | 32 +++++++++++++++++++++++++++++--- | ||
4 | # 1 file changed, 29 insertions(+), 3 deletions(-) | ||
5 | # | ||
6 | Index: linux-user/syscall.c | ||
7 | =================================================================== | ||
8 | --- linux-user/syscall.c.orig 2007-12-03 15:56:24.000000000 +0000 | ||
9 | +++ linux-user/syscall.c 2007-12-03 15:57:36.000000000 +0000 | ||
10 | @@ -52,6 +52,7 @@ | ||
11 | //#include <sys/user.h> | ||
12 | #include <netinet/ip.h> | ||
13 | #include <netinet/tcp.h> | ||
14 | +#include <sys/sysctl.h> | ||
15 | |||
16 | #define termios host_termios | ||
17 | #define winsize host_winsize | ||
18 | @@ -4739,9 +4740,34 @@ abi_long do_syscall(void *cpu_env, int n | ||
19 | break; | ||
20 | #endif | ||
21 | case TARGET_NR__sysctl: | ||
22 | - /* We don't implement this, but ENOTDIR is always a safe | ||
23 | - return value. */ | ||
24 | - ret = -TARGET_ENOTDIR; | ||
25 | + { | ||
26 | + struct __sysctl_args *args = (struct __sysctl_args *) arg1; | ||
27 | + int *name_target, *name, nlen, *oldlenp, oldlen, newlen, i; | ||
28 | + void *oldval, *newval; | ||
29 | + | ||
30 | + name_target = (int *) tswapl((long) args->name); | ||
31 | + nlen = tswapl(args->nlen); | ||
32 | + oldval = (void *) tswapl((long) args->oldval); | ||
33 | + oldlenp = (int *) tswapl((long) args->oldlenp); | ||
34 | + oldlen = tswapl(*oldlenp); | ||
35 | + newval = (void *) tswapl((long) args->newval); | ||
36 | + newlen = tswapl(args->newlen); | ||
37 | + | ||
38 | + name = alloca(nlen * sizeof (int)); | ||
39 | + for (i = 0; i < nlen; i++) | ||
40 | + name[i] = tswapl(name_target[i]); | ||
41 | + | ||
42 | + if (nlen == 2 && name[0] == CTL_KERN && name[1] == KERN_VERSION) { | ||
43 | + ret = get_errno( | ||
44 | + sysctl(name, nlen, oldval, &oldlen, newval, newlen)); | ||
45 | + if (!is_error(ret)) { | ||
46 | + *oldlenp = tswapl(oldlen); | ||
47 | + } | ||
48 | + } else { | ||
49 | + gemu_log("qemu: Unsupported sysctl name\n"); | ||
50 | + ret = -ENOSYS; | ||
51 | + } | ||
52 | + } | ||
53 | break; | ||
54 | case TARGET_NR_sched_setparam: | ||
55 | { | ||