diff --git a/platform/src/linux/mod.rs b/platform/src/linux/mod.rs index e810f8d483d9f893849103ae71b885f44289114e..bc429b0b7ade7f2d16c843cb7fc7dc0f6a423650 100644 --- a/platform/src/linux/mod.rs +++ b/platform/src/linux/mod.rs @@ -57,6 +57,12 @@ pub fn fchdir(fildes: c_int) -> c_int { } } +pub fn fsync(fildes: c_int) -> c_int { + unsafe { + syscall!(FSYNC, fildes) as c_int + } +} + #[cfg(target_arch = "x86_64")] pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int { unsafe { diff --git a/platform/src/redox/mod.rs b/platform/src/redox/mod.rs index f80e5fd3dea3addc746492ea8b82abcf44d7e7c4..a2a207e0cd50ffaba70e936766525aec46bed9f5 100644 --- a/platform/src/redox/mod.rs +++ b/platform/src/redox/mod.rs @@ -3,20 +3,18 @@ use syscall; use c_str; use types::*; -pub unsafe fn cstr_to_slice<'a>(buf: *const c_char) -> &'a [u8] { - slice::from_raw_parts(buf as *const u8, ::strlen(buf) as usize) -} - pub fn brk(addr: *const c_void) -> { syscall::brk(addr as usize)? as c_int -pub fn chdir(path: *const c_char) -> c_int { - syscall::chdir(cstr_to_slice(path))? as c_int -} + pub fn chdir(path: *const c_char) -> c_int { + let path = unsafe { c_str(path) }; + syscall::chdir(path)? as c_int + } + pub fn chown(path: *const c_char, owner: uid_t, group: gid_t) -> c_int { let fd = syscall::open(cstr_to_slice(path)); - syscall::fchown(fd, owner, group)? as c_int + syscall::fchown(fd as usize, owner as usize, group as usize)? as c_int pub fn close(fd: c_int) -> c_int { syscall::close(fd as usize); @@ -37,12 +35,20 @@ pub fn exit(status: c_int) -> ! { } pub fn fchown(fd: c_int, owner: uid_t, group: gid_t) -> c_int { - syscall::fchown(owner, group)? as c_int + syscall::fchown(owner as usize, group as usize)? as c_int } pub fn fchdir(fd: c_int) -> c_int { - let path = fpath(fd as usize, &[]).unwrap(); - syscall::chdir(path)? as c_int + let result = fpath(fd as usize, &[]); + if result.is_ok() { + syscall::chdir(path)? as c_int + } else { + -1 + } +} + +pub fn fsync(fd: c_int) -> c_int { + syscall::fsync(fd as usize)? as c_int } pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int { diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index d60f11bcee45775520522de982f0b6961d59aee2..d965c7d40feac4eb6c7a690c883a57224753b53d 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -156,7 +156,7 @@ pub extern "C" fn fpathconf(fildes: c_int, name: c_int) -> c_long { #[no_mangle] pub extern "C" fn fsync(fildes: c_int) -> c_int { - unimplemented!(); + platform::fsync(fildes) } #[no_mangle]