mod.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. use crate::{
  2. c_str::{CStr, CString},
  3. header::{fcntl, unistd},
  4. platform::{types::*, Pal, Sys},
  5. };
  6. pub use self::sys::*;
  7. #[cfg(target_os = "linux")]
  8. #[path = "linux.rs"]
  9. pub mod sys;
  10. #[cfg(target_os = "dragonos")]
  11. #[path = "dragonos.rs"]
  12. pub mod sys;
  13. #[cfg(target_os = "redox")]
  14. #[path = "redox.rs"]
  15. pub mod sys;
  16. pub const MADV_NORMAL: c_int = 0;
  17. pub const MADV_RANDOM: c_int = 1;
  18. pub const MADV_SEQUENTIAL: c_int = 2;
  19. pub const MADV_WILLNEED: c_int = 3;
  20. pub const MADV_DONTNEED: c_int = 4;
  21. pub const MAP_SHARED: c_int = 0x0001;
  22. pub const MAP_PRIVATE: c_int = 0x0002;
  23. pub const MAP_TYPE: c_int = 0x000F;
  24. pub const MAP_ANON: c_int = 0x0020;
  25. pub const MAP_ANONYMOUS: c_int = MAP_ANON;
  26. pub const MS_ASYNC: c_int = 0x0001;
  27. pub const MS_INVALIDATE: c_int = 0x0002;
  28. pub const MS_SYNC: c_int = 0x0004;
  29. pub const MCL_CURRENT: c_int = 1;
  30. pub const MCL_FUTURE: c_int = 2;
  31. pub const POSIX_MADV_NORMAL: c_int = 0;
  32. pub const POSIX_MADV_RANDOM: c_int = 1;
  33. pub const POSIX_MADV_SEQUENTIAL: c_int = 2;
  34. pub const POSIX_MADV_WILLNEED: c_int = 3;
  35. pub const POSIX_MADV_WONTNEED: c_int = 4;
  36. #[no_mangle]
  37. pub unsafe extern "C" fn mlock(addr: *const c_void, len: usize) -> c_int {
  38. Sys::mlock(addr, len)
  39. }
  40. #[no_mangle]
  41. pub extern "C" fn mlockall(flags: c_int) -> c_int {
  42. Sys::mlockall(flags)
  43. }
  44. #[no_mangle]
  45. pub unsafe extern "C" fn mmap(
  46. addr: *mut c_void,
  47. len: size_t,
  48. prot: c_int,
  49. flags: c_int,
  50. fildes: c_int,
  51. off: off_t,
  52. ) -> *mut c_void {
  53. Sys::mmap(addr, len, prot, flags, fildes, off)
  54. }
  55. #[no_mangle]
  56. pub unsafe extern "C" fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int {
  57. Sys::mprotect(addr, len, prot)
  58. }
  59. #[no_mangle]
  60. pub unsafe extern "C" fn msync(addr: *mut c_void, len: size_t, flags: c_int) -> c_int {
  61. Sys::msync(addr, len, flags)
  62. }
  63. #[no_mangle]
  64. pub unsafe extern "C" fn munlock(addr: *const c_void, len: usize) -> c_int {
  65. Sys::munlock(addr, len)
  66. }
  67. #[no_mangle]
  68. pub extern "C" fn munlockall() -> c_int {
  69. Sys::munlockall()
  70. }
  71. #[no_mangle]
  72. pub unsafe extern "C" fn munmap(addr: *mut c_void, len: size_t) -> c_int {
  73. Sys::munmap(addr, len)
  74. }
  75. #[cfg(target_os = "linux")]
  76. static SHM_PATH: &'static [u8] = b"/dev/shm/";
  77. #[cfg(target_os = "dragonos")]
  78. static SHM_PATH: &'static [u8] = b"/dev/shm/";
  79. #[cfg(target_os = "redox")]
  80. static SHM_PATH: &'static [u8] = b"shm:";
  81. unsafe fn shm_path(name: *const c_char) -> CString {
  82. let name_c = CStr::from_ptr(name);
  83. let mut path = SHM_PATH.to_vec();
  84. let mut skip_slash = true;
  85. for &b in name_c.to_bytes() {
  86. if skip_slash {
  87. if b == b'/' {
  88. continue;
  89. } else {
  90. skip_slash = false;
  91. }
  92. }
  93. path.push(b);
  94. }
  95. CString::from_vec_unchecked(path)
  96. }
  97. #[no_mangle]
  98. pub unsafe extern "C" fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
  99. let path = shm_path(name);
  100. fcntl::sys_open(path.as_ptr(), oflag, mode)
  101. }
  102. #[no_mangle]
  103. pub unsafe extern "C" fn shm_unlink(name: *const c_char) -> c_int {
  104. let path = shm_path(name);
  105. unistd::unlink(path.as_ptr())
  106. }