summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2020-02-04 17:11:11 +0100
committerJustus Winter <justus@sequoia-pgp.org>2020-02-05 11:44:31 +0100
commit4ea8a7ca6cb2cb78e36b9735428e248b3cd9c3bf (patch)
tree3a97e0ca4a9e5cc6f8b576b18dc8cae3188fe0e2
parent8d662becb65d3da9439a7fe1445ed6335d5637bf (diff)
openpgp-ffi: Provide pgp_armor_writer_finalize.
-rw-r--r--openpgp-ffi/include/sequoia/openpgp.h10
-rw-r--r--openpgp-ffi/src/armor.rs32
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()))
+}