    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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
    50
    51
    52
    53

    #[cfg(any(target_os = "android", target_os = "linux"))]
    use crate::process::Pid;
    use crate::{backend, io};

    pub use backend::process::types::Resource;

    /// `struct rlimit`—Current and maximum values used in [`getrlimit`],
    /// [`setrlimit`], and [`prlimit`].
    #[derive(Debug, Clone, PartialEq, Eq)]
    pub struct Rlimit {
        /// Current effective, "soft", limit.
        pub current: Option<u64>,
        /// Maximum, "hard", value that `current` may be dynamically increased to.
        pub maximum: Option<u64>,
    }

    /// `getrlimit(resource)`—Get a process resource limit value.
    ///
    /// # References
    ///  - [POSIX]
    ///  - [Linux]
    ///
    /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getrlimit.html
    /// [Linux]: https://man7.org/linux/man-pages/man2/getrlimit.2.html
    #[inline]
    pub fn getrlimit(resource: Resource) -> Rlimit {
        backend::process::syscalls::getrlimit(resource)
    }

    /// `setrlimit(resource, new)`—Set a process resource limit value.
    ///
    /// # References
    ///  - [POSIX]
    ///  - [Linux]
    ///
    /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setrlimit.html
    /// [Linux]: https://man7.org/linux/man-pages/man2/setrlimit.2.html
    #[inline]
    pub fn setrlimit(resource: Resource, new: Rlimit) -> io::Result<()> {
        backend::process::syscalls::setrlimit(resource, new)
    }

    /// `prlimit(pid, resource, new)`—Get and set a process resource limit value.
    ///
    /// # References
    ///  - [Linux]
    ///
    /// [Linux]: https://man7.org/linux/man-pages/man2/prlimit.2.html
    #[cfg(any(target_os = "android", target_os = "linux"))]
    #[inline]
    pub fn prlimit(pid: Option<Pid>, resource: Resource, new: Rlimit) -> io::Result<Rlimit> {
        backend::process::syscalls::prlimit(pid, resource, new)
    }