comparison src/libpam/pam_ffi.rs @ 89:dd3e9c4bcde3

Simplify memory management in Questions. When we're sending Questions to the client, we don't need them to be C-managed, we just need the pointers going to the right place. This replaces a bunch of Question management cruft with Vecs and Boxes.
author Paul Fisher <paul@pfish.zone>
date Fri, 13 Jun 2025 05:22:48 -0400
parents 05291b601f0a
children f6186e41399b
comparison
equal deleted inserted replaced
88:c9fc7e6257d3 89:dd3e9c4bcde3
28 #[derive(Debug)] 28 #[derive(Debug)]
29 pub struct Answer { 29 pub struct Answer {
30 /// Pointer to the data returned in an answer. 30 /// Pointer to the data returned in an answer.
31 /// For most answers, this will be a [`CStr`](std::ffi::CStr), 31 /// For most answers, this will be a [`CStr`](std::ffi::CStr),
32 /// but for [`BinaryQAndA`](crate::conv::BinaryQAndA)s (a Linux-PAM extension), 32 /// but for [`BinaryQAndA`](crate::conv::BinaryQAndA)s (a Linux-PAM extension),
33 /// this will be [`CBinaryData`](crate::libpam::memory::CBinaryData) 33 /// this will be [`CBinaryData`](crate::libpam::memory::CBinaryData).
34 ///
35 /// No matter what, this can be freed with a simple [`libc::free`].
34 pub data: *mut c_void, 36 pub data: *mut c_void,
35 /// Unused. 37 /// Unused. Just here for the padding.
36 return_code: c_int, 38 return_code: c_int,
37 _marker: Immovable, 39 _marker: Immovable,
38 } 40 }
39 41
40 /// A question sent by PAM or a module to an application. 42 /// A question sent by PAM or a module to an application.
41 /// 43 ///
42 /// PAM refers to this as a "message", but we call it a question 44 /// PAM refers to this as a "message", but we call it a question
43 /// to avoid confusion with [`Message`](crate::Message). 45 /// to avoid confusion with [`Message`](crate::conv::Message).
44 /// 46 ///
45 /// This question, and its internal data, is owned by its creator 47 /// This question, and its internal data, is owned by its creator
46 /// (either the module or PAM itself). 48 /// (either the module or PAM itself).
47 #[repr(C)] 49 #[repr(C)]
50 #[derive(Debug)]
48 pub struct Question { 51 pub struct Question {
49 /// The style of message to request. 52 /// The style of message to request.
50 pub style: c_uint, 53 pub style: c_uint,
51 /// A description of the data requested. 54 /// A description of the data requested.
52 /// 55 ///
53 /// For most requests, this will be an owned [`CStr`](std::ffi::CStr), but for requests 56 /// For most requests, this will be an owned [`CStr`](std::ffi::CStr),
54 /// with [`Style::BinaryPrompt`], this will be [`CBinaryData`] 57 /// but for requests with style `PAM_BINARY_PROMPT`,
55 /// (a Linux-PAM extension). 58 /// this will be `CBinaryData` (a Linux-PAM extension).
56 pub data: *mut c_void, 59 pub data: *mut c_void,
57 pub _marker: Immovable, 60 pub _marker: Immovable,
58 } 61 }
59 62
60 /// The callback that PAM uses to get information in a conversation. 63 /// The callback that PAM uses to get information in a conversation.
61 /// 64 ///
62 /// - `num_msg` is the number of messages in the `pam_message` array. 65 /// - `num_msg` is the number of messages in the `questions` array.
63 /// - `questions` is a pointer to the [`Question`]s being sent to the user. 66 /// - `questions` is a pointer to the [`Question`]s being sent to the user.
64 /// For information about its structure, 67 /// For information about its structure,
65 /// see [`GenericQuestions`](super::question::GenericQuestions). 68 /// see [`QuestionsTrait`](super::question::QuestionsTrait).
66 /// - `answers` is a pointer to an array of [`Answer`]s, 69 /// - `answers` is a pointer to an array of [`Answer`]s,
67 /// which PAM sets in response to a module's request. 70 /// which PAM sets in response to a module's request.
68 /// This is an array of structs, not an array of pointers to a struct. 71 /// This is an array of structs, not an array of pointers to a struct.
69 /// There should always be exactly as many `answers` as `num_msg`. 72 /// There must always be exactly as many `answers` as `num_msg`.
70 /// - `appdata` is the `appdata` field of the [`LibPamConversation`] we were passed. 73 /// - `appdata` is the `appdata` field of the [`LibPamConversation`].
71 pub type ConversationCallback = unsafe extern "C" fn( 74 pub type ConversationCallback = unsafe extern "C" fn(
72 num_msg: c_int, 75 num_msg: c_int,
73 questions: *const *const Question, 76 questions: *const *const Question,
74 answers: *mut *mut Answer, 77 answers: *mut *mut Answer,
75 appdata: *mut AppData, 78 appdata: *mut AppData,