Mercurial > crates > nonstick
view build.rs @ 90:f6186e41399b
Miscellaneous fixes and cleanup:
- Rename `get_user` to `username` and `get_authtok` to `authtok`.
- Use pam_strerror for error messages.
- Add library linkage to build.rs (it was missing???).
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sat, 14 Jun 2025 09:30:16 -0400 |
parents | a638a45e5f1f |
children | 5ddbcada30f2 |
line wrap: on
line source
use bindgen::MacroTypeVariation; use std::env; use std::path::PathBuf; fn main() { if cfg!(feature = "link") { println!("cargo::rustc-link-lib=pam"); 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") .allowlist_function("pam_strerror") .default_macro_constant_type(MacroTypeVariation::Unsigned); let linux_builder = common_builder .clone() // This function is not available in OpenPAM. // We don't use it, but we include it so that if the user // tries to run this against the wrong PAM library, it fails. .allowlist_function("pam_start_confdir") .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() // This function is not available in Linux-PAM. // We don't use it, but we include it so that if the user // tries to run this against the wrong PAM library, it fails. .allowlist_function("pam_setenv") .header_contents( "openpam.h", r#" #include <security/pam_types.h> #include <security/openpam.h> #include <security/pam_appl.h> #include <security/pam_constants.h> "#, ); let (pam_impl, bindings) = { if let Ok(bindings) = linux_builder.generate() { ("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(); } }