1use std::fs::File;
6use std::io::Error;
7use std::io::ErrorKind;
8use std::io::Result;
9
10use crate::VolatileSlice;
11
12pub trait FileSync {
16 fn fsync(&self) -> Result<()>;
18
19 fn fdatasync(&self) -> Result<()>;
22}
23
24impl FileSync for File {
25 fn fsync(&self) -> Result<()> {
26 self.sync_all()
27 }
28
29 fn fdatasync(&self) -> Result<()> {
30 self.sync_data()
31 }
32}
33
34pub trait FileSetLen {
39 fn set_len(&self, _len: u64) -> Result<()>;
42}
43
44impl FileSetLen for File {
45 fn set_len(&self, len: u64) -> Result<()> {
46 File::set_len(self, len)
47 }
48}
49
50pub trait FileAllocate {
53 fn allocate(&self, offset: u64, len: u64) -> Result<()>;
55}
56
57pub trait FileGetLen {
62 fn get_len(&self) -> Result<u64>;
64}
65
66impl FileGetLen for File {
67 fn get_len(&self) -> Result<u64> {
68 Ok(self.metadata()?.len())
69 }
70}
71
72pub trait FileReadWriteVolatile {
74 fn read_volatile(&mut self, slice: VolatileSlice) -> Result<usize>;
77
78 fn read_vectored_volatile(&mut self, bufs: &[VolatileSlice]) -> Result<usize> {
84 bufs.iter()
85 .find(|b| b.size() > 0)
86 .map(|&b| self.read_volatile(b))
87 .unwrap_or(Ok(0))
88 }
89
90 fn read_exact_volatile(&mut self, mut slice: VolatileSlice) -> Result<()> {
93 while slice.size() > 0 {
94 let bytes_read = self.read_volatile(slice)?;
95 if bytes_read == 0 {
96 return Err(Error::from(ErrorKind::UnexpectedEof));
97 }
98 slice = slice.offset(bytes_read).unwrap();
101 }
102 Ok(())
103 }
104
105 fn write_volatile(&mut self, slice: VolatileSlice) -> Result<usize>;
108
109 fn write_vectored_volatile(&mut self, bufs: &[VolatileSlice]) -> Result<usize> {
115 bufs.iter()
116 .find(|b| b.size() > 0)
117 .map(|&b| self.write_volatile(b))
118 .unwrap_or(Ok(0))
119 }
120
121 fn write_all_volatile(&mut self, mut slice: VolatileSlice) -> Result<()> {
124 while slice.size() > 0 {
125 let bytes_written = self.write_volatile(slice)?;
126 if bytes_written == 0 {
127 return Err(Error::from(ErrorKind::WriteZero));
128 }
129 slice = slice.offset(bytes_written).unwrap();
132 }
133 Ok(())
134 }
135}
136
137impl<T: FileReadWriteVolatile + ?Sized> FileReadWriteVolatile for &mut T {
138 fn read_volatile(&mut self, slice: VolatileSlice) -> Result<usize> {
139 (**self).read_volatile(slice)
140 }
141
142 fn read_vectored_volatile(&mut self, bufs: &[VolatileSlice]) -> Result<usize> {
143 (**self).read_vectored_volatile(bufs)
144 }
145
146 fn read_exact_volatile(&mut self, slice: VolatileSlice) -> Result<()> {
147 (**self).read_exact_volatile(slice)
148 }
149
150 fn write_volatile(&mut self, slice: VolatileSlice) -> Result<usize> {
151 (**self).write_volatile(slice)
152 }
153
154 fn write_vectored_volatile(&mut self, bufs: &[VolatileSlice]) -> Result<usize> {
155 (**self).write_vectored_volatile(bufs)
156 }
157
158 fn write_all_volatile(&mut self, slice: VolatileSlice) -> Result<()> {
159 (**self).write_all_volatile(slice)
160 }
161}
162
163pub trait FileReadWriteAtVolatile {
165 fn read_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<usize>;
169
170 fn read_vectored_at_volatile(&self, bufs: &[VolatileSlice], offset: u64) -> Result<usize> {
178 if let Some(&slice) = bufs.first() {
179 self.read_at_volatile(slice, offset)
180 } else {
181 Ok(0)
182 }
183 }
184
185 fn read_exact_at_volatile(&self, mut slice: VolatileSlice, mut offset: u64) -> Result<()> {
189 while slice.size() > 0 {
190 match self.read_at_volatile(slice, offset) {
191 Ok(0) => return Err(Error::from(ErrorKind::UnexpectedEof)),
192 Ok(n) => {
193 slice = slice.offset(n).unwrap();
194 offset = offset.checked_add(n as u64).unwrap();
195 }
196 Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
197 Err(e) => return Err(e),
198 }
199 }
200 Ok(())
201 }
202
203 fn write_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<usize>;
207
208 fn write_vectored_at_volatile(&self, bufs: &[VolatileSlice], offset: u64) -> Result<usize> {
216 if let Some(&slice) = bufs.first() {
217 self.write_at_volatile(slice, offset)
218 } else {
219 Ok(0)
220 }
221 }
222
223 fn write_all_at_volatile(&self, mut slice: VolatileSlice, mut offset: u64) -> Result<()> {
227 while slice.size() > 0 {
228 match self.write_at_volatile(slice, offset) {
229 Ok(0) => return Err(Error::from(ErrorKind::WriteZero)),
230 Ok(n) => {
231 slice = slice.offset(n).unwrap();
232 offset = offset.checked_add(n as u64).unwrap();
233 }
234 Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
235 Err(e) => return Err(e),
236 }
237 }
238 Ok(())
239 }
240}
241
242impl<T: FileReadWriteAtVolatile + ?Sized> FileReadWriteAtVolatile for &mut T {
243 fn read_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<usize> {
244 (**self).read_at_volatile(slice, offset)
245 }
246
247 fn read_vectored_at_volatile(&self, bufs: &[VolatileSlice], offset: u64) -> Result<usize> {
248 (**self).read_vectored_at_volatile(bufs, offset)
249 }
250
251 fn read_exact_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<()> {
252 (**self).read_exact_at_volatile(slice, offset)
253 }
254
255 fn write_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<usize> {
256 (**self).write_at_volatile(slice, offset)
257 }
258
259 fn write_vectored_at_volatile(&self, bufs: &[VolatileSlice], offset: u64) -> Result<usize> {
260 (**self).write_vectored_at_volatile(bufs, offset)
261 }
262
263 fn write_all_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<()> {
264 (**self).write_all_at_volatile(slice, offset)
265 }
266}
267
268impl<T: FileReadWriteAtVolatile + ?Sized> FileReadWriteAtVolatile for &T {
269 fn read_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<usize> {
270 (**self).read_at_volatile(slice, offset)
271 }
272
273 fn read_vectored_at_volatile(&self, bufs: &[VolatileSlice], offset: u64) -> Result<usize> {
274 (**self).read_vectored_at_volatile(bufs, offset)
275 }
276
277 fn read_exact_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<()> {
278 (**self).read_exact_at_volatile(slice, offset)
279 }
280
281 fn write_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<usize> {
282 (**self).write_at_volatile(slice, offset)
283 }
284
285 fn write_vectored_at_volatile(&self, bufs: &[VolatileSlice], offset: u64) -> Result<usize> {
286 (**self).write_vectored_at_volatile(bufs, offset)
287 }
288
289 fn write_all_at_volatile(&self, slice: VolatileSlice, offset: u64) -> Result<()> {
290 (**self).write_all_at_volatile(slice, offset)
291 }
292}
293
294#[cfg(test)]
295mod tests {
296 use std::io::Read;
297 use std::io::Seek;
298 use std::io::SeekFrom;
299 use std::io::Write;
300
301 use tempfile::tempfile;
302
303 use super::*;
304
305 #[test]
306 fn read_file() -> Result<()> {
307 let mut f = tempfile()?;
308 f.write_all(b"AAAAAAAAAAbbbbbbbbbbAAAAA")
309 .expect("Failed to write bytes");
310 f.seek(SeekFrom::Start(0))?;
311
312 let mut omem = [0u8; 30];
313 let om = &mut omem[..];
314 let buf = VolatileSlice::new(om);
315 f.read_volatile(buf).expect("read_volatile failed.");
316
317 f.seek(SeekFrom::Start(0))?;
318
319 let mut mem = [0u8; 30];
320 let (m1, rest) = mem.split_at_mut(10);
321 let (m2, m3) = rest.split_at_mut(10);
322 let buf1 = VolatileSlice::new(m1);
323 let buf2 = VolatileSlice::new(m2);
324 let buf3 = VolatileSlice::new(m3);
325 let bufs = [buf1, buf2, buf3];
326
327 f.read_vectored_volatile(&bufs)
328 .expect("read_vectored_volatile failed.");
329
330 assert_eq!(&mem[..], b"AAAAAAAAAAbbbbbbbbbbAAAAA\0\0\0\0\0");
331 Ok(())
332 }
333
334 #[test]
335 fn write_file() -> Result<()> {
336 let mut f = tempfile()?;
337
338 let mut omem = [0u8; 25];
339 let om = &mut omem[..];
340 let buf = VolatileSlice::new(om);
341 buf.write_bytes(65);
342 f.write_volatile(buf).expect("write_volatile failed.");
343
344 f.seek(SeekFrom::Start(0))?;
345
346 let mut filebuf = [0u8; 25];
347 f.read_exact(&mut filebuf).expect("Failed to read filebuf");
348 assert_eq!(&filebuf, b"AAAAAAAAAAAAAAAAAAAAAAAAA");
349 Ok(())
350 }
351
352 #[test]
353 fn write_vectored_file() -> Result<()> {
354 let mut f = tempfile()?;
355
356 let mut mem = [0u8; 30];
357 let (m1, rest) = mem.split_at_mut(10);
358 let (m2, m3) = rest.split_at_mut(10);
359 let buf1 = VolatileSlice::new(m1);
360 let buf2 = VolatileSlice::new(m2);
361 let buf3 = VolatileSlice::new(m3);
362 buf1.write_bytes(65);
363 buf2.write_bytes(98);
364 buf3.write_bytes(65);
365 let bufs = [buf1, buf2, buf3];
366 f.write_vectored_volatile(&bufs)
367 .expect("write_vectored_volatile failed.");
368
369 f.seek(SeekFrom::Start(0))?;
370
371 let mut filebuf = [0u8; 30];
372 f.read_exact(&mut filebuf).expect("Failed to read filebuf.");
373 assert_eq!(&filebuf, b"AAAAAAAAAAbbbbbbbbbbAAAAAAAAAA");
374 Ok(())
375 }
376
377 #[test]
378 fn read_at_file() -> Result<()> {
379 let mut f = tempfile()?;
380 f.write_all(b"AAAAAAAAAAbbbbbbbbbbAAAAA")
381 .expect("Failed to write bytes.");
382
383 let mut omem = [0u8; 20];
384 let om = &mut omem[..];
385 let buf = VolatileSlice::new(om);
386 f.read_at_volatile(buf, 10)
387 .expect("read_at_volatile failed.");
388
389 assert_eq!(om, b"bbbbbbbbbbAAAAA\0\0\0\0\0");
390
391 let mut mem = [0u8; 20];
392 let (m1, m2) = mem.split_at_mut(10);
393 let buf1 = VolatileSlice::new(m1);
394 let buf2 = VolatileSlice::new(m2);
395 let bufs = [buf1, buf2];
396
397 f.read_vectored_at_volatile(&bufs, 10)
398 .expect("read_vectored_at_volatile failed.");
399
400 assert_eq!(&mem[..], b"bbbbbbbbbbAAAAA\0\0\0\0\0");
401 Ok(())
402 }
403
404 #[test]
405 fn write_at_file() -> Result<()> {
406 let mut f = tempfile()?;
407 f.write_all(b"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ")
408 .expect("Failed to write bytes");
409
410 let mut omem = [0u8; 15];
411 let om = &mut omem[..];
412 let buf = VolatileSlice::new(om);
413 buf.write_bytes(65);
414 f.write_at_volatile(buf, 10)
415 .expect("write_at_volatile failed.");
416
417 f.seek(SeekFrom::Start(0))?;
418
419 let mut filebuf = [0u8; 30];
420 f.read_exact(&mut filebuf).expect("Failed to read filebuf.");
421 assert_eq!(&filebuf, b"ZZZZZZZZZZAAAAAAAAAAAAAAAZZZZZ");
422 Ok(())
423 }
424
425 #[test]
426 fn write_vectored_at_file() -> Result<()> {
427 let mut f = tempfile()?;
428 f.write_all(b"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ")
429 .expect("Failed to write bytes");
430
431 let mut mem = [0u8; 30];
432 let (m1, m2) = mem.split_at_mut(10);
433 let buf1 = VolatileSlice::new(m1);
434 let buf2 = VolatileSlice::new(m2);
435 buf1.write_bytes(65);
436 buf2.write_bytes(98);
437 let bufs = [buf1, buf2];
438 f.write_vectored_at_volatile(&bufs, 10)
439 .expect("write_vectored_at_volatile failed.");
440
441 f.seek(SeekFrom::Start(0))?;
442
443 let mut filebuf = [0u8; 30];
444 f.read_exact(&mut filebuf).expect("Failed to read filebuf.");
445 assert_eq!(&filebuf, b"ZZZZZZZZZZAAAAAAAAAAbbbbbbbbbb");
446 Ok(())
447 }
448}