Mercurial > crates > nonstick
comparison pam/src/macros.rs @ 34:ec70822cbdef
Overhaul
author | Andy Caldwell <andrew.caldwell@metaswitch.com> |
---|---|
date | Sun, 24 Apr 2022 03:42:11 +0100 |
parents | 4263c1d83d5b |
children |
comparison
equal
deleted
inserted
replaced
32:ea5f195f035f | 34:ec70822cbdef |
---|---|
16 /// # fn main() {} | 16 /// # fn main() {} |
17 /// struct MyPamModule; | 17 /// struct MyPamModule; |
18 /// pam_hooks!(MyPamModule); | 18 /// pam_hooks!(MyPamModule); |
19 /// | 19 /// |
20 /// impl PamHooks for MyPamModule { | 20 /// impl PamHooks for MyPamModule { |
21 /// fn sm_authenticate(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { | 21 /// fn sm_authenticate(pamh: &mut PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { |
22 /// println!("Everybody is authenticated!"); | 22 /// println!("Everybody is authenticated!"); |
23 /// PamResultCode::PAM_SUCCESS | 23 /// PamResultCode::PAM_SUCCESS |
24 /// } | 24 /// } |
25 /// | 25 /// |
26 /// fn acct_mgmt(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { | 26 /// fn acct_mgmt(pamh: &mut PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { |
27 /// println!("Everybody is authorized!"); | 27 /// println!("Everybody is authorized!"); |
28 /// PamResultCode::PAM_SUCCESS | 28 /// PamResultCode::PAM_SUCCESS |
29 /// } | 29 /// } |
30 /// } | 30 /// } |
31 /// ``` | 31 /// ``` |
32 #[macro_export] | 32 #[macro_export] |
33 macro_rules! pam_hooks { | 33 macro_rules! pam_hooks { |
34 ($ident:ident) => ( | 34 ($ident:ident) => { |
35 pub use self::pam_hooks_scope::*; | 35 pub use self::pam_hooks_scope::*; |
36 mod pam_hooks_scope { | 36 mod pam_hooks_scope { |
37 use $crate::module::{PamHandle, PamHooks}; | 37 use std::ffi::CStr; |
38 use $crate::constants::{PamFlag, PamResultCode}; | 38 use std::os::raw::{c_char, c_int}; |
39 use std::ffi::CStr; | 39 use $crate::constants::{PamFlag, PamResultCode}; |
40 use std::os::raw::{c_char, c_int}; | 40 use $crate::module::{PamHandle, PamHooks}; |
41 | 41 |
42 fn extract_argv<'a>(argc: c_int, argv: *const *const c_char) -> Vec<&'a CStr> { | 42 fn extract_argv<'a>(argc: c_int, argv: *const *const c_char) -> Vec<&'a CStr> { |
43 (0..argc) | 43 (0..argc) |
44 .map(|o| unsafe { | 44 .map(|o| unsafe { CStr::from_ptr(*argv.offset(o as isize) as *const c_char) }) |
45 CStr::from_ptr(*argv.offset(o as isize) as *const c_char) | 45 .collect() |
46 }) | 46 } |
47 .collect() | |
48 } | |
49 | 47 |
50 #[no_mangle] | 48 #[no_mangle] |
51 pub extern "C" fn pam_sm_acct_mgmt( | 49 pub extern "C" fn pam_sm_acct_mgmt( |
52 pamh: &PamHandle, | 50 pamh: &mut PamHandle, |
53 flags: PamFlag, | 51 flags: PamFlag, |
54 argc: c_int, | 52 argc: c_int, |
55 argv: *const *const c_char, | 53 argv: *const *const c_char, |
56 ) -> PamResultCode { | 54 ) -> PamResultCode { |
57 let args = extract_argv(argc, argv); | 55 let args = extract_argv(argc, argv); |
58 super::$ident::acct_mgmt(pamh, args, flags) | 56 super::$ident::acct_mgmt(pamh, args, flags) |
59 } | 57 } |
60 | 58 |
61 #[no_mangle] | 59 #[no_mangle] |
62 pub extern "C" fn pam_sm_authenticate( | 60 pub extern "C" fn pam_sm_authenticate( |
63 pamh: &PamHandle, | 61 pamh: &mut PamHandle, |
64 flags: PamFlag, | 62 flags: PamFlag, |
65 argc: c_int, | 63 argc: c_int, |
66 argv: *const *const c_char, | 64 argv: *const *const c_char, |
67 ) -> PamResultCode { | 65 ) -> PamResultCode { |
68 let args = extract_argv(argc, argv); | 66 let args = extract_argv(argc, argv); |
69 super::$ident::sm_authenticate(pamh, args, flags) | 67 super::$ident::sm_authenticate(pamh, args, flags) |
70 } | 68 } |
71 | 69 |
72 #[no_mangle] | 70 #[no_mangle] |
73 pub extern "C" fn pam_sm_chauthtok( | 71 pub extern "C" fn pam_sm_chauthtok( |
74 pamh: &PamHandle, | 72 pamh: &mut PamHandle, |
75 flags: PamFlag, | 73 flags: PamFlag, |
76 argc: c_int, | 74 argc: c_int, |
77 argv: *const *const c_char, | 75 argv: *const *const c_char, |
78 ) -> PamResultCode { | 76 ) -> PamResultCode { |
79 let args = extract_argv(argc, argv); | 77 let args = extract_argv(argc, argv); |
80 super::$ident::sm_chauthtok(pamh, args, flags) | 78 super::$ident::sm_chauthtok(pamh, args, flags) |
81 } | 79 } |
82 | 80 |
83 #[no_mangle] | 81 #[no_mangle] |
84 pub extern "C" fn pam_sm_close_session( | 82 pub extern "C" fn pam_sm_close_session( |
85 pamh: &PamHandle, | 83 pamh: &mut PamHandle, |
86 flags: PamFlag, | 84 flags: PamFlag, |
87 argc: c_int, | 85 argc: c_int, |
88 argv: *const *const c_char, | 86 argv: *const *const c_char, |
89 ) -> PamResultCode { | 87 ) -> PamResultCode { |
90 let args = extract_argv(argc, argv); | 88 let args = extract_argv(argc, argv); |
91 super::$ident::sm_close_session(pamh, args, flags) | 89 super::$ident::sm_close_session(pamh, args, flags) |
92 } | 90 } |
93 | 91 |
94 #[no_mangle] | 92 #[no_mangle] |
95 pub extern "C" fn pam_sm_open_session( | 93 pub extern "C" fn pam_sm_open_session( |
96 pamh: &PamHandle, | 94 pamh: &mut PamHandle, |
97 flags: PamFlag, | 95 flags: PamFlag, |
98 argc: c_int, | 96 argc: c_int, |
99 argv: *const *const c_char, | 97 argv: *const *const c_char, |
100 ) -> PamResultCode { | 98 ) -> PamResultCode { |
101 let args = extract_argv(argc, argv); | 99 let args = extract_argv(argc, argv); |
102 super::$ident::sm_open_session(pamh, args, flags) | 100 super::$ident::sm_open_session(pamh, args, flags) |
103 } | 101 } |
104 | 102 |
105 #[no_mangle] | 103 #[no_mangle] |
106 pub extern "C" fn pam_sm_setcred( | 104 pub extern "C" fn pam_sm_setcred( |
107 pamh: &PamHandle, | 105 pamh: &mut PamHandle, |
108 flags: PamFlag, | 106 flags: PamFlag, |
109 argc: c_int, | 107 argc: c_int, |
110 argv: *const *const c_char, | 108 argv: *const *const c_char, |
111 ) -> PamResultCode { | 109 ) -> PamResultCode { |
112 let args = extract_argv(argc, argv); | 110 let args = extract_argv(argc, argv); |
113 super::$ident::sm_setcred(pamh, args, flags) | 111 super::$ident::sm_setcred(pamh, args, flags) |
114 } | 112 } |
115 } | 113 } |
116 ) | 114 }; |
115 } | |
116 | |
117 #[macro_export] | |
118 macro_rules! pam_try { | |
119 ($r:expr) => { | |
120 match $r { | |
121 Ok(t) => t, | |
122 Err(e) => return e, | |
123 } | |
124 }; | |
125 ($r:expr, $e:expr) => { | |
126 match $r { | |
127 Ok(t) => t, | |
128 Err(_) => return $e, | |
129 } | |
130 }; | |
117 } | 131 } |
118 | 132 |
119 #[cfg(test)] | 133 #[cfg(test)] |
120 pub mod test { | 134 pub mod test { |
121 use module::PamHooks; | 135 use module::PamHooks; |
122 | 136 |
123 struct Foo; | 137 struct Foo; |
124 impl PamHooks for Foo {} | 138 impl PamHooks for Foo {} |
125 | 139 |
126 pam_hooks!(Foo); | 140 pam_hooks!(Foo); |
127 } | 141 } |