Mercurial > crates > nonstick
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); } }