diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 9 | ||||
| -rw-r--r-- | src/passwd.rs | 11 | 
2 files changed, 17 insertions, 3 deletions
@@ -1,9 +1,11 @@  // Copyright (C) 2023  Tomasz Kramkowski <tomasz@kramkow.ski>  // SPDX-License-Identifier: MIT +mod passwd; +  use cap_std::fs::{Dir, OpenOptions};  use pam::module::PamHandle; -use std::ffi::{c_char, c_int}; +use std::ffi::{c_char, c_int, CString};  use std::io::{ErrorKind, Write};  use std::panic;  use std::path::Path; @@ -31,8 +33,9 @@ impl From<std::io::Error> for SessionError {  fn open_session(h: &PamHandle, mountpoint: &str) -> Result<(), SessionError> {      let user = h.get_user(None).or(Err(SessionError))?; -    let user = users::get_user_by_name(&user).ok_or(SessionError)?; -    let uid = user.uid().to_string(); +    let user = CString::new(user).or(Err(SessionError))?; +    let uid = passwd::get_uid_by_name(&user).ok_or(SessionError)?; +    let uid = uid.to_string();      let d = Dir::open_ambient_dir(mountpoint, cap_std::ambient_authority())?;      let d = create_and_open_dir(&d, "user")?;      let d = create_and_open_dir(&d, &uid)?; diff --git a/src/passwd.rs b/src/passwd.rs new file mode 100644 index 0000000..40ec947 --- /dev/null +++ b/src/passwd.rs @@ -0,0 +1,11 @@ +use libc::uid_t; +use std::ffi::CStr; + +pub fn get_uid_by_name<S: AsRef<CStr> + ?Sized>(name: &S) -> Option<uid_t> { +    let passwd = unsafe { libc::getpwnam(name.as_ref().as_ptr()) }; +    if !passwd.is_null() { +        Some(unsafe { *passwd }.pw_uid) +    } else { +        None +    } +}  | 
