Mercurial > crates > nonstick
comparison libpam-sys/src/lib.rs @ 148:4b3a5095f68c
Move libpam-sys helpers into their own library.
- Renames libpam-sys-helpers to libpam-sys-consts.
- Moves libpam-sys-helpers::helpers into libpam-sys-helpers,
which moves them completely out of libpam-sys's dependency chain.
- Moves the aliases from libpam-sys into libpam-sys::aliases.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Mon, 07 Jul 2025 12:11:43 -0400 |
| parents | 999bf07efbcb |
| children | 3036f2e6a022 |
comparison
equal
deleted
inserted
replaced
| 147:4d7333337569 | 148:4b3a5095f68c |
|---|---|
| 1 //! `libpam-sys` provides low-level access to `libpam`. | 1 //! `libpam-sys` provides low-level access to LibPAM. |
| 2 //! | 2 //! |
| 3 //! Everything in here is directly as exported from the `libpam` library or | 3 //! Everything in here is directly as exported from the LibPAM library or |
| 4 //! its header files, with limited exceptions: | 4 //! its header files, with two exceptions: |
| 5 //! | 5 //! |
| 6 //! - The [`pam_impl`] submodule (and the [`pam_impl_name!`] macro) contains | 6 //! - The [`pam_impl`] submodule (and the associated [`pam_impl_name!`] macro), |
| 7 //! tools for detecting the current PAM library. | 7 //! which can be used to detect the current PAM implementation. |
| 8 //! - [`AppData`] is an opaque pointer newtype. | 8 //! - The [`aliases`] submodule, which contains convenient aliases |
| 9 //! - [`ConversationCallback`] and [`CleanupCallback`] are aliases for | 9 //! for callback types used in libpam, so you don't have to type |
| 10 //! what are otherwise anonymous function types. | 10 //! `unsafe extern "C" fn(this is so long)` all the time. |
| 11 //! | 11 //! |
| 12 #![doc = concat!("This documentation was built for the **", pam_impl_name!(), "** implementation.")] | 12 #![doc = concat!("This documentation was built for the **", pam_impl_name!(), "** implementation.")] |
| 13 //! | 13 //! |
| 14 //! You can override this **at build time** by setting the `LIBPAMSYS_IMPL` | 14 //! You can override this **at build time** by setting the `LIBPAMSYS_IMPL` |
| 15 //! environment variable to one of the values of the [`pam_impl::PamImpl`] enum. | 15 //! environment variable to one of the values of the [`pam_impl::PamImpl`] enum. |
| 16 //! | 16 //! For more information about configuration, see the documentation of |
| 17 //! For more information about configuration, see [the README](https://crates.io/crate/libpam-sys). | 17 //! [`libpam-sys-consts`](https://crates.io/crates/libpam-sys-consts). |
| 18 #![allow(non_camel_case_types)] | 18 #![allow(non_camel_case_types)] |
| 19 #![allow(unused_imports)] | 19 #![allow(unused_imports)] |
| 20 | 20 |
| 21 pub mod aliases; | |
| 21 #[doc(inline)] | 22 #[doc(inline)] |
| 22 pub use libpam_sys_helpers::constants::*; | 23 pub use libpam_sys_consts::constants::*; |
| 23 #[doc(inline)] | 24 #[doc(inline)] |
| 24 pub use libpam_sys_helpers::{pam_impl, pam_impl_name}; | 25 pub use libpam_sys_consts::{pam_impl, pam_impl_name}; |
| 25 use std::ffi::{c_char, c_int, c_uint, c_void}; | 26 use std::ffi::{c_char, c_int, c_uint, c_void}; |
| 26 use std::fmt; | 27 use std::fmt; |
| 27 use std::marker::{PhantomData, PhantomPinned}; | 28 use std::marker::{PhantomData, PhantomPinned}; |
| 28 | 29 |
| 29 /// A marker struct to make whatever it's in `!Sync`, `!Send`, and `!Unpin`. | |
| 30 #[derive(Default, PartialOrd, PartialEq, Ord, Eq)] | |
| 31 #[repr(C)] | |
| 32 struct ExtremelyUnsafe { | |
| 33 _value: (), | |
| 34 _marker: PhantomData<(PhantomPinned, *mut c_void)>, | |
| 35 } | |
| 36 | |
| 37 impl fmt::Debug for ExtremelyUnsafe { | |
| 38 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| 39 write!(f, "ExtremelyUnsafe({self:p})") | |
| 40 } | |
| 41 } | |
| 42 | |
| 43 /// An opaque structure that PAM uses to communicate. | 30 /// An opaque structure that PAM uses to communicate. |
| 44 /// | 31 /// |
| 45 /// This is only ever returned in pointer form and cannot be constructed. | 32 /// This is only ever returned in pointer form and cannot be constructed. |
| 46 #[repr(C)] | 33 #[repr(C)] |
| 47 pub struct pam_handle(ExtremelyUnsafe); | 34 pub struct pam_handle { |
| 35 _value: (), | |
| 36 _marker: PhantomData<(PhantomPinned, *mut c_void)>, | |
| 37 } | |
| 48 | 38 |
| 49 impl fmt::Debug for pam_handle { | 39 impl fmt::Debug for pam_handle { |
| 50 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 51 write!(f, "pam_handle({self:p}") | 41 write!(f, "pam_handle({self:p}") |
| 52 } | 42 } |
| 53 } | 43 } |
| 54 | |
| 55 /// An opaque structure that is passed through PAM in a conversation. | |
| 56 #[repr(C)] | |
| 57 pub struct AppData(ExtremelyUnsafe); | |
| 58 | |
| 59 impl fmt::Debug for AppData { | |
| 60 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| 61 write!(f, "AppData({self:p}") | |
| 62 } | |
| 63 } | |
| 64 | |
| 65 /// Just an alias for the type of [`pam_conv::conv`]. | |
| 66 /// | |
| 67 /// For important details about the format of `messages`, | |
| 68 /// see [`libpam_sys_helpers::memory::PtrPtrVec`]. | |
| 69 /// | |
| 70 /// ```no_run | |
| 71 /// # use libpam_sys::{ConversationCallback, pam_conv}; | |
| 72 /// fn convo() -> ConversationCallback { | |
| 73 /// // ... | |
| 74 /// # unimplemented!() | |
| 75 /// } | |
| 76 /// let conv = pam_conv{conv: convo(), appdata_ptr: std::ptr::null_mut()}; | |
| 77 /// ``` | |
| 78 pub type ConversationCallback = unsafe extern "C" fn( | |
| 79 num_msg: c_int, | |
| 80 msg: *const *const pam_message, | |
| 81 resp: *mut *mut pam_response, | |
| 82 appdata: *mut AppData, | |
| 83 ) -> c_int; | |
| 84 | |
| 85 /// Alias for the callback to [`pam_set_data`]. | |
| 86 /// | |
| 87 /// ```no_run | |
| 88 /// # use std::ffi::CString; | |
| 89 /// use libpam_sys::{CleanupCallback, pam_set_data}; | |
| 90 /// # use libpam_sys::pam_handle; | |
| 91 /// # let handle: *mut pam_handle = std::ptr::null_mut(); | |
| 92 /// # let mut my_data = 100; | |
| 93 /// # let data_ptr = &mut my_data as *mut i32; | |
| 94 /// fn cleanup() -> CleanupCallback { | |
| 95 /// // ... | |
| 96 /// # unimplemented!() | |
| 97 /// } | |
| 98 /// let name = CString::new("name").unwrap(); | |
| 99 /// unsafe { | |
| 100 /// pam_set_data(handle, name.as_ptr().cast_mut(), data_ptr.cast(), cleanup()); | |
| 101 /// } | |
| 102 /// ``` | |
| 103 pub type CleanupCallback = | |
| 104 unsafe extern "C" fn(pamh: *mut pam_handle, data: *mut c_void, pam_end_status: c_int); | |
| 105 | 44 |
| 106 /// Used by PAM to communicate between the module and the application. | 45 /// Used by PAM to communicate between the module and the application. |
| 107 #[repr(C)] | 46 #[repr(C)] |
| 108 pub struct pam_conv { | 47 pub struct pam_conv { |
| 109 pub conv: unsafe extern "C" fn( | 48 pub conv: unsafe extern "C" fn( |
| 110 num_msg: c_int, | 49 num_msg: c_int, |
| 111 msg: *const *const pam_message, | 50 msg: *const *const pam_message, |
| 112 resp: *mut *mut pam_response, | 51 resp: *mut *mut pam_response, |
| 113 appdata: *mut AppData, | 52 appdata: *mut c_void, |
| 114 ) -> c_int, | 53 ) -> c_int, |
| 115 pub appdata_ptr: *mut AppData, | 54 pub appdata_ptr: *mut c_void, |
| 116 } | 55 } |
| 117 | 56 |
| 118 /// A message sent into a PAM conversation. | 57 /// A message sent into a PAM conversation. |
| 119 #[repr(C)] | 58 #[repr(C)] |
| 120 pub struct pam_message { | 59 pub struct pam_message { |
