Mercurial > crates > nonstick
comparison libpam-sys/src/structs.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 | 476a22db8639 |
| children |
comparison
equal
deleted
inserted
replaced
| 124:f469b8d9ad78 | 125:2b255c92417b |
|---|---|
| 1 //! Structs and wrappers that PAM is made of. | |
| 2 #![allow(non_camel_case_types)] | |
| 3 | |
| 1 use std::ffi::{c_int, c_void}; | 4 use std::ffi::{c_int, c_void}; |
| 2 use std::fmt; | 5 use std::fmt; |
| 3 use std::marker::{PhantomData, PhantomPinned}; | 6 use std::marker::{PhantomData, PhantomPinned}; |
| 4 | 7 |
| 5 /// A marker struct to make whatever it's in `!Sync`, `!Send`, and `!Unpin`. | 8 /// A marker struct to make whatever it's in `!Sync`, `!Send`, and `!Unpin`. |
| 6 #[derive(Default, PartialOrd, PartialEq, Ord, Eq)] | 9 #[derive(Default, PartialOrd, PartialEq, Ord, Eq)] |
| 7 #[repr(transparent)] | 10 #[repr(C)] |
| 8 struct ExtremelyUnsafe(PhantomData<(PhantomPinned, *mut c_void)>); | 11 struct ExtremelyUnsafe { |
| 12 _value: (), | |
| 13 _marker: PhantomData<(PhantomPinned, *mut c_void)>, | |
| 14 } | |
| 9 | 15 |
| 10 impl fmt::Debug for ExtremelyUnsafe { | 16 impl fmt::Debug for ExtremelyUnsafe { |
| 11 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 17 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 12 f.write_str("ExtremelyUnsafe") | 18 f.write_str("ExtremelyUnsafe") |
| 13 } | 19 } |
| 15 | 21 |
| 16 /// An opaque structure that PAM uses to communicate. | 22 /// An opaque structure that PAM uses to communicate. |
| 17 /// | 23 /// |
| 18 /// This is only ever returned in pointer form and cannot be constructed. | 24 /// This is only ever returned in pointer form and cannot be constructed. |
| 19 #[repr(C)] | 25 #[repr(C)] |
| 20 pub struct PamHandle { | 26 pub struct pam_handle_t(ExtremelyUnsafe); |
| 21 _marker: ExtremelyUnsafe, | |
| 22 } | |
| 23 | 27 |
| 24 impl fmt::Debug for PamHandle { | 28 impl fmt::Debug for pam_handle_t { |
| 25 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 26 write!(f, "PamHandle({self:p}") | 30 write!(f, "PamHandle({self:p}") |
| 27 } | 31 } |
| 28 } | 32 } |
| 29 | 33 |
| 30 /// An opaque structure that is passed through PAM in a conversation. | 34 /// An opaque structure that is passed through PAM in a conversation. |
| 31 pub struct AppData { | 35 #[repr(C)] |
| 32 _marker: ExtremelyUnsafe, | 36 pub struct AppData(ExtremelyUnsafe); |
| 33 } | |
| 34 | 37 |
| 35 impl fmt::Debug for AppData { | 38 impl fmt::Debug for AppData { |
| 36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 39 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 37 write!(f, "AppData({self:p}") | 40 write!(f, "AppData({self:p}") |
| 38 } | 41 } |
| 45 pub type ConversationCallback = unsafe extern "C" fn( | 48 pub type ConversationCallback = unsafe extern "C" fn( |
| 46 num_msg: c_int, | 49 num_msg: c_int, |
| 47 // This is a *const *const because accessing memory from a reference | 50 // This is a *const *const because accessing memory from a reference |
| 48 // outside its bounds is undefined behavior, and *messages is an array | 51 // outside its bounds is undefined behavior, and *messages is an array |
| 49 // in X/SSO PAM impls. | 52 // in X/SSO PAM impls. |
| 50 messages: *const *const Message, | 53 msg: *const *const pam_message, |
| 51 // This is a &mut *mut because the caller sets the pointer in `responses` | 54 // This is a &mut *mut because the caller sets the pointer in `resp` |
| 52 // but does not mess around outside its memory space. | 55 // but does not mess around outside its memory space. |
| 53 responses: &mut *mut Response, | 56 resp: &mut *mut pam_response, |
| 54 appdata: *const AppData, | 57 appdata: *const AppData, |
| 58 ) -> c_int; | |
| 59 | |
| 60 /// Called to clean up data set using [`pam_set_data`](crate::pam_set_data). | |
| 61 pub type CleanupCallback = unsafe extern "C" fn( | |
| 62 pamh: *mut pam_handle_t, | |
| 63 data: *mut c_void, | |
| 64 pam_end_status: c_int, | |
| 55 ) -> c_int; | 65 ) -> c_int; |
| 56 | 66 |
| 57 /// Used by PAM to communicate between the module and the application. | 67 /// Used by PAM to communicate between the module and the application. |
| 58 #[repr(C)] | 68 #[repr(C)] |
| 59 pub struct Conversation { | 69 pub struct pam_conv { |
| 60 pub callback: ConversationCallback, | 70 pub conv: ConversationCallback, |
| 61 pub appdata: *const AppData, | 71 pub appdata_ptr: *const AppData, |
| 62 } | 72 } |
| 63 | 73 |
| 64 /// A message sent into a PAM conversation. | 74 /// A message sent into a PAM conversation. |
| 65 #[repr(C)] | 75 #[repr(C)] |
| 66 pub struct Message { | 76 pub struct pam_message { |
| 67 pub style: c_int, | 77 pub msg_style: c_int, |
| 68 pub data: *const c_void, | 78 pub msg: *const c_void, |
| 69 } | 79 } |
| 70 | 80 |
| 71 /// A response returned from a PAM conversation. | 81 /// A response returned from a PAM conversation. |
| 72 #[repr(C)] | 82 #[repr(C)] |
| 73 pub struct Response { | 83 pub struct pam_response { |
| 74 pub data: *mut c_void, | 84 pub resp: *mut c_void, |
| 75 pub _unused: c_int, | 85 /// Completely unused. |
| 86 pub resp_retcode: c_int, | |
| 76 } | 87 } |
