diff --git a/src/header/pwd/mod.rs b/src/header/pwd/mod.rs index 5a238a0a60..13af962835 100644 --- a/src/header/pwd/mod.rs +++ b/src/header/pwd/mod.rs @@ -1,4 +1,6 @@ -//! pwd implementation for relibc +//! `pwd.h` implementation. +//! +//! See . use alloc::{boxed::Box, vec::Vec}; use core::{ @@ -30,6 +32,10 @@ const SEPARATOR: u8 = b':'; #[cfg(target_os = "redox")] const SEPARATOR: u8 = b';'; +/// See +/// for POSIX minimum requirements, and +/// for further +/// details. #[repr(C)] #[derive(Debug)] pub struct passwd { @@ -213,6 +219,45 @@ unsafe fn mux( } } +/// See . +#[no_mangle] +pub extern "C" fn endpwent() { + unsafe { + READER = None; + } +} + +/// See . +#[no_mangle] +pub extern "C" fn getpwent() -> *mut passwd { + let reader = match unsafe { &mut READER } { + Some(reader) => reader, + None => { + let file = match File::open(c_str!("/etc/passwd"), fcntl::O_RDONLY) { + Ok(file) => file, + Err(_) => return ptr::null_mut(), + }; + let reader = BufReader::new(file); + unsafe { + READER = Some(reader); + READER.as_mut().unwrap() + } + } + }; + getpwent_r(reader, None) + .map(|res| res.into_global()) + .unwrap_or(ptr::null_mut()) +} + +/// See . +#[no_mangle] +pub extern "C" fn getpwnam(name: *const c_char) -> *mut passwd { + pwd_lookup(|parts| unsafe { strcmp(parts.pw_name, name) } == 0, None) + .map(|res| res.into_global()) + .unwrap_or(ptr::null_mut()) +} + +/// See . #[no_mangle] pub unsafe extern "C" fn getpwnam_r( name: *const c_char, @@ -234,6 +279,15 @@ pub unsafe extern "C" fn getpwnam_r( ) } +/// See . +#[no_mangle] +pub extern "C" fn getpwuid(uid: uid_t) -> *mut passwd { + pwd_lookup(|parts| parts.pw_uid == uid, None) + .map(|res| res.into_global()) + .unwrap_or(ptr::null_mut()) +} + +/// See . #[no_mangle] pub unsafe extern "C" fn getpwuid_r( uid: uid_t, @@ -256,51 +310,10 @@ pub unsafe extern "C" fn getpwuid_r( ) } -#[no_mangle] -pub extern "C" fn getpwnam(name: *const c_char) -> *mut passwd { - pwd_lookup(|parts| unsafe { strcmp(parts.pw_name, name) } == 0, None) - .map(|res| res.into_global()) - .unwrap_or(ptr::null_mut()) -} - -#[no_mangle] -pub extern "C" fn getpwuid(uid: uid_t) -> *mut passwd { - pwd_lookup(|parts| parts.pw_uid == uid, None) - .map(|res| res.into_global()) - .unwrap_or(ptr::null_mut()) -} - -#[no_mangle] -pub extern "C" fn getpwent() -> *mut passwd { - let reader = match unsafe { &mut READER } { - Some(reader) => reader, - None => { - let file = match File::open(c_str!("/etc/passwd"), fcntl::O_RDONLY) { - Ok(file) => file, - Err(_) => return ptr::null_mut(), - }; - let reader = BufReader::new(file); - unsafe { - READER = Some(reader); - READER.as_mut().unwrap() - } - } - }; - getpwent_r(reader, None) - .map(|res| res.into_global()) - .unwrap_or(ptr::null_mut()) -} - +/// See . #[no_mangle] pub extern "C" fn setpwent() { if let Some(reader) = unsafe { &mut READER } { let _ = reader.seek(SeekFrom::Start(0)); } } - -#[no_mangle] -pub extern "C" fn endpwent() { - unsafe { - READER = None; - } -}