Mercurial > crates > nonstick
comparison src/libpam/conversation.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 | efc2b56c8928 |
comparison
equal
deleted
inserted
replaced
88:c9fc7e6257d3 | 89:dd3e9c4bcde3 |
---|---|
3 use crate::libpam::answer::BinaryAnswer; | 3 use crate::libpam::answer::BinaryAnswer; |
4 use crate::libpam::answer::{Answer, Answers, TextAnswer}; | 4 use crate::libpam::answer::{Answer, Answers, TextAnswer}; |
5 use crate::libpam::memory::Immovable; | 5 use crate::libpam::memory::Immovable; |
6 use crate::libpam::pam_ffi::AppData; | 6 use crate::libpam::pam_ffi::AppData; |
7 pub use crate::libpam::pam_ffi::LibPamConversation; | 7 pub use crate::libpam::pam_ffi::LibPamConversation; |
8 use crate::libpam::question::{Indirect, IndirectTrait, Question, Questions}; | 8 use crate::libpam::question::QuestionsTrait; |
9 use crate::libpam::question::{Question, Questions}; | |
9 use crate::ErrorCode; | 10 use crate::ErrorCode; |
10 use crate::Result; | 11 use crate::Result; |
11 use std::ffi::c_int; | 12 use std::ffi::c_int; |
12 use std::iter; | 13 use std::iter; |
13 use std::marker::PhantomData; | 14 use std::marker::PhantomData; |
36 // Collect all our pointers | 37 // Collect all our pointers |
37 let conv = me | 38 let conv = me |
38 .cast::<C>() | 39 .cast::<C>() |
39 .as_mut() | 40 .as_mut() |
40 .ok_or(ErrorCode::ConversationError)?; | 41 .ok_or(ErrorCode::ConversationError)?; |
41 let indirect = Indirect::borrow_ptr(questions).ok_or(ErrorCode::ConversationError)?; | 42 let indirect = Questions::borrow_ptr(questions, count as usize); |
42 let answers_ptr = answers.as_mut().ok_or(ErrorCode::ConversationError)?; | 43 let answers_ptr = answers.as_mut().ok_or(ErrorCode::ConversationError)?; |
43 | 44 |
44 // Build our owned list of Q&As from the questions we've been asked | 45 // Build our owned list of Q&As from the questions we've been asked |
45 let messages: Vec<OwnedMessage> = indirect | 46 let messages: Vec<OwnedMessage> = indirect |
46 .iter(count as usize) | |
47 .map(TryInto::try_into) | 47 .map(TryInto::try_into) |
48 .collect::<Result<_>>() | 48 .collect::<Result<_>>() |
49 .map_err(|_| ErrorCode::ConversationError)?; | 49 .map_err(|_| ErrorCode::ConversationError)?; |
50 // Borrow all those Q&As and ask them. | 50 // Borrow all those Q&As and ask them. |
51 // If we got an invalid message type, bail before sending. | 51 // If we got an invalid message type, bail before sending. |
69 let mut response_pointer = std::ptr::null_mut(); | 69 let mut response_pointer = std::ptr::null_mut(); |
70 // SAFETY: We're calling into PAM with valid everything. | 70 // SAFETY: We're calling into PAM with valid everything. |
71 let result = unsafe { | 71 let result = unsafe { |
72 (self.callback)( | 72 (self.callback)( |
73 messages.len() as c_int, | 73 messages.len() as c_int, |
74 questions.indirect(), | 74 questions.ptr(), |
75 &mut response_pointer, | 75 &mut response_pointer, |
76 self.appdata, | 76 self.appdata, |
77 ) | 77 ) |
78 }; | 78 }; |
79 ErrorCode::result_from(result)?; | 79 ErrorCode::result_from(result)?; |