From dca986f599e1abe4270a06efaf91759a926f2424 Mon Sep 17 00:00:00 2001
From: Tomasz Kramkowski <tomasz@kramkow.ski>
Date: Sun, 29 Jan 2023 17:23:14 +0000
Subject: Remove users dependency

---
 Cargo.toml    |  1 -
 src/lib.rs    |  9 ++++++---
 src/passwd.rs | 11 +++++++++++
 3 files changed, 17 insertions(+), 4 deletions(-)
 create mode 100644 src/passwd.rs

diff --git a/Cargo.toml b/Cargo.toml
index 0983fe5..9b5594d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,4 +15,3 @@ crate-type = ["cdylib"]
 cap-std = "1.0.4"
 libc = "0.2.139"
 pam-bindings = "0.1.1"
-users = "0.11.0"
diff --git a/src/lib.rs b/src/lib.rs
index e7b6edc..c104a23 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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
+    }
+}
-- 
cgit v1.2.3-70-g09d2