Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  memfd.rs   Sprache: unbekannt

 
//! Interfaces for managing memory-backed files.

use cfg_if::cfg_if;
use std::os::unix::io::{FromRawFd, OwnedFd, RawFd};

use crate::errno::Errno;
use crate::Result;
use std::ffi::CStr;

libc_bitflags!(
    /// Options that change the behavior of [`memfd_create`].
    pub struct MemFdCreateFlag: libc::c_uint {
        /// Set the close-on-exec ([`FD_CLOEXEC`]) flag on the new file descriptor.
        ///
        /// By default, the new file descriptor is set to remain open across an [`execve`]
        /// (the `FD_CLOEXEC` flag is initially disabled). This flag can be used to change
        /// this default. The file offset is set to the beginning of the file (see [`lseek`]).
        ///
        /// See also the description of the `O_CLOEXEC` flag in [`open(2)`].
        ///
        /// [`execve`]: crate::unistd::execve
        /// [`lseek`]: crate::unistd::lseek
        /// [`FD_CLOEXEC`]: crate::fcntl::FdFlag::FD_CLOEXEC
        /// [`open(2)`]: https://man7.org/linux/man-pages/man2/open.2.html
        MFD_CLOEXEC;
        /// Allow sealing operations on this file.
        ///
        /// See also the file sealing notes given in [`memfd_create(2)`].
        ///
        /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html
        MFD_ALLOW_SEALING;
        /// Anonymous file will be created using huge pages. It should be safe now to
        /// combine with [`MFD_ALLOW_SEALING`] too.
        /// However, despite its presence, on FreeBSD it is unimplemented for now (ENOSYS).
        ///
        /// See also the hugetlb filesystem in [`memfd_create(2)`].
        ///
        /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html
        #[cfg(linux_android)]
        MFD_HUGETLB;
        /// Following are to be used with [`MFD_HUGETLB`], indicating the desired hugetlb size.
        ///
        /// See also the hugetlb filesystem in [`memfd_create(2)`].
        ///
        /// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html
        #[cfg(linux_android)]
        MFD_HUGE_1MB;
        /// hugetlb size of 2MB.
        #[cfg(linux_android)]
        MFD_HUGE_2MB;
        /// hugetlb size of 8MB.
        #[cfg(linux_android)]
        MFD_HUGE_8MB;
        /// hugetlb size of 16MB.
        #[cfg(linux_android)]
        MFD_HUGE_16MB;
        /// hugetlb size of 32MB.
        #[cfg(linux_android)]
        MFD_HUGE_32MB;
        /// hugetlb size of 256MB.
        #[cfg(linux_android)]
        MFD_HUGE_256MB;
        /// hugetlb size of 512MB.
        #[cfg(linux_android)]
        MFD_HUGE_512MB;
        /// hugetlb size of 1GB.
        #[cfg(linux_android)]
        MFD_HUGE_1GB;
        /// hugetlb size of 2GB.
        #[cfg(linux_android)]
        MFD_HUGE_2GB;
        /// hugetlb size of 16GB.
        #[cfg(linux_android)]
        MFD_HUGE_16GB;
    }
);

/// Creates an anonymous file that lives in memory, and return a file-descriptor to it.
///
/// The file behaves like a regular file, and so can be modified, truncated, memory-mapped, and so on.
/// However, unlike a regular file, it lives in RAM and has a volatile backing storage.
///
/// For more information, see [`memfd_create(2)`].
///
/// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html
#[inline] // Delays codegen, preventing linker errors with dylibs and --no-allow-shlib-undefined
pub fn memfd_create(name: &CStr, flags: MemFdCreateFlag) -> Result<OwnedFd> {
    let res = unsafe {
        cfg_if! {
            if #[cfg(all(
                // Android does not have a memfd_create symbol
                not(target_os = "android"),
                any(
                    target_os = "freebsd",
                    // If the OS is Linux, gnu and musl expose a memfd_create symbol but not uclibc
                    target_env = "gnu",
                    target_env = "musl",
                )))]
            {
                libc::memfd_create(name.as_ptr(), flags.bits())
            } else {
                libc::syscall(libc::SYS_memfd_create, name.as_ptr(), flags.bits())
            }
        }
    };

    Errno::result(res).map(|r| unsafe { OwnedFd::from_raw_fd(r as RawFd) })
}

[ Dauer der Verarbeitung: 0.26 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge