summaryrefslogtreecommitdiffstats
path: root/openpgp-ffi/src/packet_pile.rs
blob: a08aa229834bad2c3781029f8b423b8b77a7198a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//! `PacketPile`s, deserialized sequences of OpenPGP messages.
//!
//!
//! Wraps [`sequoia-openpgp::PacketPile`].
//!
//! [`sequoia-openpgp::PacketPile`]: ../../../sequoia_openpgp/struct.PacketPile.html

use std::slice;
use std::io::{Read, Write};
use libc::{uint8_t, c_char, size_t};

extern crate sequoia_openpgp;
use self::sequoia_openpgp::{
    PacketPile,
    parse::Parse,
    serialize::Serialize,
};

use ::error::Status;

/// Deserializes the OpenPGP message stored in a `std::io::Read`
/// object.
///
/// Although this method is easier to use to parse an OpenPGP
/// message than a `PacketParser` or a `PacketPileParser`, this
/// interface buffers the whole message in memory.  Thus, the
/// caller must be certain that the *deserialized* message is not
/// too large.
///
/// Note: this interface *does* buffer the contents of packets.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_from_reader(errp: Option<&mut *mut failure::Error>,
                                                  reader: *mut Box<Read>)
                                                  -> *mut PacketPile {
    ffi_make_fry_from_errp!(errp);
    let reader = ffi_param_ref_mut!(reader);
    ffi_try_box!(PacketPile::from_reader(reader))
}

/// Deserializes the OpenPGP message stored in the file named by
/// `filename`.
///
/// See `pgp_packet_pile_from_reader` for more details and caveats.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_from_file(errp: Option<&mut *mut failure::Error>,
                                                filename: *const c_char)
                                                -> *mut PacketPile {
    ffi_make_fry_from_errp!(errp);
    let filename = ffi_param_cstr!(filename).to_string_lossy().into_owned();
    ffi_try_box!(PacketPile::from_file(&filename))
}

/// Deserializes the OpenPGP message stored in the provided buffer.
///
/// See `pgp_packet_pile_from_reader` for more details and caveats.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_from_bytes(errp: Option<&mut *mut failure::Error>,
                                                 b: *const uint8_t, len: size_t)
                                                 -> *mut PacketPile {
    ffi_make_fry_from_errp!(errp);
    assert!(!b.is_null());
    let buf = unsafe {
        slice::from_raw_parts(b, len as usize)
    };

    ffi_try_box!(PacketPile::from_bytes(buf))
}

/// Frees the packet_pile.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_free(packet_pile: Option<&mut PacketPile>)
{
    ffi_free!(packet_pile)
}

/// Clones the PacketPile.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_clone(packet_pile: *const PacketPile)
                                            -> *mut PacketPile {
    let packet_pile = ffi_param_ref!(packet_pile);
    box_raw!(packet_pile.clone())
}

/// Serializes the packet pile.
#[::ffi_catch_abort] #[no_mangle]
pub extern "system" fn pgp_packet_pile_serialize(errp: Option<&mut *mut failure::Error>,
                                                packet_pile: *const PacketPile,
                                                writer: *mut Box<Write>)
                                                -> Status {
    ffi_make_fry_from_errp!(errp);
    let packet_pile = ffi_param_ref!(packet_pile);
    let writer = ffi_param_ref_mut!(writer);
    ffi_try_status!(packet_pile.serialize(writer))
}