diff --git a/vlib/os/os.v b/vlib/os/os.v index 88989418a9..c94b52fe60 100644 --- a/vlib/os/os.v +++ b/vlib/os/os.v @@ -1358,3 +1358,12 @@ pub fn create(path string) ?File { opened: true } } + +pub struct Uname { +pub mut: + sysname string + nodename string + release string + version string + machine string +} diff --git a/vlib/os/os_nix.c.v b/vlib/os/os_nix.c.v index a62d0c74d9..7f42837a90 100644 --- a/vlib/os/os_nix.c.v +++ b/vlib/os/os_nix.c.v @@ -5,6 +5,7 @@ import strings #include #include #include +#include pub const ( path_separator = '/' @@ -17,8 +18,32 @@ const ( stderr_value = 2 ) +struct C.utsname { +mut: + sysname charptr + nodename charptr + release charptr + version charptr + machine charptr +} + +fn C.uname(name voidptr) int fn C.symlink(charptr, charptr) int +pub fn uname() Uname { + mut u := Uname{} + d := &C.utsname( malloc(int(sizeof(C.utsname))) ) + if C.uname(d) == 0 { + u.sysname = cstring_to_vstring(d.sysname) + u.nodename = cstring_to_vstring(d.nodename) + u.release = cstring_to_vstring(d.release) + u.version = cstring_to_vstring(d.version) + u.machine = cstring_to_vstring(d.machine) + } + free(d) + return u +} + fn init_os_args(argc int, argv &&byte) []string { mut args := []string{} //mut args := []string(make(0, argc, sizeof(string))) diff --git a/vlib/os/os_test.v b/vlib/os/os_test.v index f448f4b7b0..d29bed3d2c 100644 --- a/vlib/os/os_test.v +++ b/vlib/os/os_test.v @@ -343,3 +343,12 @@ fn test_basedir() { } assert os.base_dir('filename') == 'filename' } + +fn test_uname() { + u := os.uname() + assert u.sysname.len > 0 + assert u.nodename.len > 0 + assert u.release.len > 0 + assert u.version.len > 0 + assert u.machine.len > 0 +} diff --git a/vlib/os/os_windows.c.v b/vlib/os/os_windows.c.v index 4b13feb067..3792d5f5b6 100644 --- a/vlib/os/os_windows.c.v +++ b/vlib/os/os_windows.c.v @@ -317,7 +317,7 @@ pub: // status_ constants code u32 flags u32 - + record &ExceptionRecord address voidptr param_count u32 @@ -353,3 +353,15 @@ pub fn add_vectored_exception_handler(first bool, handler VectoredExceptionHandl pub fn debugger_present() bool { return C.IsDebuggerPresent() } + +pub fn uname() Uname { + // TODO: implement `os.uname()` for windows + unknown := 'unknown' + return Uname{ + sysname: unknown + nodename: unknown + release: unknown + version: unknown + machine: unknown + } +}