--- linux-user/syscall.c.orig 2004-04-27 00:17:28.000000000 +0300 +++ linux-user/syscall.c 2004-04-27 11:02:20.000000000 +0300 @@ -51,6 +51,7 @@ #include #include #include +#include #define termios host_termios #define winsize host_winsize @@ -2572,9 +2573,31 @@ ret = get_errno(fdatasync(arg1)); break; case TARGET_NR__sysctl: - /* We don't implement this, but ENODIR is always a safe - return value. */ - return -ENOTDIR; + { + struct __sysctl_args *args = (struct __sysctl_args *) arg1; + int *name, nlen, *oldlenp, oldlen, newlen; + void *oldval, *newval; + + name = (int *) tswapl((long) args->name); + nlen = tswapl(args->nlen); + oldval = (void *) tswapl((long) args->oldval); + oldlenp = (int *) tswapl((long) args->oldlenp); + oldlen = tswapl(*oldlenp); + newval = (void *) tswapl((long) args->newval); + newlen = tswapl(args->newlen); + + if (nlen == 2 && name[0] == CTL_KERN && name[1] == KERN_VERSION) { + ret = get_errno( + sysctl(name, nlen, oldval, &oldlen, newval, newlen)); + if (!is_error(ret)) { + *oldlenp = tswapl(oldlen); + } + } else { + gemu_log("qemu: Unsupported sysctl name\n"); + ret = -ENOSYS; + } + } + break; case TARGET_NR_sched_setparam: { struct sched_param *target_schp = (void *)arg2;