comparison src/constants.rs @ 131:a632a8874131

Get all the Linux-PAM functions into libpam-sys, and get tests right.
author Paul Fisher <paul@pfish.zone>
date Wed, 02 Jul 2025 02:24:21 -0400
parents 80c07e5ab22f
children efbc235f01d3
comparison
equal deleted inserted replaced
130:80c07e5ab22f 131:a632a8874131
4 // between Linux-PAM and OpenPAM header files. 4 // between Linux-PAM and OpenPAM header files.
5 #![allow(clippy::unnecessary_cast)] 5 #![allow(clippy::unnecessary_cast)]
6 6
7 use crate::{linklist, man7, manbsd, xsso}; 7 use crate::{linklist, man7, manbsd, xsso};
8 use bitflags::bitflags; 8 use bitflags::bitflags;
9 use std::ffi::c_int;
10 use num_enum::{IntoPrimitive, TryFromPrimitive}; 9 use num_enum::{IntoPrimitive, TryFromPrimitive};
11 use std::error::Error; 10 use std::error::Error;
11 use std::ffi::c_int;
12 use std::fmt;
12 use std::fmt::{Display, Formatter}; 13 use std::fmt::{Display, Formatter};
13 use std::result::Result as StdResult; 14 use std::result::Result as StdResult;
14 use std::fmt;
15 15
16 /// Values for constants not provided by certain PAM implementations. 16 /// Values for constants not provided by certain PAM implementations.
17 /// 17 ///
18 /// **The values of these constants are deliberately selected _not_ to match 18 /// **The values of these constants are deliberately selected _not_ to match
19 /// any PAM implementations. Applications should always use the symbolic value 19 /// any PAM implementations. Applications should always use the symbolic value
30 }; 30 };
31 (@meta $m:tt $($i:item)+) => { define!(@expand $($m $i)+); }; 31 (@meta $m:tt $($i:item)+) => { define!(@expand $($m $i)+); };
32 (@expand $({ $(#[$m:meta])* } $i:item)+) => {$($(#[$m])* $i)+}; 32 (@expand $({ $(#[$m:meta])* } $i:item)+) => {$($(#[$m])* $i)+};
33 } 33 }
34 34
35
36 define!( 35 define!(
37 /// A fictitious constant for testing purposes. 36 /// A fictitious constant for testing purposes.
38 #[cfg(not(feature = "link"))] 37 #[cfg(not(feature = "link"))]
39 #[cfg_pam_impl(not("OpenPam"))] 38 #[cfg_pam_impl(not("OpenPam"))]
40 PAM_BAD_CONSTANT = 513; 39 PAM_BAD_CONSTANT = 513;
54 #[cfg(not(feature = "link"))] 53 #[cfg(not(feature = "link"))]
55 #[cfg_pam_impl(not("LinuxPam"))] 54 #[cfg_pam_impl(not("LinuxPam"))]
56 PAM_CONV_AGAIN = 517; 55 PAM_CONV_AGAIN = 517;
57 PAM_INCOMPLETE = 518; 56 PAM_INCOMPLETE = 518;
58 ); 57 );
59
60 } 58 }
61 59
62 bitflags! { 60 bitflags! {
63 /// The available PAM flags. 61 /// The available PAM flags.
64 /// 62 ///
202 } 200 }
203 } 201 }
204 202
205 /// A basic Display implementation for if we don't link against PAM. 203 /// A basic Display implementation for if we don't link against PAM.
206 fn fmt_internal(self, f: &mut Formatter<'_>) -> fmt::Result { 204 fn fmt_internal(self, f: &mut Formatter<'_>) -> fmt::Result {
207 let n : c_int = self.into(); 205 let n: c_int = self.into();
208 write!(f, "PAM error: {self:?} ({n})") 206 write!(f, "PAM error: {self:?} ({n})")
209 } 207 }
210 } 208 }
211 209
212 /// Gets a string version of an error message. 210 /// Gets a string version of an error message.
213 #[cfg(feature = "link")] 211 #[cfg(feature = "link")]
214 pub fn strerror(code: c_int) -> Option<&'static str> { 212 pub fn strerror(code: c_int) -> Option<&'static str> {
213 use std::ffi::CStr;
215 use std::ptr; 214 use std::ptr;
216 use std::ffi::CStr;
217 // SAFETY: PAM impls don't care about the PAM handle and always return 215 // SAFETY: PAM impls don't care about the PAM handle and always return
218 // static strings. 216 // static strings.
219 let strerror = unsafe { libpam_sys::pam_strerror(ptr::null(), code as c_int) }; 217 let strerror = unsafe { libpam_sys::pam_strerror(ptr::null(), code as c_int) };
220 // SAFETY: We just got this back from PAM and we checked if it's null. 218 // SAFETY: We just got this back from PAM and we checked if it's null.
221 (!strerror.is_null()) 219 (!strerror.is_null())