Mercurial > crates > nonstick
comparison src/libpam/pam_ffi.rs @ 90:f6186e41399b
Miscellaneous fixes and cleanup:
- Rename `get_user` to `username` and `get_authtok` to `authtok`.
- Use pam_strerror for error messages.
- Add library linkage to build.rs (it was missing???).
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sat, 14 Jun 2025 09:30:16 -0400 |
parents | dd3e9c4bcde3 |
children | 5ddbcada30f2 |
comparison
equal
deleted
inserted
replaced
89:dd3e9c4bcde3 | 90:f6186e41399b |
---|---|
1 //! The types that are directly represented in PAM function signatures. | 1 //! The types that are directly represented in PAM function signatures. |
2 | 2 |
3 #![allow(non_camel_case_types)] | 3 #![allow(non_camel_case_types)] |
4 | 4 |
5 use crate::libpam::memory::Immovable; | 5 use crate::libpam::memory::Immovable; |
6 use std::ffi::{c_int, c_uint, c_void}; | 6 use std::ffi::{c_int, c_uint, c_void, CStr}; |
7 use std::marker::PhantomData; | 7 use std::marker::PhantomData; |
8 use std::ptr; | |
8 | 9 |
9 /// An opaque structure that a PAM handle points to. | 10 /// An opaque structure that a PAM handle points to. |
10 #[repr(C)] | 11 #[repr(C)] |
11 pub struct LibPamHandle { | 12 pub struct LibPamHandle { |
12 _data: (), | 13 _data: (), |
26 /// and [`TextAnswer`](crate::libpam::answer::TextAnswer). | 27 /// and [`TextAnswer`](crate::libpam::answer::TextAnswer). |
27 #[repr(C)] | 28 #[repr(C)] |
28 #[derive(Debug)] | 29 #[derive(Debug)] |
29 pub struct Answer { | 30 pub struct Answer { |
30 /// Pointer to the data returned in an answer. | 31 /// Pointer to the data returned in an answer. |
31 /// For most answers, this will be a [`CStr`](std::ffi::CStr), | 32 /// For most answers, this will be a [`CStr`], |
32 /// but for [`BinaryQAndA`](crate::conv::BinaryQAndA)s (a Linux-PAM extension), | 33 /// but for [`BinaryQAndA`](crate::conv::BinaryQAndA)s (a Linux-PAM extension), |
33 /// this will be [`CBinaryData`](crate::libpam::memory::CBinaryData). | 34 /// this will be [`CBinaryData`](crate::libpam::memory::CBinaryData). |
34 /// | 35 /// |
35 /// No matter what, this can be freed with a simple [`libc::free`]. | 36 /// No matter what, this can be freed with a simple [`libc::free`]. |
36 pub data: *mut c_void, | 37 pub data: *mut c_void, |
51 pub struct Question { | 52 pub struct Question { |
52 /// The style of message to request. | 53 /// The style of message to request. |
53 pub style: c_uint, | 54 pub style: c_uint, |
54 /// A description of the data requested. | 55 /// A description of the data requested. |
55 /// | 56 /// |
56 /// For most requests, this will be an owned [`CStr`](std::ffi::CStr), | 57 /// For most requests, this will be an owned [`CStr`], |
57 /// but for requests with style `PAM_BINARY_PROMPT`, | 58 /// but for requests with style `PAM_BINARY_PROMPT`, |
58 /// this will be `CBinaryData` (a Linux-PAM extension). | 59 /// this will be `CBinaryData` (a Linux-PAM extension). |
59 pub data: *mut c_void, | 60 pub data: *mut c_void, |
60 pub _marker: Immovable, | 61 pub _marker: Immovable, |
61 } | 62 } |
88 pub appdata: *mut AppData, | 89 pub appdata: *mut AppData, |
89 pub life: PhantomData<&'a mut ()>, | 90 pub life: PhantomData<&'a mut ()>, |
90 pub _marker: Immovable, | 91 pub _marker: Immovable, |
91 } | 92 } |
92 | 93 |
94 /// Gets a string version of an error message. | |
95 pub fn strerror(code: c_uint) -> Option<&'static str> { | |
96 // SAFETY: Every single PAM implementation I can find (Linux-PAM, OpenPAM, | |
97 // Solaris, etc.) returns a static string and ignores the handle value. | |
98 let strerror = unsafe { pam_strerror(ptr::null_mut(), code as c_int) }; | |
99 if strerror.is_null() { | |
100 None | |
101 } else { | |
102 unsafe { CStr::from_ptr(strerror) }.to_str().ok() | |
103 } | |
104 } | |
105 | |
93 type pam_handle = LibPamHandle; | 106 type pam_handle = LibPamHandle; |
94 type pam_conv = LibPamConversation<'static>; | 107 type pam_conv = LibPamConversation<'static>; |
95 | 108 |
96 include!(concat!(env!("OUT_DIR"), "/bindings.rs")); | 109 include!(concat!(env!("OUT_DIR"), "/bindings.rs")); |