Struct memfd::Memfd

source ·
pub struct Memfd { /* private fields */ }
Available on Android or Linux only.
Expand description

An anonymous volatile file, with sealing capabilities.

Implementations§

source§

impl Memfd

source

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.

source

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.

source

pub const fn as_file(&self) -> &File

Return a reference to the backing File.

Examples found in repository?
examples/sized.rs (line 18)
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());
}
source

pub fn into_file(self) -> File

Convert Memfd to the backing File.

source

pub fn seals(&self) -> Result<SealsHashSet, Error>

Obtain the current set of seals for the Memfd.

source

pub fn add_seal(&self, seal: FileSeal) -> Result<(), Error>

Add a seal to the existing set of seals.

Examples found in repository?
examples/sized.rs (line 27)
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());
}
source

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?
examples/sized.rs (lines 21-24)
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());
}

Trait Implementations§

source§

impl AsRawFd for Memfd

source§

fn as_raw_fd(&self) -> RawFd

Extracts the raw file descriptor. Read more
source§

impl Debug for Memfd

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromRawFd for Memfd

source§

unsafe fn from_raw_fd(fd: RawFd) -> Self

Convert a raw file-descriptor to a Memfd.

This function consumes ownership of the specified file descriptor. Memfd will take responsibility for closing it when the object goes out of scope.

Safety

fd must be a valid file descriptor representing a memfd file.

source§

impl IntoRawFd for Memfd

source§

fn into_raw_fd(self) -> RawFd

Consumes this object, returning the raw underlying file descriptor. Read more

Auto Trait Implementations§

§

impl RefUnwindSafe for Memfd

§

impl Send for Memfd

§

impl Sync for Memfd

§

impl Unpin for Memfd

§

impl UnwindSafe for Memfd

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.