1e88f0521e53c8ce56372278b3dcb17d3e4db3e5
[ldk-c-bindings] / lightning-c-bindings / src / c_types / mod.rs
1 //! This module contains standard C-mapped types for types not in the original crate.
2
3 /// Auto-generated C-mapped types for templated containers
4 pub mod derived;
5
6 use bitcoin::Transaction as BitcoinTransaction;
7 use bitcoin::hashes::Hash;
8 use bitcoin::secp256k1::key::PublicKey as SecpPublicKey;
9 use bitcoin::secp256k1::key::SecretKey as SecpSecretKey;
10 use bitcoin::secp256k1::Signature as SecpSignature;
11 use bitcoin::secp256k1::Error as SecpError;
12 use bitcoin::secp256k1::recovery::RecoveryId;
13 use bitcoin::secp256k1::recovery::RecoverableSignature as SecpRecoverableSignature;
14 use bitcoin::bech32;
15
16 use core::convert::TryInto; // Bindings need at least rustc 1.34
17 use core::ffi::c_void;
18
19 #[cfg(feature = "std")]
20 pub(crate) use std::io::{self, Cursor, Read};
21 #[cfg(feature = "no-std")]
22 pub(crate) use core2::io::{self, Cursor, Read};
23 #[cfg(feature = "no-std")]
24 use alloc::{boxed::Box, vec::Vec, string::String};
25
26 #[repr(C)]
27 /// A dummy struct of which an instance must never exist.
28 /// This corresponds to the Rust type `Infallible`, or, in unstable rust, `!`
29 pub struct NotConstructable {
30         _priv_thing: core::convert::Infallible,
31 }
32 impl From<core::convert::Infallible> for NotConstructable {
33         fn from(_: core::convert::Infallible) -> Self { unreachable!(); }
34 }
35
36 /// Integer in the range `0..32`
37 #[derive(PartialEq, Eq, Copy, Clone)]
38 #[allow(non_camel_case_types)]
39 #[repr(C)]
40 pub struct u5(u8);
41
42 impl From<bech32::u5> for u5 {
43         fn from(o: bech32::u5) -> Self { Self(o.to_u8()) }
44 }
45 impl Into<bech32::u5> for u5 {
46         fn into(self) -> bech32::u5 { bech32::u5::try_from_u8(self.0).expect("u5 objects must be in the range 0..32") }
47 }
48
49 #[derive(Clone)]
50 #[repr(C)]
51 /// Represents a valid secp256k1 public key serialized in "compressed form" as a 33 byte array.
52 pub struct PublicKey {
53         /// The bytes of the public key
54         pub compressed_form: [u8; 33],
55 }
56 impl PublicKey {
57         pub(crate) fn from_rust(pk: &SecpPublicKey) -> Self {
58                 Self {
59                         compressed_form: pk.serialize(),
60                 }
61         }
62         pub(crate) fn into_rust(&self) -> SecpPublicKey {
63                 SecpPublicKey::from_slice(&self.compressed_form).unwrap()
64         }
65         pub(crate) fn is_null(&self) -> bool { self.compressed_form[..] == [0; 33][..] }
66         pub(crate) fn null() -> Self { Self { compressed_form: [0; 33] } }
67 }
68
69 #[repr(C)]
70 #[derive(Clone)]
71 /// Represents a valid secp256k1 secret key serialized as a 32 byte array.
72 pub struct SecretKey {
73         /// The bytes of the secret key
74         pub bytes: [u8; 32],
75 }
76 impl SecretKey {
77         // from_rust isn't implemented for a ref since we just return byte array refs directly
78         pub(crate) fn from_rust(sk: SecpSecretKey) -> Self {
79                 let mut bytes = [0; 32];
80                 bytes.copy_from_slice(&sk[..]);
81                 Self { bytes }
82         }
83         pub(crate) fn into_rust(&self) -> SecpSecretKey {
84                 SecpSecretKey::from_slice(&self.bytes).unwrap()
85         }
86 }
87
88 #[repr(C)]
89 #[derive(Clone)]
90 /// Represents a secp256k1 signature serialized as two 32-byte numbers
91 pub struct Signature {
92         /// The bytes of the signature in "compact" form
93         pub compact_form: [u8; 64],
94 }
95 impl Signature {
96         pub(crate) fn from_rust(pk: &SecpSignature) -> Self {
97                 Self {
98                         compact_form: pk.serialize_compact(),
99                 }
100         }
101         pub(crate) fn into_rust(&self) -> SecpSignature {
102                 SecpSignature::from_compact(&self.compact_form).unwrap()
103         }
104         // The following are used for Option<Signature> which we support, but don't use anymore
105         #[allow(unused)] pub(crate) fn is_null(&self) -> bool { self.compact_form[..] == [0; 64][..] }
106         #[allow(unused)] pub(crate) fn null() -> Self { Self { compact_form: [0; 64] } }
107 }
108
109 #[repr(C)]
110 #[derive(Clone)]
111 /// Represents a secp256k1 signature serialized as two 32-byte numbers as well as a tag which
112 /// allows recovering the exact public key which created the signature given the message.
113 pub struct RecoverableSignature {
114         /// The bytes of the signature in "compact" form plus a "Recovery ID" which allows for
115         /// recovery.
116         pub serialized_form: [u8; 68],
117 }
118 impl RecoverableSignature {
119         pub(crate) fn from_rust(pk: &SecpRecoverableSignature) -> Self {
120                 let (id, compact_form) = pk.serialize_compact();
121                 let mut serialized_form = [0; 68];
122                 serialized_form[0..64].copy_from_slice(&compact_form[..]);
123                 serialized_form[64..].copy_from_slice(&id.to_i32().to_le_bytes());
124                 Self { serialized_form }
125         }
126         pub(crate) fn into_rust(&self) -> SecpRecoverableSignature {
127                 let mut id = [0; 4];
128                 id.copy_from_slice(&self.serialized_form[64..]);
129                 SecpRecoverableSignature::from_compact(&self.serialized_form[0..64],
130                                 RecoveryId::from_i32(i32::from_le_bytes(id)).expect("Invalid Recovery ID"))
131                         .unwrap()
132         }
133 }
134
135 #[repr(C)]
136 #[derive(Copy, Clone)]
137 /// Represents an error returned from libsecp256k1 during validation of some secp256k1 data
138 pub enum Secp256k1Error {
139         /// Signature failed verification
140         IncorrectSignature,
141         /// Badly sized message ("messages" are actually fixed-sized digests; see the MESSAGE_SIZE constant)
142         InvalidMessage,
143         /// Bad public key
144         InvalidPublicKey,
145         /// Bad signature
146         InvalidSignature,
147         /// Bad secret key
148         InvalidSecretKey,
149         /// Bad recovery id
150         InvalidRecoveryId,
151         /// Invalid tweak for add_assign or mul_assign
152         InvalidTweak,
153         /// tweak_add_check failed on an xonly public key
154         TweakCheckFailed,
155         /// Didn't pass enough memory to context creation with preallocated memory
156         NotEnoughMemory,
157 }
158 impl Secp256k1Error {
159         pub(crate) fn from_rust(err: SecpError) -> Self {
160                 match err {
161                         SecpError::IncorrectSignature => Secp256k1Error::IncorrectSignature,
162                         SecpError::InvalidMessage => Secp256k1Error::InvalidMessage,
163                         SecpError::InvalidPublicKey => Secp256k1Error::InvalidPublicKey,
164                         SecpError::InvalidSignature => Secp256k1Error::InvalidSignature,
165                         SecpError::InvalidSecretKey => Secp256k1Error::InvalidSecretKey,
166                         SecpError::InvalidRecoveryId => Secp256k1Error::InvalidRecoveryId,
167                         SecpError::InvalidTweak => Secp256k1Error::InvalidTweak,
168                         SecpError::TweakCheckFailed => Secp256k1Error::TweakCheckFailed,
169                         SecpError::NotEnoughMemory => Secp256k1Error::NotEnoughMemory,
170                 }
171         }
172         pub(crate) fn into_rust(self) -> SecpError {
173                 match self {
174                         Secp256k1Error::IncorrectSignature => SecpError::IncorrectSignature,
175                         Secp256k1Error::InvalidMessage => SecpError::InvalidMessage,
176                         Secp256k1Error::InvalidPublicKey => SecpError::InvalidPublicKey,
177                         Secp256k1Error::InvalidSignature => SecpError::InvalidSignature,
178                         Secp256k1Error::InvalidSecretKey => SecpError::InvalidSecretKey,
179                         Secp256k1Error::InvalidRecoveryId => SecpError::InvalidRecoveryId,
180                         Secp256k1Error::InvalidTweak => SecpError::InvalidTweak,
181                         Secp256k1Error::TweakCheckFailed => SecpError::TweakCheckFailed,
182                         Secp256k1Error::NotEnoughMemory => SecpError::NotEnoughMemory,
183                 }
184         }
185 }
186
187 #[repr(C)]
188 #[derive(Copy, Clone)]
189 /// Represents an error returned from the bech32 library during validation of some bech32 data
190 pub enum Bech32Error {
191         /// String does not contain the separator character
192         MissingSeparator,
193         /// The checksum does not match the rest of the data
194         InvalidChecksum,
195         /// The data or human-readable part is too long or too short
196         InvalidLength,
197         /// Some part of the string contains an invalid character
198         InvalidChar(u32),
199         /// Some part of the data has an invalid value
200         InvalidData(u8),
201         /// The bit conversion failed due to a padding issue
202         InvalidPadding,
203         /// The whole string must be of one case
204         MixedCase,
205 }
206 impl Bech32Error {
207         pub(crate) fn from_rust(err: bech32::Error) -> Self {
208                 match err {
209                         bech32::Error::MissingSeparator => Self::MissingSeparator,
210                         bech32::Error::InvalidChecksum => Self::InvalidChecksum,
211                         bech32::Error::InvalidLength => Self::InvalidLength,
212                         bech32::Error::InvalidChar(c) => Self::InvalidChar(c as u32),
213                         bech32::Error::InvalidData(d) => Self::InvalidData(d),
214                         bech32::Error::InvalidPadding => Self::InvalidPadding,
215                         bech32::Error::MixedCase => Self::MixedCase,
216                 }
217         }
218         pub(crate) fn into_rust(self) -> bech32::Error {
219                 match self {
220                         Self::MissingSeparator => bech32::Error::MissingSeparator,
221                         Self::InvalidChecksum => bech32::Error::InvalidChecksum,
222                         Self::InvalidLength => bech32::Error::InvalidLength,
223                         Self::InvalidChar(c) => bech32::Error::InvalidChar(core::char::from_u32(c).expect("Invalid UTF-8 character in Bech32Error::InvalidChar")),
224                         Self::InvalidData(d) => bech32::Error::InvalidData(d),
225                         Self::InvalidPadding => bech32::Error::InvalidPadding,
226                         Self::MixedCase => bech32::Error::MixedCase,
227                 }
228         }
229 }
230 #[no_mangle]
231 /// Creates a new Bech32Error which has the same data as `orig`
232 pub extern "C" fn Bech32Error_clone(orig: &Bech32Error) -> Bech32Error { orig.clone() }
233 #[no_mangle]
234 /// Releases any memory held by the given `Bech32Error` (which is currently none)
235 pub extern "C" fn Bech32Error_free(o: Bech32Error) { }
236
237 #[repr(C)]
238 #[derive(Clone, Copy, PartialEq)]
239 /// Sub-errors which don't have specific information in them use this type.
240 pub struct Error {
241         /// Zero-Sized_types aren't consistent across Rust/C/C++, so we add some size here
242         pub _dummy: u8,
243 }
244
245 #[repr(C)]
246 #[allow(missing_docs)] // If there's no docs upstream, that's good enough for us
247 #[derive(Clone, Copy, PartialEq)]
248 /// Represents an IO Error. Note that some information is lost in the conversion from Rust.
249 pub enum IOError {
250         NotFound,
251         PermissionDenied,
252         ConnectionRefused,
253         ConnectionReset,
254         ConnectionAborted,
255         NotConnected,
256         AddrInUse,
257         AddrNotAvailable,
258         BrokenPipe,
259         AlreadyExists,
260         WouldBlock,
261         InvalidInput,
262         InvalidData,
263         TimedOut,
264         WriteZero,
265         Interrupted,
266         Other,
267         UnexpectedEof,
268 }
269 #[cfg(feature = "std")]
270 impl IOError {
271         pub(crate) fn from_rust(err: std::io::Error) -> Self {
272                 match err.kind() {
273                         std::io::ErrorKind::NotFound => IOError::NotFound,
274                         std::io::ErrorKind::PermissionDenied => IOError::PermissionDenied,
275                         std::io::ErrorKind::ConnectionRefused => IOError::ConnectionRefused,
276                         std::io::ErrorKind::ConnectionReset => IOError::ConnectionReset,
277                         std::io::ErrorKind::ConnectionAborted => IOError::ConnectionAborted,
278                         std::io::ErrorKind::NotConnected => IOError::NotConnected,
279                         std::io::ErrorKind::AddrInUse => IOError::AddrInUse,
280                         std::io::ErrorKind::AddrNotAvailable => IOError::AddrNotAvailable,
281                         std::io::ErrorKind::BrokenPipe => IOError::BrokenPipe,
282                         std::io::ErrorKind::AlreadyExists => IOError::AlreadyExists,
283                         std::io::ErrorKind::WouldBlock => IOError::WouldBlock,
284                         std::io::ErrorKind::InvalidInput => IOError::InvalidInput,
285                         std::io::ErrorKind::InvalidData => IOError::InvalidData,
286                         std::io::ErrorKind::TimedOut => IOError::TimedOut,
287                         std::io::ErrorKind::WriteZero => IOError::WriteZero,
288                         std::io::ErrorKind::Interrupted => IOError::Interrupted,
289                         std::io::ErrorKind::Other => IOError::Other,
290                         std::io::ErrorKind::UnexpectedEof => IOError::UnexpectedEof,
291                         _ => IOError::Other,
292                 }
293         }
294         pub(crate) fn to_rust(&self) -> std::io::Error {
295                 std::io::Error::new(match self {
296                         IOError::NotFound => std::io::ErrorKind::NotFound,
297                         IOError::PermissionDenied => std::io::ErrorKind::PermissionDenied,
298                         IOError::ConnectionRefused => std::io::ErrorKind::ConnectionRefused,
299                         IOError::ConnectionReset => std::io::ErrorKind::ConnectionReset,
300                         IOError::ConnectionAborted => std::io::ErrorKind::ConnectionAborted,
301                         IOError::NotConnected => std::io::ErrorKind::NotConnected,
302                         IOError::AddrInUse => std::io::ErrorKind::AddrInUse,
303                         IOError::AddrNotAvailable => std::io::ErrorKind::AddrNotAvailable,
304                         IOError::BrokenPipe => std::io::ErrorKind::BrokenPipe,
305                         IOError::AlreadyExists => std::io::ErrorKind::AlreadyExists,
306                         IOError::WouldBlock => std::io::ErrorKind::WouldBlock,
307                         IOError::InvalidInput => std::io::ErrorKind::InvalidInput,
308                         IOError::InvalidData => std::io::ErrorKind::InvalidData,
309                         IOError::TimedOut => std::io::ErrorKind::TimedOut,
310                         IOError::WriteZero => std::io::ErrorKind::WriteZero,
311                         IOError::Interrupted => std::io::ErrorKind::Interrupted,
312                         IOError::Other => std::io::ErrorKind::Other,
313                         IOError::UnexpectedEof => std::io::ErrorKind::UnexpectedEof,
314                 }, "")
315         }
316 }
317
318 #[repr(C)]
319 /// A serialized transaction, in (pointer, length) form.
320 ///
321 /// This type optionally owns its own memory, and thus the semantics around access change based on
322 /// the `data_is_owned` flag. If `data_is_owned` is set, you must call `Transaction_free` to free
323 /// the underlying buffer before the object goes out of scope. If `data_is_owned` is not set, any
324 /// access to the buffer after the scope in which the object was provided to you is invalid. eg,
325 /// access after you return from the call in which a `!data_is_owned` `Transaction` is provided to
326 /// you would be invalid.
327 ///
328 /// Note that, while it may change in the future, because transactions on the Rust side are stored
329 /// in a deserialized form, all `Transaction`s generated on the Rust side will have `data_is_owned`
330 /// set. Similarly, while it may change in the future, all `Transaction`s you pass to Rust may have
331 /// `data_is_owned` either set or unset at your discretion.
332 pub struct Transaction {
333         /// The serialized transaction data.
334         ///
335         /// This is non-const for your convenience, an object passed to Rust is never written to.
336         pub data: *mut u8,
337         /// The length of the serialized transaction
338         pub datalen: usize,
339         /// Whether the data pointed to by `data` should be freed or not.
340         pub data_is_owned: bool,
341 }
342 impl Transaction {
343         fn from_vec(vec: Vec<u8>) -> Self {
344                 let datalen = vec.len();
345                 let data = Box::into_raw(vec.into_boxed_slice());
346                 Self {
347                         data: unsafe { (*data).as_mut_ptr() },
348                         datalen,
349                         data_is_owned: true,
350                 }
351         }
352         pub(crate) fn into_bitcoin(&self) -> BitcoinTransaction {
353                 if self.datalen == 0 { panic!("0-length buffer can never represent a valid Transaction"); }
354                 ::bitcoin::consensus::encode::deserialize(unsafe { core::slice::from_raw_parts(self.data, self.datalen) }).unwrap()
355         }
356         pub(crate) fn from_bitcoin(btc: &BitcoinTransaction) -> Self {
357                 let vec = ::bitcoin::consensus::encode::serialize(btc);
358                 Self::from_vec(vec)
359         }
360 }
361 impl Drop for Transaction {
362         fn drop(&mut self) {
363                 if self.data_is_owned && self.datalen != 0 {
364                         let _ = derived::CVec_u8Z { data: self.data as *mut u8, datalen: self.datalen };
365                 }
366         }
367 }
368 impl Clone for Transaction {
369         fn clone(&self) -> Self {
370                 let sl = unsafe { core::slice::from_raw_parts(self.data, self.datalen) };
371                 let mut v = Vec::new();
372                 v.extend_from_slice(&sl);
373                 Self::from_vec(v)
374         }
375 }
376 #[no_mangle]
377 /// Frees the data buffer, if data_is_owned is set and datalen > 0.
378 pub extern "C" fn Transaction_free(_res: Transaction) { }
379
380 pub(crate) fn bitcoin_to_C_outpoint(outpoint: ::bitcoin::blockdata::transaction::OutPoint) -> crate::lightning::chain::transaction::OutPoint {
381         crate::lightning::chain::transaction::OutPoint_new(ThirtyTwoBytes { data: outpoint.txid.into_inner() }, outpoint.vout.try_into().unwrap())
382 }
383 pub(crate) fn C_to_bitcoin_outpoint(outpoint: crate::lightning::chain::transaction::OutPoint) -> ::bitcoin::blockdata::transaction::OutPoint {
384         unsafe {
385                 ::bitcoin::blockdata::transaction::OutPoint {
386                         txid: (*outpoint.inner).txid, vout: (*outpoint.inner).index as u32
387                 }
388         }
389 }
390
391 #[repr(C)]
392 #[derive(Clone)]
393 /// A transaction output including a scriptPubKey and value.
394 /// This type *does* own its own memory, so must be free'd appropriately.
395 pub struct TxOut {
396         /// The script_pubkey in this output
397         pub script_pubkey: derived::CVec_u8Z,
398         /// The value, in satoshis, of this output
399         pub value: u64,
400 }
401
402 impl TxOut {
403         pub(crate) fn into_rust(mut self) -> ::bitcoin::blockdata::transaction::TxOut {
404                 ::bitcoin::blockdata::transaction::TxOut {
405                         script_pubkey: self.script_pubkey.into_rust().into(),
406                         value: self.value,
407                 }
408         }
409         pub(crate) fn from_rust(txout: ::bitcoin::blockdata::transaction::TxOut) -> Self {
410                 Self {
411                         script_pubkey: derived::CVec_u8Z::from(txout.script_pubkey.into_bytes()),
412                         value: txout.value
413                 }
414         }
415 }
416
417 #[no_mangle]
418 /// Convenience function for constructing a new TxOut
419 pub extern "C" fn TxOut_new(script_pubkey: derived::CVec_u8Z, value: u64) -> TxOut {
420         TxOut { script_pubkey, value }
421 }
422 #[no_mangle]
423 /// Frees the data pointed to by script_pubkey.
424 pub extern "C" fn TxOut_free(_res: TxOut) { }
425 #[no_mangle]
426 /// Creates a new TxOut which has the same data as `orig` but with a new script buffer.
427 pub extern "C" fn TxOut_clone(orig: &TxOut) -> TxOut { orig.clone() }
428
429 #[repr(C)]
430 /// A "slice" referencing some byte array. This is simply a length-tagged pointer which does not
431 /// own the memory pointed to by data.
432 pub struct u8slice {
433         /// A pointer to the byte buffer
434         pub data: *const u8,
435         /// The number of bytes pointed to by `data`.
436         pub datalen: usize
437 }
438 impl u8slice {
439         pub(crate) fn from_slice(s: &[u8]) -> Self {
440                 Self {
441                         data: s.as_ptr(),
442                         datalen: s.len(),
443                 }
444         }
445         pub(crate) fn to_slice(&self) -> &[u8] {
446                 if self.datalen == 0 { return &[]; }
447                 unsafe { core::slice::from_raw_parts(self.data, self.datalen) }
448         }
449         pub(crate) fn to_reader<'a>(&'a self) -> Cursor<&'a [u8]> {
450                 let sl = self.to_slice();
451                 Cursor::new(sl)
452         }
453         pub(crate) fn from_vec(v: &derived::CVec_u8Z) -> u8slice {
454                 Self::from_slice(v.as_slice())
455         }
456 }
457 pub(crate) fn reader_to_vec<R: Read>(r: &mut R) -> derived::CVec_u8Z {
458         let mut res = Vec::new();
459         r.read_to_end(&mut res).unwrap();
460         derived::CVec_u8Z::from(res)
461 }
462
463 #[repr(C)]
464 #[derive(Copy, Clone)]
465 /// Arbitrary 32 bytes, which could represent one of a few different things. You probably want to
466 /// look up the corresponding function in rust-lightning's docs.
467 pub struct ThirtyTwoBytes {
468         /// The thirty-two bytes
469         pub data: [u8; 32],
470 }
471 impl ThirtyTwoBytes {
472         pub(crate) fn null() -> Self {
473                 Self { data: [0; 32] }
474         }
475 }
476
477 #[repr(C)]
478 /// A 3-byte byte array.
479 pub struct ThreeBytes { /** The three bytes */ pub data: [u8; 3], }
480 #[derive(Clone)]
481 #[repr(C)]
482 /// A 4-byte byte array.
483 pub struct FourBytes { /** The four bytes */ pub data: [u8; 4], }
484 #[derive(Clone)]
485 #[repr(C)]
486 /// A 12-byte byte array.
487 pub struct TwelveBytes { /** The twelve bytes */ pub data: [u8; 12], }
488 #[derive(Clone)]
489 #[repr(C)]
490 /// A 16-byte byte array.
491 pub struct SixteenBytes { /** The sixteen bytes */ pub data: [u8; 16], }
492 #[derive(Clone)]
493 #[repr(C)]
494 /// A 20-byte byte array.
495 pub struct TwentyBytes { /** The twenty bytes */ pub data: [u8; 20], }
496
497 pub(crate) struct VecWriter(pub Vec<u8>);
498 impl lightning::util::ser::Writer for VecWriter {
499         fn write_all(&mut self, buf: &[u8]) -> Result<(), io::Error> {
500                 self.0.extend_from_slice(buf);
501                 Ok(())
502         }
503 }
504 pub(crate) fn serialize_obj<I: lightning::util::ser::Writeable>(i: &I) -> derived::CVec_u8Z {
505         let mut out = VecWriter(Vec::new());
506         i.write(&mut out).unwrap();
507         derived::CVec_u8Z::from(out.0)
508 }
509 pub(crate) fn deserialize_obj<I: lightning::util::ser::Readable>(s: u8slice) -> Result<I, lightning::ln::msgs::DecodeError> {
510         I::read(&mut s.to_slice())
511 }
512 pub(crate) fn maybe_deserialize_obj<I: lightning::util::ser::MaybeReadable>(s: u8slice) -> Result<Option<I>, lightning::ln::msgs::DecodeError> {
513         I::read(&mut s.to_slice())
514 }
515 pub(crate) fn deserialize_obj_arg<A, I: lightning::util::ser::ReadableArgs<A>>(s: u8slice, args: A) -> Result<I, lightning::ln::msgs::DecodeError> {
516         I::read(&mut s.to_slice(), args)
517 }
518
519 #[repr(C)]
520 /// A Rust str object, ie a reference to a UTF8-valid string.
521 /// This is *not* null-terminated so cannot be used directly as a C string!
522 pub struct Str {
523         /// A pointer to the string's bytes, in UTF8 encoding
524         pub chars: *const u8,
525         /// The number of bytes (not characters!) pointed to by `chars`
526         pub len: usize,
527         /// Whether the data pointed to by `chars` should be freed or not.
528         pub chars_is_owned: bool,
529 }
530 impl Into<Str> for &'static str {
531         fn into(self) -> Str {
532                 Str { chars: self.as_ptr(), len: self.len(), chars_is_owned: false }
533         }
534 }
535 impl Into<Str> for &mut &'static str {
536         fn into(self) -> Str {
537                 let us: &'static str = *self;
538                 us.into()
539         }
540 }
541
542 impl Str {
543         pub(crate) fn into_str(&self) -> &'static str {
544                 if self.len == 0 { return ""; }
545                 core::str::from_utf8(unsafe { core::slice::from_raw_parts(self.chars, self.len) }).unwrap()
546         }
547         pub(crate) fn into_string(mut self) -> String {
548                 let bytes = if self.len == 0 {
549                         Vec::new()
550                 } else if self.chars_is_owned {
551                         let ret = unsafe {
552                                 Box::from_raw(core::slice::from_raw_parts_mut(unsafe { self.chars as *mut u8 }, self.len))
553                         }.into();
554                         self.chars_is_owned = false;
555                         ret
556                 } else {
557                         let mut ret = Vec::with_capacity(self.len);
558                         ret.extend_from_slice(unsafe { core::slice::from_raw_parts(self.chars, self.len) });
559                         ret
560                 };
561                 String::from_utf8(bytes).unwrap()
562         }
563 }
564 impl Into<Str> for String {
565         fn into(self) -> Str {
566                 let s = Box::leak(self.into_boxed_str());
567                 Str { chars: s.as_ptr(), len: s.len(), chars_is_owned: true }
568         }
569 }
570 impl Clone for Str {
571         fn clone(&self) -> Self {
572                 self.into_str().clone().into()
573         }
574 }
575
576 impl Drop for Str {
577         fn drop(&mut self) {
578                 if self.chars_is_owned && self.len != 0 {
579                         let _ = derived::CVec_u8Z { data: self.chars as *mut u8, datalen: self.len };
580                 }
581         }
582 }
583 #[no_mangle]
584 /// Frees the data buffer, if chars_is_owned is set and len > 0.
585 pub extern "C" fn Str_free(_res: Str) { }
586
587 // Note that the C++ headers memset(0) all the Templ types to avoid deallocation!
588 // Thus, they must gracefully handle being completely null in _free.
589
590 // TODO: Integer/bool primitives should avoid the pointer indirection for underlying types
591 // everywhere in the containers.
592
593 #[repr(C)]
594 pub(crate) union CResultPtr<O, E> {
595         pub(crate) result: *mut O,
596         pub(crate) err: *mut E,
597 }
598 #[repr(C)]
599 pub(crate) struct CResultTempl<O, E> {
600         pub(crate) contents: CResultPtr<O, E>,
601         pub(crate) result_ok: bool,
602 }
603 impl<O, E> CResultTempl<O, E> {
604         pub(crate) extern "C" fn ok(o: O) -> Self {
605                 CResultTempl {
606                         contents: CResultPtr {
607                                 result: Box::into_raw(Box::new(o)),
608                         },
609                         result_ok: true,
610                 }
611         }
612         pub(crate) extern "C" fn err(e: E) -> Self {
613                 CResultTempl {
614                         contents: CResultPtr {
615                                 err: Box::into_raw(Box::new(e)),
616                         },
617                         result_ok: false,
618                 }
619         }
620 }
621 impl<O, E> Drop for CResultTempl<O, E> {
622         fn drop(&mut self) {
623                 if self.result_ok {
624                         if unsafe { !self.contents.result.is_null() } {
625                                 unsafe { Box::from_raw(self.contents.result) };
626                         }
627                 } else if unsafe { !self.contents.err.is_null() } {
628                         unsafe { Box::from_raw(self.contents.err) };
629                 }
630         }
631 }
632
633 /// Utility to make it easy to set a pointer to null and get its original value in line.
634 pub(crate) trait TakePointer<T> {
635         fn take_ptr(&mut self) -> T;
636 }
637 impl<T> TakePointer<*const T> for *const T {
638         fn take_ptr(&mut self) -> *const T {
639                 let ret = *self;
640                 *self = core::ptr::null();
641                 ret
642         }
643 }
644 impl<T> TakePointer<*mut T> for *mut T {
645         fn take_ptr(&mut self) -> *mut T {
646                 let ret = *self;
647                 *self = core::ptr::null_mut();
648                 ret
649         }
650 }
651
652
653 pub(crate) mod ObjOps {
654         #[cfg(feature = "no-std")]
655         use alloc::boxed::Box;
656
657         #[inline]
658         #[must_use = "returns new dangling pointer"]
659         pub(crate) fn heap_alloc<T>(obj: T) -> *mut T {
660                 let ptr = Box::into_raw(Box::new(obj));
661                 nonnull_ptr_to_inner(ptr)
662         }
663         #[inline]
664         pub(crate) fn nonnull_ptr_to_inner<T>(ptr: *const T) -> *mut T {
665                 if core::mem::size_of::<T>() == 0 {
666                         // We map `None::<T>` as `T { inner: null, .. }` which works great for all
667                         // non-Zero-Sized-Types `T`.
668                         // For ZSTs, we need to differentiate between null implying `None` and null implying
669                         // `Some` with no allocation.
670                         // Thus, for ZSTs, we add one (usually) page here, which should always be aligned.
671                         // Note that this relies on undefined behavior! A pointer to NULL may be valid, but a
672                         // pointer to NULL + 4096 is almost certainly not. That said, Rust's existing use of
673                         // `(*mut T)1` for the pointer we're adding to is also not defined, so we should be
674                         // fine.
675                         // Note that we add 4095 here as at least the Java client assumes that the low bit on
676                         // any heap pointer is 0, which is generally provided by malloc, but which is not true
677                         // for ZSTs "allocated" by `Box::new`.
678                         debug_assert_eq!(ptr as usize, 1);
679                         unsafe { (ptr as *mut T).cast::<u8>().add(4096 - 1).cast::<T>() }
680                 } else {
681                         // In order to get better test coverage, also increment non-ZST pointers with
682                         // --cfg=test_mod_pointers, which is set in genbindings.sh for debug builds.
683                         #[cfg(test_mod_pointers)]
684                         unsafe { (ptr as *mut T).cast::<u8>().add(4096).cast::<T>() }
685                         #[cfg(not(test_mod_pointers))]
686                         unsafe { ptr as *mut T }
687                 }
688         }
689         #[inline]
690         /// Invert nonnull_ptr_to_inner
691         pub(crate) fn untweak_ptr<T>(ptr: *mut T) -> *mut T {
692                 if core::mem::size_of::<T>() == 0 {
693                         unsafe { ptr.cast::<u8>().sub(4096 - 1).cast::<T>() }
694                 } else {
695                         #[cfg(test_mod_pointers)]
696                         unsafe { ptr.cast::<u8>().sub(4096).cast::<T>() }
697                         #[cfg(not(test_mod_pointers))]
698                         ptr
699                 }
700         }
701 }
702
703 #[cfg(test_mod_pointers)]
704 #[no_mangle]
705 /// This function exists for memory safety testing purposes. It should never be used in production
706 /// code
707 pub extern "C" fn __unmangle_inner_ptr(ptr: *const c_void) -> *const c_void {
708         if ptr as usize == 1 {
709                 core::ptr::null()
710         } else {
711                 unsafe { ptr.cast::<u8>().sub(4096).cast::<c_void>() }
712         }
713 }
714
715 pub(crate) struct SmartPtr<T> {
716         ptr: *mut T,
717 }
718 impl<T> SmartPtr<T> {
719         pub(crate) fn from_obj(o: T) -> Self {
720                 Self { ptr: Box::into_raw(Box::new(o)) }
721         }
722         pub(crate) fn null() -> Self {
723                 Self { ptr: core::ptr::null_mut() }
724         }
725 }
726 impl<T> Drop for SmartPtr<T> {
727         fn drop(&mut self) {
728                 if self.ptr != core::ptr::null_mut() {
729                         unsafe { Box::from_raw(self.ptr); }
730                 }
731         }
732 }
733 impl<T> core::ops::Deref for SmartPtr<T> {
734         type Target = *mut T;
735         fn deref(&self) -> &*mut T {
736                 &self.ptr
737         }
738 }