diff src/libpam/handle.rs @ 116:a12706e42c9d default tip

Logging, macros, and building: - Changes logging API to accept the `Location` of the log statement. Fixes OpenPAM implementation. - Stops publicly exporting doc macros. - Uses dlopen to detect the PAM library rather than header jankery.
author Paul Fisher <paul@pfish.zone>
date Sun, 29 Jun 2025 18:27:51 -0400
parents 13b4d2a19674
children
line wrap: on
line diff
--- a/src/libpam/handle.rs	Sun Jun 29 03:35:59 2025 -0400
+++ b/src/libpam/handle.rs	Sun Jun 29 18:27:51 2025 -0400
@@ -6,10 +6,10 @@
 use crate::libpam::environ::{LibPamEnviron, LibPamEnvironMut};
 pub use crate::libpam::pam_ffi::LibPamHandle;
 use crate::libpam::{memory, pam_ffi};
-use crate::logging::Level;
+use crate::logging::{Level, Location};
 use crate::{
-    Conversation, EnvironMap, Flags, PamHandleApplication, PamHandleModule, _guide, _linklist,
-    _stdlinks,
+    Conversation, EnvironMap, Flags, PamHandleApplication, PamHandleModule, guide, linklist,
+    stdlinks,
 };
 use num_enum::{IntoPrimitive, TryFromPrimitive};
 use std::cell::Cell;
@@ -82,10 +82,10 @@
     /// named <code>/etc/pam.d/<var>service_name</var></code>.
     ///
     /// # References
-    #[doc = _linklist!(pam_start: adg, _std)]
+    #[doc = linklist!(pam_start: adg, _std)]
     ///
-    #[doc = _stdlinks!(3 pam_start)]
-    #[doc = _guide!(adg: "adg-interface-by-app-expected.html#adg-pam_start")]
+    #[doc = stdlinks!(3 pam_start)]
+    #[doc = guide!(adg: "adg-interface-by-app-expected.html#adg-pam_start")]
     pub fn build_with_service(service_name: String) -> HandleBuilder {
         HandleBuilder {
             service_name,
@@ -161,10 +161,10 @@
     /// This internally calls `pam_end` with the appropriate error code.
     ///
     /// # References
-    #[doc = _linklist!(pam_end: adg, _std)]
+    #[doc = linklist!(pam_end: adg, _std)]
     ///
-    #[doc = _guide!(adg: "adg-interface-by-app-expected.html#adg-pam_end")]
-    #[doc = _stdlinks!(3 pam_end)]
+    #[doc = guide!(adg: "adg-interface-by-app-expected.html#adg-pam_end")]
+    #[doc = stdlinks!(3 pam_end)]
     fn drop(&mut self) {
         unsafe {
             pam_ffi::pam_end(
@@ -190,13 +190,14 @@
 }
 
 impl PamShared for LibPamHandle {
-    fn log(&self, level: Level, entry: &str) {
+    fn log(&self, level: Level, loc: Location<'_>, entry: &str) {
         let entry = match CString::new(entry).or_else(|_| CString::new(dbg!(entry))) {
             Ok(cstr) => cstr,
             _ => return,
         };
         #[cfg(pam_impl = "linux-pam")]
         {
+            _ = loc;
             // SAFETY: We're calling this function with a known value.
             unsafe {
                 pam_ffi::pam_syslog(self, level as c_int, "%s\0".as_ptr().cast(), entry.as_ptr())
@@ -204,9 +205,10 @@
         }
         #[cfg(pam_impl = "openpam")]
         {
+            let func = CString::new(loc.function).unwrap_or(CString::default());
             // SAFETY: We're calling this function with a known value.
             unsafe {
-                pam_ffi::openpam_log(self, level as c_int, "%s\0".as_ptr().cast(), entry.as_ptr())
+                pam_ffi::_openpam_log(level as c_int, func.as_ptr(), "%s\0".as_ptr().cast(), entry.as_ptr())
             }
         }
     }
@@ -382,7 +384,7 @@
 }
 
 impl PamShared for OwnedLibPamHandle<'_> {
-    delegate!(fn log(&self, level: Level, entry: &str) -> ());
+    delegate!(fn log(&self, level: Level, location: Location<'_>, entry: &str) -> ());
     delegate!(fn environ(&self) -> impl EnvironMap);
     delegate!(fn environ_mut(&mut self) -> impl EnvironMapMut);
     delegate!(fn username(&mut self, prompt: Option<&str>) -> Result<String>);