pub struct Memfd { /* private fields */ }
Expand description
An anonymous volatile file, with sealing capabilities.
Implementations§
source§impl Memfd
impl Memfd
sourcepub fn try_from_fd<F>(fd: F) -> Result<Self, F>where
F: AsRawFd + IntoRawFd,
pub fn try_from_fd<F>(fd: F) -> Result<Self, F>where F: AsRawFd + IntoRawFd,
Try to convert an object that owns a file descriptor into a Memfd
.
This function consumes the ownership of the specified object. If the underlying
file-descriptor is compatible with memfd/sealing, a Memfd
object is returned.
Otherwise the supplied object is returned as error.
sourcepub fn try_from_file(file: File) -> Result<Self, File>
pub fn try_from_file(file: File) -> Result<Self, File>
Try to convert a File
object into a Memfd
.
This function consumes the ownership of the specified File
. If the underlying
file-descriptor is compatible with memfd/sealing, a Memfd
object is returned.
Otherwise the supplied File
is returned for further usage.
sourcepub const fn as_file(&self) -> &File
pub const fn as_file(&self) -> &File
Return a reference to the backing File
.
Examples found in repository?
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
// Create a sealable memfd.
let opts = memfd::MemfdOptions::default().allow_sealing(true);
let mfd = opts.create("sized-1K").unwrap();
// Resize to 1024B.
mfd.as_file().set_len(1024).unwrap();
// Add seals to prevent further resizing.
mfd.add_seals(&[
memfd::FileSeal::SealShrink,
memfd::FileSeal::SealGrow
]).unwrap();
// Prevent further sealing changes.
mfd.add_seal(memfd::FileSeal::SealSeal).unwrap();
// Write 1K of data, allowed by size seals.
let data_1k = vec![0x00; 1024];
let r = mfd.as_file().write_all(&data_1k);
assert!(r.is_ok());
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
// Write 2K of data, now allowed by size seals.
let data_2k = vec![0x11; 2048];
let r = mfd.as_file().write_all(&data_2k);
assert!(r.is_err());
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
// Try to resize to 2048B, not allowed by size seals.
let r = mfd.as_file().set_len(2048);
assert!(r.is_err());
// Overwrite 1K of data, allowed by size seals.
let data_1k = vec![0x22; 1024];
let r = mfd.as_file().write_all(&data_1k);
assert!(r.is_ok());
}
sourcepub fn seals(&self) -> Result<SealsHashSet, Error>
pub fn seals(&self) -> Result<SealsHashSet, Error>
Obtain the current set of seals for the Memfd
.
sourcepub fn add_seal(&self, seal: FileSeal) -> Result<(), Error>
pub fn add_seal(&self, seal: FileSeal) -> Result<(), Error>
Add a seal to the existing set of seals.
Examples found in repository?
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
// Create a sealable memfd.
let opts = memfd::MemfdOptions::default().allow_sealing(true);
let mfd = opts.create("sized-1K").unwrap();
// Resize to 1024B.
mfd.as_file().set_len(1024).unwrap();
// Add seals to prevent further resizing.
mfd.add_seals(&[
memfd::FileSeal::SealShrink,
memfd::FileSeal::SealGrow
]).unwrap();
// Prevent further sealing changes.
mfd.add_seal(memfd::FileSeal::SealSeal).unwrap();
// Write 1K of data, allowed by size seals.
let data_1k = vec![0x00; 1024];
let r = mfd.as_file().write_all(&data_1k);
assert!(r.is_ok());
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
// Write 2K of data, now allowed by size seals.
let data_2k = vec![0x11; 2048];
let r = mfd.as_file().write_all(&data_2k);
assert!(r.is_err());
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
// Try to resize to 2048B, not allowed by size seals.
let r = mfd.as_file().set_len(2048);
assert!(r.is_err());
// Overwrite 1K of data, allowed by size seals.
let data_1k = vec![0x22; 1024];
let r = mfd.as_file().write_all(&data_1k);
assert!(r.is_ok());
}
sourcepub fn add_seals<'a>(
&self,
seals: impl IntoIterator<Item = &'a FileSeal>
) -> Result<(), Error>
pub fn add_seals<'a>( &self, seals: impl IntoIterator<Item = &'a FileSeal> ) -> Result<(), Error>
Add some seals to the existing set of seals.
Examples found in repository?
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn main() {
// Create a sealable memfd.
let opts = memfd::MemfdOptions::default().allow_sealing(true);
let mfd = opts.create("sized-1K").unwrap();
// Resize to 1024B.
mfd.as_file().set_len(1024).unwrap();
// Add seals to prevent further resizing.
mfd.add_seals(&[
memfd::FileSeal::SealShrink,
memfd::FileSeal::SealGrow
]).unwrap();
// Prevent further sealing changes.
mfd.add_seal(memfd::FileSeal::SealSeal).unwrap();
// Write 1K of data, allowed by size seals.
let data_1k = vec![0x00; 1024];
let r = mfd.as_file().write_all(&data_1k);
assert!(r.is_ok());
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
// Write 2K of data, now allowed by size seals.
let data_2k = vec![0x11; 2048];
let r = mfd.as_file().write_all(&data_2k);
assert!(r.is_err());
mfd.as_file().seek(SeekFrom::Start(0)).unwrap();
// Try to resize to 2048B, not allowed by size seals.
let r = mfd.as_file().set_len(2048);
assert!(r.is_err());
// Overwrite 1K of data, allowed by size seals.
let data_1k = vec![0x22; 1024];
let r = mfd.as_file().write_all(&data_1k);
assert!(r.is_ok());
}