comparison src/constants.rs @ 185:fb8b547b36b7

Banish al(most al)l use of `i32` in favor of `c_int`.
author Paul Fisher <paul@pfish.zone>
date Thu, 31 Jul 2025 14:45:38 -0400
parents a1bb1d013567
children 5e4ea9650f87
comparison
equal deleted inserted replaced
184:42f747774d94 185:fb8b547b36b7
1 //! Constants and enum values from the PAM library. 1 //! Constants and enum values from the PAM library.
2 2
3 use crate::_doc::{linklist, man7, manbsd, mansun, xsso}; 3 use crate::_doc::{linklist, man7, manbsd, mansun, xsso};
4 use bitflags::bitflags; 4 use bitflags::bitflags;
5 use std::error::Error; 5 use std::error::Error;
6 use std::ffi::c_int;
6 use std::fmt; 7 use std::fmt;
7 use std::result::Result as StdResult; 8 use std::result::Result as StdResult;
8 9
9 macro_rules! wrapper { 10 macro_rules! wrapper {
10 ( 11 (
12 $viz:vis $name:ident($wraps:ty); 13 $viz:vis $name:ident($wraps:ty);
13 ) => { 14 ) => {
14 $(#[$m])* 15 $(#[$m])*
15 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 16 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
16 #[repr(transparent)] 17 #[repr(transparent)]
17 $viz struct $name(i32); 18 $viz struct $name($wraps);
18 19
19 impl From<i32> for $name { 20 impl From<$wraps> for $name {
20 fn from(value: i32) -> Self { 21 fn from(value: $wraps) -> Self {
21 Self(value) 22 Self(value)
22 } 23 }
23 } 24 }
24 impl From<$name> for i32 { 25 impl From<$name> for $wraps {
25 fn from(value: $name) -> Self { 26 fn from(value: $name) -> Self {
26 value.0 27 value.0
27 } 28 }
28 } 29 }
29 } 30 }
30 } 31 }
31 32
32 wrapper! { 33 wrapper! {
33 /// Type of the flags that PAM passes to us (or that we pass to PAM). 34 /// Type of the flags that PAM passes to us (or that we pass to PAM).
34 pub RawFlags(i32); 35 pub RawFlags(c_int);
35 } 36 }
36 wrapper! { 37 wrapper! {
37 /// The error code that we return to PAM. 38 /// The error code that we return to PAM.
38 pub ReturnCode(i32); 39 pub ReturnCode(c_int);
39 } 40 }
40 41
41 impl ReturnCode { 42 impl ReturnCode {
42 /// A successful return. 43 /// A successful return.
43 pub const SUCCESS: Self = Self(0); 44 pub const SUCCESS: Self = Self(0);
66 67
67 #[cfg(feature = "link")] 68 #[cfg(feature = "link")]
68 impl From<RawFlags> for $name { 69 impl From<RawFlags> for $name {
69 #[allow(unused_doc_comments)] 70 #[allow(unused_doc_comments)]
70 fn from(value: RawFlags) -> Self { 71 fn from(value: RawFlags) -> Self {
71 let value: i32 = value.into(); 72 let value: c_int = value.into();
72 let result = Self::empty(); 73 let result = Self::empty();
73 $( 74 $(
74 $(#[$m_ident $($m_arg)*])* 75 $(#[$m_ident $($m_arg)*])*
75 let result = result | if value & $value_value == 0 { 76 let result = result | if value & $value_value == 0 {
76 Self::empty() 77 Self::empty()
182 } 183 }
183 } 184 }
184 185
185 #[cfg(feature = "link")] 186 #[cfg(feature = "link")]
186 impl $name { 187 impl $name {
187 const ALL_VALUES: i32 = 0 $( | $item_value)*; 188 const ALL_VALUES: c_int = 0 $( | $item_value)*;
188 189
189 fn split(value: RawFlags) -> Result<(Option<Self>, RawFlags)> { 190 fn split(value: RawFlags) -> Result<(Option<Self>, RawFlags)> {
190 let me = value.0 & Self::ALL_VALUES; 191 let me = value.0 & Self::ALL_VALUES;
191 let them = (value.0 & !Self::ALL_VALUES).into(); 192 let them = (value.0 & !Self::ALL_VALUES).into();
192 let me = match RawFlags(me) { 193 let me = match RawFlags(me) {
377 impl fmt::Display for ErrorCode { 378 impl fmt::Display for ErrorCode {
378 #[cfg(any(pam_impl = "LinuxPam", pam_impl = "OpenPam", pam_impl = "Sun"))] 379 #[cfg(any(pam_impl = "LinuxPam", pam_impl = "OpenPam", pam_impl = "Sun"))]
379 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 380 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
380 use std::ffi::CStr; 381 use std::ffi::CStr;
381 use std::ptr; 382 use std::ptr;
383 let retcode: ReturnCode = (*self).into();
382 // SAFETY: PAM impls don't care about the PAM handle and always return 384 // SAFETY: PAM impls don't care about the PAM handle and always return
383 // static strings. 385 // static strings.
384 let got = unsafe { libpam_sys::pam_strerror(ptr::null(), *self as i32) }; 386 let got = unsafe { libpam_sys::pam_strerror(ptr::null(), retcode.into()) };
385 if got.is_null() { 387 if got.is_null() {
386 // This shouldn't happen. 388 // This shouldn't happen.
387 write!(f, "PAM error: {self:?} ({:?})", *self as i32) 389 write!(f, "PAM error: {self:?} ({:?})", retcode)
388 } else { 390 } else {
389 // SAFETY: We just got this back from PAM and we checked if it's null. 391 // SAFETY: We just got this back from PAM and we checked if it's null.
390 f.write_str(&unsafe { CStr::from_ptr(got) }.to_string_lossy()) 392 f.write_str(&unsafe { CStr::from_ptr(got) }.to_string_lossy())
391 } 393 }
392 } 394 }
412 pub const BAD_CONST: ErrorCode = ErrorCode::BadConstant; 414 pub const BAD_CONST: ErrorCode = ErrorCode::BadConstant;
413 /// Returned when an invalid constant is used. 415 /// Returned when an invalid constant is used.
414 #[cfg(not(feature = "openpam-ext"))] 416 #[cfg(not(feature = "openpam-ext"))]
415 pub const BAD_CONST: ErrorCode = ErrorCode::SystemError; 417 pub const BAD_CONST: ErrorCode = ErrorCode::SystemError;
416 418
417 pub(crate) fn result_from(ret: i32) -> Result<()> { 419 pub(crate) fn result_from(ret: c_int) -> Result<()> {
418 match ret { 420 match ret {
419 0 => Ok(()), 421 0 => Ok(()),
420 value => Err(ReturnCode(value).try_into().unwrap_or(Self::BAD_CONST)), 422 value => Err(ReturnCode(value).try_into().unwrap_or(Self::BAD_CONST)),
421 } 423 }
422 } 424 }