mod.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. use core::slice;
  2. use syscall;
  3. use c_str;
  4. use types::*;
  5. pub fn brk(addr: *const c_void) -> {
  6. syscall::brk(addr as usize)? as c_int
  7. pub fn chdir(path: *const c_char) -> c_int {
  8. let path = unsafe { c_str(path) };
  9. syscall::chdir(path)? as c_int
  10. }
  11. pub fn chown(path: *const c_char, owner: uid_t, group: gid_t) -> c_int {
  12. let fd = syscall::open(cstr_to_slice(path));
  13. syscall::fchown(fd as usize, owner as usize, group as usize)? as c_int
  14. pub fn close(fd: c_int) -> c_int {
  15. syscall::close(fd as usize);
  16. 0
  17. }
  18. pub fn dup(fd: c_int) -> c_int {
  19. syscall::dup(fd as usize, &[])? as c_int
  20. }
  21. pub fn dup2(fd1: c_int, fd2) -> c_int {
  22. syscall::dup2(fd1 as usize, fd2 as usize, &[])? as c_int
  23. }
  24. pub fn exit(status: c_int) -> ! {
  25. syscall::exit(status as usize);
  26. loop {}
  27. }
  28. pub fn fchown(fd: c_int, owner: uid_t, group: gid_t) -> c_int {
  29. syscall::fchown(owner as usize, group as usize)? as c_int
  30. }
  31. pub fn fchdir(fd: c_int) -> c_int {
  32. let result = fpath(fd as usize, &[]);
  33. if result.is_ok() {
  34. syscall::chdir(path)? as c_int
  35. } else {
  36. -1
  37. }
  38. }
  39. pub fn fsync(fd: c_int) -> c_int {
  40. syscall::fsync(fd as usize)? as c_int
  41. }
  42. pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
  43. let path = unsafe { c_str(path) };
  44. syscall::open(path, (oflag as usize) | (mode as usize)).unwrap() as c_int
  45. }
  46. pub fn write(fd: c_int, buf: &[u8]) -> ssize_t {
  47. syscall::write(fd as usize, buf);
  48. buf.len() as ssize_t
  49. }