comparison libpam-sys/src/lib.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 #![doc = include_str!("../README.md")] 1 #![doc = include_str!("../README.md")]
2 //! 2 //!
3 //! ## PAM implementation 3 //! ## PAM implementation
4 //! 4 //!
5 #![doc = concat!("This documentation was built for the **", __pam_impl_name__!(), "** implementation.")] 5 #![doc = concat!("This documentation was built for the **", env!("LIBPAMSYS_IMPL"), "** implementation.")]
6
7 use libpam_sys_impls::{__pam_impl_enum__, __pam_impl_name__};
8
9 /// A `cfg`-like attribute macro for code specific to one PAM implementation.
10 ///
11 /// Different versions of PAM export different functions and have some
12 /// meaningful internal implementation differences, like the way `pam_conv`
13 /// is handled (see [the Linux-PAM man page for details][man7]).
14 ///
15 /// This macro will let you figure out which PAM you're compiling
16 /// (and eventually running) against so you can make those critical changes.
17 ///
18 /// The implementation names are the same as those in the [`PamImpl`] enum.
19 ///
20 /// ```
21 /// use libpam_sys::cfg_pam_impl;
22 ///
23 /// #[cfg_pam_impl("Sun")]
24 /// fn do_something() { /* Illumos/Solaris-only code */ }
25 ///
26 /// #[cfg_pam_impl(not("Sun"))]
27 /// fn do_something() { /* non-Illumos code */ }
28 ///
29 /// #[cfg_pam_impl(any("LinuxPam", "XSso"))]
30 /// fn do_something_else() { /* Linux-PAM or X/SSO-spec PAM */ }
31 ///
32 /// #[cfg_pam_impl(not(any("Sun", "OpenPam")))]
33 /// fn do_a_third_thing() { /* Neither Sun nor OpenPAM */ }
34 ///
35 /// #[cfg_pam_impl(any())]
36 /// fn this_will_never_build() { /* why would you do this? */ }
37 ///
38 /// #[cfg_pam_impl(not(any()))]
39 /// fn this_will_always_build() { /* I, sure, whatever, you do you. */ }
40 /// ```
41 ///
42 /// [man7]: https://man7.org/linux/man-pages/man3/pam_conv.3.html
43 #[doc(inline)]
44 pub use libpam_sys_impls::cfg_pam_impl;
45 6
46 mod constants; 7 mod constants;
47 mod ffi; 8 mod ffi;
48 pub mod helpers; 9 pub mod helpers;
10 pub mod pam_impl;
49 11
50 #[doc(inline)] 12 #[doc(inline)]
51 pub use crate::{constants::*, ffi::*}; 13 pub use crate::{constants::*, ffi::*, pam_impl::*};
52
53 // Looking for the actual code defining this enum?
54 // It's in the build.rs file for libpam_sys_impls.
55 __pam_impl_enum__!(#[non_exhaustive]);