Mercurial > crates > nonstick
comparison libpam-sys/src/structs.rs @ 117:20f7712a6857
Neaten up libpam-sys BinaryPayload buffer management.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sun, 29 Jun 2025 18:48:14 -0400 |
parents | bb465393621f |
children | 39760dfc9b3b |
comparison
equal
deleted
inserted
replaced
116:a12706e42c9d | 117:20f7712a6857 |
---|---|
32 me.total_bytes_u32be = u32::to_be_bytes(buf.len() as u32); | 32 me.total_bytes_u32be = u32::to_be_bytes(buf.len() as u32); |
33 me.data_type = data_type; | 33 me.data_type = data_type; |
34 buf[5..].copy_from_slice(data) | 34 buf[5..].copy_from_slice(data) |
35 } | 35 } |
36 | 36 |
37 /// The size of the message contained in the buffer. | |
38 fn len(&self) -> usize { | |
39 self.total_bytes().saturating_sub(5) | |
40 } | |
41 | |
42 /// The total storage needed for the message, including header. | 37 /// The total storage needed for the message, including header. |
43 pub fn total_bytes(&self) -> usize { | 38 pub fn total_bytes(&self) -> usize { |
44 u32::from_be_bytes(self.total_bytes_u32be) as usize | 39 u32::from_be_bytes(self.total_bytes_u32be) as usize |
45 } | 40 } |
46 | 41 |
47 /// Gets the contents of the BinaryMessage stored at the given pointer. | 42 /// Gets the total byte buffer of the BinaryMessage stored at the pointer. |
48 /// | 43 /// |
49 /// The returned data slice is borrowed from where the pointer points to. | 44 /// The returned data slice is borrowed from where the pointer points to. |
50 /// | 45 /// |
51 /// # Safety | 46 /// # Safety |
52 /// | 47 /// |
53 /// - The pointer must point to a valid `BinaryPayload`. | 48 /// - The pointer must point to a valid `BinaryPayload`. |
54 /// - The borrowed data must not outlive the validity of this pointer. | 49 /// - The borrowed data must not outlive the pointer's validity. |
50 pub unsafe fn buffer_of<'a>(ptr: *const Self) -> &'a [u8] { | |
51 let header: &Self = ptr.as_ref().unwrap_unchecked(); | |
52 slice::from_raw_parts(ptr.cast(), header.total_bytes().max(5)) | |
53 } | |
54 | |
55 /// Gets the contents of the BinaryMessage stored at the given pointer. | |
56 /// | |
57 /// The returned data slice is borrowed from where the pointer points to. | |
58 /// This is a cheap operation and doesn't do *any* copying. | |
59 /// | |
60 /// We don't take a `&self` reference here because accessing beyond | |
61 /// the range of the `Self` data (i.e., beyond the 5 bytes of `self`) | |
62 /// is undefined behavior. Instead, you have to pass a raw pointer | |
63 /// directly to the data. | |
64 /// | |
65 /// # Safety | |
66 /// | |
67 /// - The pointer must point to a valid `BinaryPayload`. | |
68 /// - The borrowed data must not outlive the pointer's validity. | |
55 pub unsafe fn contents<'a>(ptr: *const Self) -> (u8, &'a [u8]) { | 69 pub unsafe fn contents<'a>(ptr: *const Self) -> (u8, &'a [u8]) { |
56 let header: &Self = ptr.as_ref().unwrap_unchecked(); | 70 let header: &Self = ptr.as_ref().unwrap_unchecked(); |
57 let typ = header.data_type; | |
58 ( | 71 ( |
59 typ, | 72 header.data_type, |
60 slice::from_raw_parts(ptr.cast::<u8>().offset(5), header.len()), | 73 &Self::buffer_of(ptr)[5..] |
61 ) | 74 ) |
62 } | 75 } |
63 } | 76 } |