diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2020-02-04 17:11:11 +0100 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2020-02-05 11:44:31 +0100 |
commit | 4ea8a7ca6cb2cb78e36b9735428e248b3cd9c3bf (patch) | |
tree | 3a97e0ca4a9e5cc6f8b576b18dc8cae3188fe0e2 /openpgp-ffi/src | |
parent | 8d662becb65d3da9439a7fe1445ed6335d5637bf (diff) |
openpgp-ffi: Provide pgp_armor_writer_finalize.
Diffstat (limited to 'openpgp-ffi/src')
-rw-r--r-- | openpgp-ffi/src/armor.rs | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/openpgp-ffi/src/armor.rs b/openpgp-ffi/src/armor.rs index c4f428e4..a083c573 100644 --- a/openpgp-ffi/src/armor.rs +++ b/openpgp-ffi/src/armor.rs @@ -14,6 +14,7 @@ use self::sequoia_openpgp::armor; use super::io::{Reader, ReaderKind, WriterKind}; use crate::Maybe; +use crate::MoveFromRaw; use crate::MoveIntoRaw; use crate::MoveResultIntoRaw; use crate::RefRaw; @@ -302,6 +303,9 @@ pub extern "C" fn pgp_armor_reader_headers(errp: Option<&mut *mut crate::error:: /// /// A filter that applies ASCII Armor to the data written to it. /// +/// Note: You must call `pgp_armor_writer_finalize` to deallocate this +/// writer. +/// /// # Example /// /// ```c @@ -321,7 +325,7 @@ pub extern "C" fn pgp_armor_reader_headers(errp: Option<&mut *mut crate::error:: /// size_t len = 0; /// pgp_writer_t alloc; /// pgp_writer_t armor; -/// pgp_error_t err; +/// pgp_error_t err = NULL; /// /// char *message = "Hello world!"; /// struct pgp_armor_header header[] = { @@ -336,8 +340,9 @@ pub extern "C" fn pgp_armor_reader_headers(errp: Option<&mut *mut crate::error:: /// /// if (pgp_writer_write (&err, armor, (uint8_t *) message, strlen (message)) < 0) /// error (1, 0, "Writing failed: %s", pgp_error_to_string (err)); -// -/// pgp_writer_free (armor); +/// +/// pgp_armor_writer_finalize (&err, armor); +/// assert (err == NULL); /// pgp_writer_free (alloc); /// /// assert (len == 114); @@ -389,3 +394,24 @@ pub extern "C" fn pgp_armor_writer_new .map_err(|e| ::failure::Error::from(e)) .move_into_raw(errp) } + +/// Finalizes the armor writer. +/// +/// Consumes the writer. No further deallocation of the writer is +/// required. +#[::sequoia_ffi_macros::extern_fn] #[no_mangle] +pub extern "C" fn pgp_armor_writer_finalize + (errp: Option<&mut *mut crate::error::Error>, + writer: *mut super::io::Writer) + -> crate::error::Status +{ + ffi_make_fry_from_errp!(errp); + let writer = if let WriterKind::Armored(writer) = writer.move_from_raw() { + writer + } else { + panic!("FFI contract violation: Wrong parameter type: \ + expected armor writer"); + }; + + ffi_try_status!(writer.finalize().map_err(|e| e.into())) +} |