Mercurial > crates > nonstick
diff build.rs @ 80:5aa1a010f1e8
Start using PAM headers; improve owned/borrowed distinction.
- Uses bindgen to generate bindings (only if needed).
- Gets the story together on owned vs. borrowed handles.
- Reduces number of mutable borrows in handle operation
(since `PamHandle` is neither `Send` nor `Sync`,
we never have to worry about thread safety.
- Improves a bunch of macros so we don't have our own
special syntax for docs.
- Implement question indirection for standard XSSO PAM implementations.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Tue, 10 Jun 2025 01:09:30 -0400 |
parents | |
children | a8f4718fed5d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build.rs Tue Jun 10 01:09:30 2025 -0400 @@ -0,0 +1,58 @@ +use bindgen::MacroTypeVariation; +use std::env; +use std::path::PathBuf; + +fn main() { + if cfg!(feature = "link") { + println!("cargo::rustc-check-cfg=cfg(pam_impl, values(\"linux-pam\",\"openpam\"))"); + let common_builder = bindgen::Builder::default() + .merge_extern_blocks(true) + .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) + .blocklist_type("pam_handle") + .blocklist_type("pam_conv") + .allowlist_var(".*") + .allowlist_function("pam_start") + .allowlist_function("pam_[gs]et_item") + .allowlist_function("pam_get_user") + .allowlist_function("pam_get_authtok") + .allowlist_function("pam_end") + .dynamic_link_require_all(true) + .default_macro_constant_type(MacroTypeVariation::Signed); + + let linux_builder = common_builder.clone().header_contents( + "linux-pam.h", + r#" + #include <security/_pam_types.h> + #include <security/pam_appl.h> + #include <security/pam_ext.h> + #include <security/pam_modules.h> + "#, + ); + let openpam_builder = common_builder.clone().header_contents( + "openpam.h", + r#" + #include <security/openpam.h> + #include <security/pam_appl.h> + #include <security/pam_constants.h> + #include <security/pam_types.h> + "#, + ); + + let (pam_impl, bindings) = { + let bb = linux_builder.generate(); + bb.as_ref().unwrap(); + if let Ok(bindings) = bb { + ("linux-pam", bindings) + } else if let Ok(bindings) = openpam_builder.generate() { + ("openpam", bindings) + } else { + panic!("unrecognized PAM implementation") + } + }; + println!("cargo::rustc-cfg=pam_impl={pam_impl:?}"); + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("bindings.rs")) + .unwrap(); + } +}