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