diff libpam-sys/src/helpers.rs @ 125:2b255c92417b

Introduce base PAM functions; use the real X/SSO PAM header for tests.
author Paul Fisher <paul@pfish.zone>
date Mon, 30 Jun 2025 17:47:32 -0400
parents 98a624cacd82
children c77846f3a979
line wrap: on
line diff
--- a/libpam-sys/src/helpers.rs	Mon Jun 30 04:54:38 2025 -0400
+++ b/libpam-sys/src/helpers.rs	Mon Jun 30 17:47:32 2025 -0400
@@ -57,13 +57,21 @@
 /// ```
 ///
 /// [conversation callback]: crate::ConversationCallback
-/// [message]: crate::Message
+/// [message]: crate::pam_message
 #[derive(Debug)]
 pub struct PtrPtrVec<T> {
     data: Vec<T>,
     pointers: Vec<*const T>,
 }
 
+// Since this is a wrapper around a Vec with no dangerous functionality*,
+// this can be Send and Sync provided the original Vec is.
+//
+// * It will only become unsafe when the user dereferences a pointer or sends it
+// to an unsafe function.
+unsafe impl<T> Send for PtrPtrVec<T> where Vec<T>: Send {}
+unsafe impl<T> Sync for PtrPtrVec<T> where Vec<T>: Sync {}
+
 impl<T> PtrPtrVec<T> {
     /// Takes ownership of the given Vec and creates a vec of pointers to it.
     pub fn new(data: Vec<T>) -> Self {
@@ -509,14 +517,16 @@
     fn test_iter_ptr_ptr() {
         let strs = vec![Box::new("a"), Box::new("b"), Box::new("c"), Box::new("D")];
         let ptr: *const *const &str = strs.as_ptr().cast();
-        let got: Vec<&str> = unsafe {
-            PtrPtrVec::iter_over_linux(ptr, 4)
-        }.cloned().collect();
+        let got: Vec<&str> = unsafe { PtrPtrVec::iter_over_linux(ptr, 4) }
+            .cloned()
+            .collect();
         assert_eq!(vec!["a", "b", "c", "D"], got);
 
         let nums = [-1i8, 2, 3];
         let ptr = nums.as_ptr();
-        let got: Vec<u8> = unsafe { PtrPtrVec::iter_over_xsso(&ptr, 3)}.cloned().collect();
+        let got: Vec<u8> = unsafe { PtrPtrVec::iter_over_xsso(&ptr, 3) }
+            .cloned()
+            .collect();
         assert_eq!(vec![255, 2, 3], got);
     }
 }