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 }