@@ -81,7 +81,11 @@ impl MapData {
8181}
8282
8383/// Creates a mapping specified by the uid and size
84- pub fn create_mapping ( unique_id : & str , map_size : usize ) -> Result < MapData , ShmemError > {
84+ pub fn create_mapping (
85+ unique_id : & str ,
86+ map_size : usize ,
87+ writable : bool ,
88+ ) -> Result < MapData , ShmemError > {
8589 //Create shared memory file descriptor
8690 debug ! ( "Creating persistent mapping at {}" , unique_id) ;
8791
@@ -124,21 +128,26 @@ pub fn create_mapping(unique_id: &str, map_size: usize) -> Result<MapData, Shmem
124128
125129 //Put the mapping in our address space
126130 debug ! ( "Loading mapping into address space" ) ;
131+ let access = if writable {
132+ ProtFlags :: PROT_READ | ProtFlags :: PROT_WRITE
133+ } else {
134+ ProtFlags :: PROT_READ
135+ } ;
127136 new_map. map_ptr = match unsafe {
128137 mmap (
129- None , //Desired addr
130- nz_map_size, //size of mapping
131- ProtFlags :: PROT_READ | ProtFlags :: PROT_WRITE , //Permissions on pages
132- MapFlags :: MAP_SHARED , //What kind of mapping
133- new_map. map_fd , //fd
134- 0 , //Offset into fd
138+ None , //Desired addr
139+ nz_map_size, //size of mapping
140+ access , //Permissions on pages
141+ MapFlags :: MAP_SHARED , //What kind of mapping
142+ new_map. map_fd , //fd
143+ 0 , //Offset into fd
135144 )
136145 } {
137146 Ok ( v) => {
138147 trace ! (
139148 "mmap(NULL, {}, {:X}, {:X}, {}, 0) == {:p}" ,
140149 new_map. map_size,
141- ProtFlags :: PROT_READ | ProtFlags :: PROT_WRITE ,
150+ access ,
142151 MapFlags :: MAP_SHARED ,
143152 new_map. map_fd,
144153 v
@@ -156,6 +165,7 @@ pub fn open_mapping(
156165 unique_id : & str ,
157166 _map_size : usize ,
158167 _ext : & ShmemConfExt ,
168+ writable : bool ,
159169) -> Result < MapData , ShmemError > {
160170 //Open shared memory
161171 debug ! ( "Openning persistent mapping at {}" , unique_id) ;
@@ -195,21 +205,26 @@ pub fn open_mapping(
195205
196206 //Map memory into our address space
197207 debug ! ( "Loading mapping into address space" ) ;
208+ let access = if writable {
209+ ProtFlags :: PROT_READ | ProtFlags :: PROT_WRITE
210+ } else {
211+ ProtFlags :: PROT_READ
212+ } ;
198213 new_map. map_ptr = match unsafe {
199214 mmap (
200- None , //Desired addr
201- nz_map_size, //size of mapping
202- ProtFlags :: PROT_READ | ProtFlags :: PROT_WRITE , //Permissions on pages
203- MapFlags :: MAP_SHARED , //What kind of mapping
204- new_map. map_fd , //fd
205- 0 , //Offset into fd
215+ None , //Desired addr
216+ nz_map_size, //size of mapping
217+ access , //Permissions on pages
218+ MapFlags :: MAP_SHARED , //What kind of mapping
219+ new_map. map_fd , //fd
220+ 0 , //Offset into fd
206221 )
207222 } {
208223 Ok ( v) => {
209224 trace ! (
210225 "mmap(NULL, {}, {:X}, {:X}, {}, 0) == {:p}" ,
211226 new_map. map_size,
212- ProtFlags :: PROT_READ | ProtFlags :: PROT_WRITE ,
227+ access ,
213228 MapFlags :: MAP_SHARED ,
214229 new_map. map_fd,
215230 v
0 commit comments