Mercurial > crates > nonstick
comparison pam/src/macros.rs @ 22:4263c1d83d5b
Refactor PamHooks into modules mod
author | Anthony Nowell <anthony@algorithmia.com> |
---|---|
date | Tue, 26 Sep 2017 02:30:03 -0600 |
parents | |
children | ec70822cbdef |
comparison
equal
deleted
inserted
replaced
21:aa7e8bd083ef | 22:4263c1d83d5b |
---|---|
1 /// Macro to generate the `extern "C"` entrypoint bindings needed by PAM | |
2 /// | |
3 /// You can call `pam_hooks!(SomeType);` for any type that implements `PamHooks` | |
4 /// | |
5 /// ## Examples: | |
6 /// | |
7 /// Here is full example of a PAM module that would authenticate and authorize everybody: | |
8 /// | |
9 /// ``` | |
10 /// #[macro_use] extern crate pam; | |
11 /// | |
12 /// use pam::module::{PamHooks, PamHandle}; | |
13 /// use pam::constants::{PamResultCode, PamFlag}; | |
14 /// use std::ffi::CStr; | |
15 /// | |
16 /// # fn main() {} | |
17 /// struct MyPamModule; | |
18 /// pam_hooks!(MyPamModule); | |
19 /// | |
20 /// impl PamHooks for MyPamModule { | |
21 /// fn sm_authenticate(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { | |
22 /// println!("Everybody is authenticated!"); | |
23 /// PamResultCode::PAM_SUCCESS | |
24 /// } | |
25 /// | |
26 /// fn acct_mgmt(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { | |
27 /// println!("Everybody is authorized!"); | |
28 /// PamResultCode::PAM_SUCCESS | |
29 /// } | |
30 /// } | |
31 /// ``` | |
32 #[macro_export] | |
33 macro_rules! pam_hooks { | |
34 ($ident:ident) => ( | |
35 pub use self::pam_hooks_scope::*; | |
36 mod pam_hooks_scope { | |
37 use $crate::module::{PamHandle, PamHooks}; | |
38 use $crate::constants::{PamFlag, PamResultCode}; | |
39 use std::ffi::CStr; | |
40 use std::os::raw::{c_char, c_int}; | |
41 | |
42 fn extract_argv<'a>(argc: c_int, argv: *const *const c_char) -> Vec<&'a CStr> { | |
43 (0..argc) | |
44 .map(|o| unsafe { | |
45 CStr::from_ptr(*argv.offset(o as isize) as *const c_char) | |
46 }) | |
47 .collect() | |
48 } | |
49 | |
50 #[no_mangle] | |
51 pub extern "C" fn pam_sm_acct_mgmt( | |
52 pamh: &PamHandle, | |
53 flags: PamFlag, | |
54 argc: c_int, | |
55 argv: *const *const c_char, | |
56 ) -> PamResultCode { | |
57 let args = extract_argv(argc, argv); | |
58 super::$ident::acct_mgmt(pamh, args, flags) | |
59 } | |
60 | |
61 #[no_mangle] | |
62 pub extern "C" fn pam_sm_authenticate( | |
63 pamh: &PamHandle, | |
64 flags: PamFlag, | |
65 argc: c_int, | |
66 argv: *const *const c_char, | |
67 ) -> PamResultCode { | |
68 let args = extract_argv(argc, argv); | |
69 super::$ident::sm_authenticate(pamh, args, flags) | |
70 } | |
71 | |
72 #[no_mangle] | |
73 pub extern "C" fn pam_sm_chauthtok( | |
74 pamh: &PamHandle, | |
75 flags: PamFlag, | |
76 argc: c_int, | |
77 argv: *const *const c_char, | |
78 ) -> PamResultCode { | |
79 let args = extract_argv(argc, argv); | |
80 super::$ident::sm_chauthtok(pamh, args, flags) | |
81 } | |
82 | |
83 #[no_mangle] | |
84 pub extern "C" fn pam_sm_close_session( | |
85 pamh: &PamHandle, | |
86 flags: PamFlag, | |
87 argc: c_int, | |
88 argv: *const *const c_char, | |
89 ) -> PamResultCode { | |
90 let args = extract_argv(argc, argv); | |
91 super::$ident::sm_close_session(pamh, args, flags) | |
92 } | |
93 | |
94 #[no_mangle] | |
95 pub extern "C" fn pam_sm_open_session( | |
96 pamh: &PamHandle, | |
97 flags: PamFlag, | |
98 argc: c_int, | |
99 argv: *const *const c_char, | |
100 ) -> PamResultCode { | |
101 let args = extract_argv(argc, argv); | |
102 super::$ident::sm_open_session(pamh, args, flags) | |
103 } | |
104 | |
105 #[no_mangle] | |
106 pub extern "C" fn pam_sm_setcred( | |
107 pamh: &PamHandle, | |
108 flags: PamFlag, | |
109 argc: c_int, | |
110 argv: *const *const c_char, | |
111 ) -> PamResultCode { | |
112 let args = extract_argv(argc, argv); | |
113 super::$ident::sm_setcred(pamh, args, flags) | |
114 } | |
115 } | |
116 ) | |
117 } | |
118 | |
119 #[cfg(test)] | |
120 pub mod test { | |
121 use module::PamHooks; | |
122 | |
123 struct Foo; | |
124 impl PamHooks for Foo {} | |
125 | |
126 pam_hooks!(Foo); | |
127 } |