mod.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 ftruncate(fd: c_int, len: off_t) -> {
  43. syscall::ftruncate(fd as usize, len as usize)? as c_int
  44. }
  45. pub fn getcwd(buf: *mut c_char, size: size_t) -> {
  46. // XXX: do something with size maybe
  47. let rbuf = unsafe { c_str(buf) };
  48. syscall::getcwd(rbuf)? as c_int
  49. }
  50. pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
  51. let path = unsafe { c_str(path) };
  52. syscall::open(path, (oflag as usize) | (mode as usize)).unwrap() as c_int
  53. }
  54. pub fn write(fd: c_int, buf: &[u8]) -> ssize_t {
  55. syscall::write(fd as usize, buf);
  56. buf.len() as ssize_t
  57. }