Mercurial > crates > nonstick
comparison libpam-sys/libpam-sys-test/build.rs @ 121:397743cb70e2
Make libpam-sys-tests work on Illumos!
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Mon, 30 Jun 2025 03:43:48 -0400 |
parents | 39760dfc9b3b |
children | 9e05e44050d0 |
comparison
equal
deleted
inserted
replaced
120:0f913ec120ac | 121:397743cb70e2 |
---|---|
1 use bindgen::MacroTypeVariation; | 1 use bindgen::MacroTypeVariation; |
2 use libpam_sys_impls::cfg_pam_impl; | 2 use libpam_sys::PamImpl; |
3 use quote::{format_ident, ToTokens}; | 3 use quote::{format_ident, ToTokens}; |
4 use std::path::PathBuf; | 4 use std::path::PathBuf; |
5 use std::{env, fs}; | 5 use std::{env, fs}; |
6 use syn::{Item, ItemConst, Type, TypePath}; | 6 use syn::{Item, ItemConst, Type, TypePath}; |
7 | 7 |
8 fn main() { | 8 fn main() { |
9 generate_const_test(); | 9 let config = match PamImpl::CURRENT { |
10 PamImpl::LinuxPam => TestConfig { | |
11 headers: vec![ | |
12 "security/_pam_types.h".into(), | |
13 "security/pam_appl.h".into(), | |
14 "security/pam_ext.h".into(), | |
15 "security/pam_modules.h".into(), | |
16 ], | |
17 ignore_consts: vec![ | |
18 "__LINUX_PAM__".into(), | |
19 "__LINUX_PAM_MINOR__".into(), | |
20 "PAM_AUTHTOK_RECOVER_ERR".into(), | |
21 ], | |
22 ..Default::default() | |
23 }, | |
24 PamImpl::OpenPam => TestConfig { | |
25 headers: vec![ | |
26 "security/pam_types.h".into(), | |
27 "security/openpam.h".into(), | |
28 "security/pam_appl.h".into(), | |
29 "security/pam_constants.h".into(), | |
30 ], | |
31 ignore_consts: vec![ | |
32 "OPENPAM_VERSION".into(), | |
33 "OPENPAM_RELEASE".into(), | |
34 "PAM_SOEXT".into(), | |
35 ], | |
36 ..Default::default() | |
37 }, | |
38 PamImpl::Sun => TestConfig { | |
39 headers: vec![ | |
40 "security/pam_appl.h".into(), | |
41 "security/pam_modules.h".into(), | |
42 ], | |
43 block_headers: vec!["sys/types.h".into()], | |
44 ..Default::default() | |
45 }, | |
46 PamImpl::XSso => Default::default(), | |
47 other => panic!("Unknown PAM implementation {other:?}"), | |
48 }; | |
49 generate_const_test(&config); | |
10 } | 50 } |
11 | 51 |
12 #[cfg_pam_impl("LinuxPam")] | 52 fn generate_const_test(config: &TestConfig) { |
13 fn test_config() -> TestConfig { | 53 let mut builder = bindgen::Builder::default() |
14 TestConfig { | |
15 headers: vec![ | |
16 "security/_pam_types.h".into(), | |
17 "security/pam_appl.h".into(), | |
18 "security/pam_ext.h".into(), | |
19 "security/pam_modules.h".into(), | |
20 ], | |
21 ignore_consts: vec![ | |
22 "__LINUX_PAM__".into(), | |
23 "__LINUX_PAM_MINOR__".into(), | |
24 "PAM_AUTHTOK_RECOVER_ERR".into(), | |
25 ], | |
26 } | |
27 } | |
28 | |
29 #[cfg_pam_impl("OpenPam")] | |
30 fn test_config() -> TestConfig { | |
31 TestConfig { | |
32 headers: vec![ | |
33 "security/pam_types.h".into(), | |
34 "security/openpam.h".into(), | |
35 "security/pam_appl.h".into(), | |
36 "security/pam_constants.h".into(), | |
37 ], | |
38 ignore_consts: vec![ | |
39 "OPENPAM_VERSION".into(), | |
40 "OPENPAM_RELEASE".into(), | |
41 "PAM_SOEXT".into(), | |
42 ], | |
43 } | |
44 } | |
45 | |
46 #[cfg_pam_impl(not(any("LinuxPam", "OpenPam")))] | |
47 fn test_config() -> TestConfig { | |
48 panic!("This PAM implementation is not yet tested.") | |
49 } | |
50 | |
51 fn generate_const_test() { | |
52 let config = test_config(); | |
53 let builder = bindgen::Builder::default() | |
54 .header_contents("_.h", &config.header_contents()) | 54 .header_contents("_.h", &config.header_contents()) |
55 .merge_extern_blocks(true) | 55 .merge_extern_blocks(true) |
56 .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) | 56 .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) |
57 .blocklist_type(".*") | 57 .blocklist_type(".*") |
58 .blocklist_function(".*") | 58 .blocklist_function(".*") |
59 .allowlist_var(".*") | 59 .allowlist_var(".*") |
60 .default_macro_constant_type(MacroTypeVariation::Signed); | 60 .default_macro_constant_type(MacroTypeVariation::Signed); |
61 for hdr in config.block_headers.iter() { | |
62 builder = builder.blocklist_file(".*?/".to_owned() + hdr) | |
63 } | |
61 | 64 |
62 let generated = builder.generate().unwrap().to_string(); | 65 let generated = builder.generate().unwrap().to_string(); |
63 let file = syn::parse_file(&generated).unwrap(); | 66 let file = syn::parse_file(&generated).unwrap(); |
64 let mut tests = vec![]; | 67 let mut tests = vec![]; |
65 tests.push("{".into()); | 68 tests.push("{".into()); |
93 tests.join("\n"), | 96 tests.join("\n"), |
94 ) | 97 ) |
95 .unwrap(); | 98 .unwrap(); |
96 } | 99 } |
97 | 100 |
101 #[derive(Default)] | |
98 struct TestConfig { | 102 struct TestConfig { |
99 headers: Vec<String>, | 103 headers: Vec<String>, |
104 block_headers: Vec<String>, | |
100 ignore_consts: Vec<String>, | 105 ignore_consts: Vec<String>, |
101 } | 106 } |
102 | 107 |
103 impl TestConfig { | 108 impl TestConfig { |
104 fn header_contents(&self) -> String { | 109 fn header_contents(&self) -> String { |