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 | |
parent | 8d662becb65d3da9439a7fe1445ed6335d5637bf (diff) |
openpgp-ffi: Provide pgp_armor_writer_finalize.
-rw-r--r-- | openpgp-ffi/include/sequoia/openpgp.h | 10 | ||||
-rw-r--r-- | openpgp-ffi/src/armor.rs | 32 |
2 files changed, 39 insertions, 3 deletions
diff --git a/openpgp-ffi/include/sequoia/openpgp.h b/openpgp-ffi/include/sequoia/openpgp.h index d15749d9..83c7416e 100644 --- a/openpgp-ffi/include/sequoia/openpgp.h +++ b/openpgp-ffi/include/sequoia/openpgp.h @@ -197,11 +197,21 @@ pgp_armor_header_t pgp_armor_reader_headers (pgp_error_t *errp, /// Constructs a new filter for the given type of data. /// /// A filter that applies ASCII Armor to the data written to it. +/// +/// Note: You must call `pgp_armor_writer_finalize` to deallocate this +/// writer. /*/ pgp_writer_t pgp_armor_writer_new (pgp_error_t *errp, pgp_writer_t inner, pgp_armor_kind_t kind, pgp_armor_header_t header, size_t header_len); +/*/ +/// Finalizes the armor writer. +/// +/// Consumes the writer. No further deallocation of the writer is +/// required. +/*/ +pgp_status_t pgp_armor_writer_finalize (pgp_error_t *errp, pgp_writer_t writer); /* openpgp::PacketPile. */ 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())) +} |