Skip to content

Commit 219ff05

Browse files
author
Luca Bruno
authored
Merge pull request #2 from lucab/ups/example-sized
examples: add a size-sealing example
2 parents abd3ade + 3b4ce7c commit 219ff05

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ fn new_sized_memfd() -> Result<memfd::Memfd> {
3838
}
3939
```
4040

41+
Some more examples are available under [examples](examples).
42+
4143
## License
4244

4345
Licensed under either of

examples/sized.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//! A simple example showing how to crate size-sealed memfd.
2+
//!
3+
//! It creates a new memfd and seals to on a fixed 1K size.
4+
//!
5+
//! This is an example ONLY: do NOT panic/unwrap/assert
6+
//! in production code!
7+
8+
extern crate memfd;
9+
10+
use std::io::{Seek, SeekFrom, Write};
11+
12+
fn main() {
13+
// Create a sealable memfd.
14+
let opts = memfd::MemfdOptions::default().allow_sealing(true);
15+
let mfd = opts.create("sized-1K").unwrap();
16+
17+
// Resize to 1024B.
18+
mfd.as_file().set_len(1024).unwrap();
19+
20+
// Add seals to prevent further resizing.
21+
let mut seals = memfd::SealsHashSet::new();
22+
seals.insert(memfd::FileSeal::SealShrink);
23+
seals.insert(memfd::FileSeal::SealGrow);
24+
mfd.add_seals(&seals).unwrap();
25+
26+
// Prevent further sealing changes.
27+
mfd.add_seal(memfd::FileSeal::SealSeal).unwrap();
28+
29+
// Write 1K of data, allowed by size seals.
30+
let data_1k = vec![0x00; 1024];
31+
let r = mfd.as_file().write_all(&data_1k);
32+
assert!(r.is_ok());
33+
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
34+
35+
// Write 2K of data, now allowed by size seals.
36+
let data_2k = vec![0x11; 2048];
37+
let r = mfd.as_file().write_all(&data_2k);
38+
assert!(r.is_err());
39+
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
40+
41+
// Try to resize to 2048B, not allowed by size seals.
42+
let r = mfd.as_file().set_len(2048);
43+
assert!(r.is_err());
44+
45+
// Overwrite 1K of data, allowed by size seals.
46+
let data_1k = vec![0x22; 1024];
47+
let r = mfd.as_file().write_all(&data_1k);
48+
assert!(r.is_ok());
49+
}

0 commit comments

Comments
 (0)