@@ -19,6 +19,7 @@ use libc::{mmap, mremap, munmap, off64_t, MAP_SHARED, MREMAP_MAYMOVE, PROT_READ,
19
19
use std:: convert:: TryInto ;
20
20
use std:: ffi:: c_void;
21
21
use std:: os:: unix:: io:: { AsRawFd , RawFd } ;
22
+ use std:: os:: unix:: fs:: { FileExt } ;
22
23
23
24
pub fn removefile ( filename : String ) -> std:: io:: Result < ( ) > {
24
25
let path: RustPathBuf = [ "." . to_string ( ) , filename] . iter ( ) . collect ( ) ;
@@ -141,7 +142,9 @@ impl EmulatedFile {
141
142
unsafe { libc:: sync_file_range ( * fd, offset as off64_t , nbytes as off64_t , flags) }
142
143
}
143
144
144
- // Read from file into provided C-buffer
145
+ // Wrapper around Rust's file object read_at function
146
+ // Reads from file at specified offset into provided C-buffer
147
+ // We need to specify the offset for read/write operations because multiple cages may refer to same system file handle
145
148
pub fn readat ( & self , ptr : * mut u8 , length : usize , offset : usize ) -> std:: io:: Result < usize > {
146
149
let buf = unsafe {
147
150
assert ! ( !ptr. is_null( ) ) ;
@@ -151,18 +154,19 @@ impl EmulatedFile {
151
154
match & self . fobj {
152
155
None => panic ! ( "{} is already closed." , self . filename) ,
153
156
Some ( f) => {
154
- let mut fobj = f. lock ( ) ;
157
+ let fobj = f. lock ( ) ;
155
158
if offset > self . filesize {
156
159
panic ! ( "Seek offset extends past the EOF!" ) ;
157
160
}
158
- fobj. seek ( SeekFrom :: Start ( offset as u64 ) ) ?;
159
- let bytes_read = fobj. read ( buf) ?;
161
+ let bytes_read = fobj. read_at ( buf, offset as u64 ) ?;
160
162
Ok ( bytes_read)
161
163
}
162
164
}
163
165
}
164
166
165
- // Write to file from provided C-buffer
167
+ // Wrapper around Rust's file object write_at function
168
+ // Writes from provided C-buffer into file at specified offset
169
+ // We need to specify the offset for read/write operations because multiple cages may refer to same system file handle
166
170
pub fn writeat (
167
171
& mut self ,
168
172
ptr : * const u8 ,
@@ -179,15 +183,15 @@ impl EmulatedFile {
179
183
match & self . fobj {
180
184
None => panic ! ( "{} is already closed." , self . filename) ,
181
185
Some ( f) => {
182
- let mut fobj = f. lock ( ) ;
186
+ let fobj = f. lock ( ) ;
183
187
if offset > self . filesize {
184
188
panic ! ( "Seek offset extends past the EOF!" ) ;
185
189
}
186
- fobj. seek ( SeekFrom :: Start ( offset as u64 ) ) ?;
187
- bytes_written = fobj. write ( buf) ?;
190
+ bytes_written = fobj. write_at ( buf, offset as u64 ) ?;
188
191
}
189
192
}
190
193
194
+ // update our recorded filesize if we've written past the old filesize
191
195
if offset + length > self . filesize {
192
196
self . filesize = offset + length;
193
197
}
0 commit comments