diff --git a/platform/src/linux/mod.rs b/platform/src/linux/mod.rs index d8608f9e93..6228afaf9b 100644 --- a/platform/src/linux/mod.rs +++ b/platform/src/linux/mod.rs @@ -8,6 +8,12 @@ pub fn chdir(path: *const c_char) -> c_int { } } +pub fn chown(path: *const c_char, owner: usize, group: usize) -> c_int { + unsafe { + syscall!(CHOWN, owner as u32, group as u32) as c_int + } +} + pub fn close(fildes: c_int) -> c_int { unsafe { syscall!(CLOSE, fildes) as c_int diff --git a/platform/src/redox/mod.rs b/platform/src/redox/mod.rs index 9bae6859eb..963d45ce88 100644 --- a/platform/src/redox/mod.rs +++ b/platform/src/redox/mod.rs @@ -11,6 +11,10 @@ pub fn chdir(path: *const c_char) -> c_int { syscall::chdir(cstr_to_slice(path))? as c_int } +pub fn chown(path: *const c_char, owner: usize, group: usize) -> c_int { + let fd = syscall::open(cstr_to_slice(path)); + syscall::fchown(fd, owner as u32, group as u32)? as c_int + pub fn close(fd: c_int) -> c_int { syscall::close(fd as usize); 0 diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index 3db682fefa..de4dcdcea7 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -56,7 +56,7 @@ pub extern "C" fn chroot(path: *const c_char) -> c_int { #[no_mangle] pub extern "C" fn chown(path: *const c_char, owner: uid_t, group: gid_t) -> c_int { - unimplemented!(); + platform::chown(path, owner, group) } #[no_mangle]