xref: /relibc/src/header/sys_mman/mod.rs (revision a2f2484e4559206922b0fcc16217598a6867c8a2)
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