diff options
Diffstat (limited to 'linux-user/syscall.c')
-rw-r--r-- | linux-user/syscall.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index a62bd9bd6b..0e506cc137 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3054,6 +3054,37 @@ static inline abi_long host_to_target_timespec(abi_ulong target_addr, unlock_user_struct(target_ts, target_addr, 1); } +int get_osversion(void) +{ + static int osversion; + struct new_utsname buf; + const char *s; + int i, n, tmp; + if (osversion) + return osversion; + if (qemu_uname_release && *qemu_uname_release) { + s = qemu_uname_release; + } else { + if (sys_uname(&buf)) + return 0; + s = buf.release; + } + tmp = 0; + for (i = 0; i < 3; i++) { + n = 0; + while (*s >= '0' && *s <= '9') { + n *= 10; + n += *s - '0'; + s++; + } + tmp = (tmp << 8) + n; + if (*s == '.') + s++; + } + osversion = tmp; + return osversion; +} + /* do_syscall() should always have a single exit point at the end so that actions, such as logging of syscall results, can be performed. All errnos that do_syscall() returns must be -TARGET_<errcode>. */ |