Revision control
Copy as Markdown
Other Tools
//! Unix user, group, and process identifiers.
//!
//! # Safety
//!
//! The `Uid`, `Gid`, and `Pid` types can be constructed from raw integers,
//! which is marked unsafe because actual OS's assign special meaning to some
//! integer values.
#![allow(unsafe_code)]
use crate::{backend, io};
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
#[cfg(linux_kernel)]
use backend::process::types::RawCpuid;
/// The raw integer value of a Unix user ID.
pub use crate::ugid::RawUid;
/// The raw integer value of a Unix group ID.
pub use crate::ugid::RawGid;
/// The raw integer value of a Unix process ID.
pub use crate::pid::RawPid;
pub use crate::pid::Pid;
pub use crate::ugid::{Gid, Uid};
/// A Linux CPU ID.
#[cfg(linux_kernel)]
#[repr(transparent)]
#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash)]
pub struct Cpuid(RawCpuid);
#[cfg(linux_kernel)]
impl Cpuid {
/// Converts a `RawCpuid` into a `Cpuid`.
///
/// # Safety
///
/// `raw` must be the value of a valid Linux CPU ID.
#[inline]
pub const unsafe fn from_raw(raw: RawCpuid) -> Self {
Self(raw)
}
/// Converts a `Cpuid` into a `RawCpuid`.
#[inline]
pub const fn as_raw(self) -> RawCpuid {
self.0
}
}
/// `getuid()`—Returns the process' real user ID.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
#[must_use]
pub fn getuid() -> Uid {
backend::ugid::syscalls::getuid()
}
/// `geteuid()`—Returns the process' effective user ID.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
#[must_use]
pub fn geteuid() -> Uid {
backend::ugid::syscalls::geteuid()
}
/// `getgid()`—Returns the process' real group ID.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
#[must_use]
pub fn getgid() -> Gid {
backend::ugid::syscalls::getgid()
}
/// `getegid()`—Returns the process' effective group ID.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
#[must_use]
pub fn getegid() -> Gid {
backend::ugid::syscalls::getegid()
}
/// `getpid()`—Returns the process' ID.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
#[must_use]
pub fn getpid() -> Pid {
backend::pid::syscalls::getpid()
}
/// `getppid()`—Returns the parent process' ID.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
#[must_use]
pub fn getppid() -> Option<Pid> {
backend::process::syscalls::getppid()
}
/// `getpgid(pid)`—Returns the process group ID of the given process.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
pub fn getpgid(pid: Option<Pid>) -> io::Result<Pid> {
backend::process::syscalls::getpgid(pid)
}
/// `setpgid(pid, pgid)`—Sets the process group ID of the given process.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
pub fn setpgid(pid: Option<Pid>, pgid: Option<Pid>) -> io::Result<()> {
backend::process::syscalls::setpgid(pid, pgid)
}
/// `getpgrp()`—Returns the process' group ID.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
#[must_use]
pub fn getpgrp() -> Pid {
backend::process::syscalls::getpgrp()
}
/// `getsid(pid)`—Get the session ID of the given process.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[cfg(not(target_os = "redox"))]
#[inline]
pub fn getsid(pid: Option<Pid>) -> io::Result<Pid> {
backend::process::syscalls::getsid(pid)
}
/// `setsid()`—Create a new session.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[inline]
pub fn setsid() -> io::Result<Pid> {
backend::process::syscalls::setsid()
}
/// `getgroups()`—Return a list of the current user's groups.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
#[cfg(feature = "alloc")]
pub fn getgroups() -> io::Result<Vec<Gid>> {
// This code would benefit from having a better way to read into
// uninitialized memory, but that requires `unsafe`.
let mut buffer = Vec::with_capacity(0);
let ngroups = backend::process::syscalls::getgroups(&mut buffer)?;
buffer.resize(ngroups, Gid::ROOT);
backend::process::syscalls::getgroups(&mut buffer)?;
Ok(buffer)
}