Mercurial > crates > nonstick
comparison libpam-sys/src/helpers.rs @ 134:6c1e1bdb4164
Use standard #[cfg] directives rather than custom proc macros.
Instead of having to do a bunch of custom parsing and other logic
that tools often choke on, this change introduces an easy way
to depend upon custom #[cfg]s provided by the libpam-sys crate.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Thu, 03 Jul 2025 11:03:36 -0400 |
parents | c77846f3a979 |
children |
comparison
equal
deleted
inserted
replaced
133:32b2a545ca3e | 134:6c1e1bdb4164 |
---|---|
1 //! This module contains a few non-required helpers to deal with some of the | 1 //! This module contains a few non-required helpers to deal with some of the |
2 //! more annoying memory management in the PAM API. | 2 //! more annoying memory management in the PAM API. |
3 | 3 |
4 use super::cfg_pam_impl; | |
5 use std::error::Error; | 4 use std::error::Error; |
6 use std::marker::{PhantomData, PhantomPinned}; | 5 use std::marker::{PhantomData, PhantomPinned}; |
7 use std::mem::ManuallyDrop; | 6 use std::mem::ManuallyDrop; |
8 use std::ptr::NonNull; | 7 use std::ptr::NonNull; |
9 use std::{any, fmt, mem, slice}; | 8 use std::{any, fmt, mem, slice}; |
131 { | 130 { |
132 Self::assert_size::<Src>(); | 131 Self::assert_size::<Src>(); |
133 slice::from_raw_parts(*ptr_ptr.cast(), count).iter() | 132 slice::from_raw_parts(*ptr_ptr.cast(), count).iter() |
134 } | 133 } |
135 | 134 |
136 #[cfg_pam_impl("LinuxPam")] | |
137 unsafe fn _iter_over<'a, Src>( | |
138 ptr_ptr: *const *const Src, | |
139 count: usize, | |
140 ) -> impl Iterator<Item = &'a T> | |
141 where | |
142 T: 'a, | |
143 { | |
144 #[allow(deprecated)] | |
145 Self::iter_over_linux(ptr_ptr, count) | |
146 } | |
147 | |
148 #[cfg_pam_impl(not("LinuxPam"))] | |
149 unsafe fn _iter_over<'a, Src>( | |
150 ptr_ptr: *const *const Src, | |
151 count: usize, | |
152 ) -> impl Iterator<Item = &'a T> | |
153 where | |
154 T: 'a, | |
155 { | |
156 #[allow(deprecated)] | |
157 Self::iter_over_xsso(ptr_ptr, count) | |
158 } | |
159 | |
160 /// Iterates over a PAM message list appropriate to your system's impl. | 135 /// Iterates over a PAM message list appropriate to your system's impl. |
161 /// | 136 /// |
162 /// This selects the correct pointer/array structure to use for a message | 137 /// This selects the correct pointer/array structure to use for a message |
163 /// that was given to you by your system. | 138 /// that was given to you by your system. |
164 /// | 139 /// |
165 /// # Safety | 140 /// # Safety |
166 /// | 141 /// |
167 /// `ptr_ptr` must point to a valid message list, there must be at least | 142 /// `ptr_ptr` must point to a valid message list, there must be at least |
168 /// `count` messages in the list, and all messages must be a valid `Src`. | 143 /// `count` messages in the list, and all messages must be a valid `Src`. |
144 #[allow(deprecated)] | |
169 pub unsafe fn iter_over<'a, Src>( | 145 pub unsafe fn iter_over<'a, Src>( |
170 ptr_ptr: *const *const Src, | 146 ptr_ptr: *const *const Src, |
171 count: usize, | 147 count: usize, |
172 ) -> impl Iterator<Item = &'a T> | 148 ) -> impl Iterator<Item = &'a T> |
173 where | 149 where |
174 T: 'a, | 150 T: 'a, |
175 { | 151 { |
176 Self::_iter_over(ptr_ptr, count) | 152 #[cfg(pam_impl = "LinuxPam")] |
153 return Self::iter_over_linux(ptr_ptr, count); | |
154 #[cfg(not(pam_impl = "LinuxPam"))] | |
155 return Self::iter_over_xsso(ptr_ptr, count); | |
177 } | 156 } |
178 | 157 |
179 fn assert_size<That>() { | 158 fn assert_size<That>() { |
180 debug_assert_eq!( | 159 debug_assert_eq!( |
181 mem::size_of::<T>(), | 160 mem::size_of::<T>(), |