diff --git a/vlib/os/os_c.v b/vlib/os/os_c.v index 81a11247ee..316166f5af 100644 --- a/vlib/os/os_c.v +++ b/vlib/os/os_c.v @@ -31,6 +31,8 @@ fn C.CopyFile(&u16, &u16, bool) int fn C._wstat64(&char, voidptr) u64 +fn C.chown(&char, int, int) int + // fn C.proc_pidpath(int, byteptr, int) int struct C.stat { st_size u64 @@ -827,7 +829,24 @@ pub fn flush() { // chmod change file access attributes of `path` to `mode`. // Octals like `0o600` can be used. pub fn chmod(path string, mode int) { - C.chmod(&char(path.str), mode) + if C.chmod(&char(path.str), mode) != 0 { + panic(posix_get_error_msg(C.errno)) + } +} + +// chown change owner and group attributes of path to `owner` and `group`. +pub fn chown(path string, owner int, group int) ? { + $if windows { + return error('os.chown() not implemented for Windows') + } $else { + if owner < 0 || group < 0 { + return error('os.chown() uid and gid cannot be negative: Not changing owner!') + } else { + if C.chown(&char(path.str), owner, group) != 0 { + return error_with_code(posix_get_error_msg(C.errno), C.errno) + } + } + } } // open_append opens `path` file for appending. diff --git a/vlib/os/os_nix.c.v b/vlib/os/os_nix.c.v index 03356e4fae..8d06012235 100644 --- a/vlib/os/os_nix.c.v +++ b/vlib/os/os_nix.c.v @@ -51,6 +51,8 @@ fn C.uname(name voidptr) int fn C.symlink(&char, &char) int +fn C.gethostname(&char, int) int + pub fn uname() Uname { mut u := Uname{} utsize := sizeof(C.utsname) @@ -69,6 +71,18 @@ pub fn uname() Uname { return u } +pub fn hostname() string { + mut hstnme := '' + size := 256 + mut buf := unsafe { &char(malloc(size)) } + if C.gethostname(buf, size) == 0 { + hstnme = unsafe { cstring_to_vstring(buf) } + unsafe { free(buf) } + return hstnme + } + return '' +} + 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_windows.c.v b/vlib/os/os_windows.c.v index 38d552c103..48a24d0445 100644 --- a/vlib/os/os_windows.c.v +++ b/vlib/os/os_windows.c.v @@ -376,17 +376,24 @@ pub fn debugger_present() bool { } pub fn uname() Uname { - // TODO: implement `os.uname()` for windows - unknown := 'unknown' + // TODO: use Win32 Api functions instead + sys_and_ver := execute('cmd /c ver').output.split('[') + nodename := execute('cmd /c hostname').output + machine := execute('cmd /c echo %PROCESSOR_ARCHITECTURE%').output return Uname{ - sysname: unknown - nodename: unknown - release: unknown - version: unknown - machine: unknown + sysname: sys_and_ver[0].trim_space() + nodename: nodename + release: sys_and_ver[1].replace(']', '') + version: sys_and_ver[0] + '[' + sys_and_ver[1] + machine: machine } } +pub fn hostname() string { + // TODO: use C.GetComputerName(&u16, u32) int instead + return execute('cmd /c hostname').output +} + // `is_writable_folder` - `folder` exists and is writable to the process pub fn is_writable_folder(folder string) ?bool { if !exists(folder) {