Mercurial > crates > nonstick
comparison src/pam_ffi/mod.rs @ 71:58f9d2a4df38
Reorganize everything again???
- Splits ffi/memory stuff into a bunch of stuff in the pam_ffi module.
- Builds infrastructure for passing Messages and Responses.
- Adds tests for some things at least.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Tue, 03 Jun 2025 21:54:58 -0400 |
parents | src/pam_ffi.rs@9f8381a1c09c |
children | 47eb242a4f88 |
comparison
equal
deleted
inserted
replaced
70:9f8381a1c09c | 71:58f9d2a4df38 |
---|---|
1 //! The PAM library FFI and helpers for managing it. | |
2 //! | |
3 //! This includes the functions provided by PAM and the data structures | |
4 //! used by PAM, as well as a few low-level abstractions for dealing with | |
5 //! those data structures. | |
6 //! | |
7 //! Everything in here is hazmat. | |
8 //! | |
9 | |
10 #![allow(dead_code)] | |
11 | |
12 pub mod memory; | |
13 mod message; | |
14 mod response; | |
15 | |
16 use crate::pam_ffi::memory::Immovable; | |
17 use crate::pam_ffi::message::OwnedMessages; | |
18 pub use message::Message; | |
19 pub use response::RawResponse; | |
20 use std::ffi::{c_char, c_int, c_void}; | |
21 | |
22 /// An opaque structure that a PAM handle points to. | |
23 #[repr(C)] | |
24 pub struct Handle { | |
25 _data: (), | |
26 _marker: Immovable, | |
27 } | |
28 | |
29 /// An opaque structure that is passed through PAM in a conversation. | |
30 #[repr(C)] | |
31 pub struct AppData { | |
32 _data: (), | |
33 _marker: Immovable, | |
34 } | |
35 | |
36 /// The callback that PAM uses to get information in a conversation. | |
37 /// | |
38 /// - `num_msg` is the number of messages in the `pam_message` array. | |
39 /// - `messages` is a pointer to the messages being sent to the user. | |
40 /// For details about its structure, see the documentation of | |
41 /// [`OwnedMessages`](super::OwnedMessages). | |
42 /// - `responses` is a pointer to an array of [`RawResponse`]s, | |
43 /// which PAM sets in response to a module's request. | |
44 /// This is an array of structs, not an array of pointers to a struct. | |
45 /// There should always be exactly as many `responses` as `num_msg`. | |
46 /// - `appdata` is the `appdata` field of the [`Conversation`] we were passed. | |
47 pub type ConversationCallback = extern "C" fn( | |
48 num_msg: c_int, | |
49 messages: &OwnedMessages, | |
50 responses: &mut *mut RawResponse, | |
51 appdata: *const AppData, | |
52 ) -> c_int; | |
53 | |
54 /// A callback and the associated [`AppData`] pointer that needs to be passed back to it. | |
55 #[repr(C)] | |
56 pub struct Conversation { | |
57 callback: ConversationCallback, | |
58 appdata: *const AppData, | |
59 } | |
60 | |
61 #[link(name = "pam")] | |
62 extern "C" { | |
63 pub fn pam_get_data( | |
64 pamh: *const Handle, | |
65 module_data_name: *const c_char, | |
66 data: &mut *const c_void, | |
67 ) -> c_int; | |
68 | |
69 pub fn pam_set_data( | |
70 pamh: *mut Handle, | |
71 module_data_name: *const c_char, | |
72 data: *const c_void, | |
73 cleanup: extern "C" fn(pamh: *const c_void, data: *mut c_void, error_status: c_int), | |
74 ) -> c_int; | |
75 | |
76 pub fn pam_get_item(pamh: *const Handle, item_type: c_int, item: &mut *const c_void) -> c_int; | |
77 | |
78 pub fn pam_set_item(pamh: *mut Handle, item_type: c_int, item: *const c_void) -> c_int; | |
79 | |
80 pub fn pam_get_user( | |
81 pamh: *const Handle, | |
82 user: &mut *const c_char, | |
83 prompt: *const c_char, | |
84 ) -> c_int; | |
85 | |
86 pub fn pam_get_authtok( | |
87 pamh: *const Handle, | |
88 item_type: c_int, | |
89 data: &mut *const c_char, | |
90 prompt: *const c_char, | |
91 ) -> c_int; | |
92 | |
93 pub fn pam_end(pamh: *mut Handle, status: c_int) -> c_int; | |
94 } |