use libc::c_char;
use std::ptr;
use sequoia_store::{
self, Mapping, MappingIter, Binding, BundleIter, Key, KeyIter, LogIter, Store,
};
use super::error::Status;
use super::core::Context;
use crate::openpgp::fingerprint::Fingerprint;
use crate::openpgp::keyid::KeyID;
use crate::openpgp::cert::Cert;
use crate::RefRaw;
use crate::MoveIntoRaw;
use crate::MoveResultIntoRaw;
use crate::Maybe;
use crate::to_time_t;
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_store_list_mappings(ctx: *mut Context,
realm_prefix: *const c_char)
-> *mut MappingIter {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let realm_prefix = ffi_param_cstr!(realm_prefix).to_string_lossy();
ffi_try_box!(Mapping::list(&ctx.c, &realm_prefix))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_iter_next(iter: *mut MappingIter,
realmp: Option<&mut *mut c_char>,
namep: Option<&mut *mut c_char>,
policyp: Option<&mut u8>)
-> *mut Mapping {
let iter = ffi_param_ref_mut!(iter);
match iter.next() {
Some((realm, name, policy, mapping)) => {
if realmp.is_some() {
*realmp.unwrap() = ffi_return_maybe_string!(realm);
}
if namep.is_some() {
*namep.unwrap() = ffi_return_maybe_string!(name);
}
if policyp.is_some() {
*policyp.unwrap() = (&policy).into();
}
box_raw!(mapping)
},
None => ptr::null_mut(),
}
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_iter_free(iter: Option<&mut MappingIter>) {
ffi_free!(iter)
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_store_list_keys(ctx: *mut Context) -> *mut KeyIter {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
ffi_try_box!(Store::list_keys(&ctx.c))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_store_server_log(ctx: *mut Context) -> *mut LogIter {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
ffi_try_box!(Store::server_log(&ctx.c))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_key_iter_next(iter: *mut KeyIter,
fpp: Option<&mut Maybe<Fingerprint>>)
-> *mut Key {
let iter = ffi_param_ref_mut!(iter);
match iter.next() {
Some((fingerprint, key)) => {
if fpp.is_some() {
*fpp.unwrap() = Some(fingerprint).move_into_raw();
}
box_raw!(key)
},
None => {
if fpp.is_some() {
*fpp.unwrap() = None;
}
ptr::null_mut()
},
}
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_key_iter_free(iter: Option<&mut KeyIter>) {
ffi_free!(iter)
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_log_iter_next(iter: *mut LogIter) -> *mut Log {
let iter = ffi_param_ref_mut!(iter);
match iter.next() {
Some(e) => {
let (status, error) = match e.status {
Ok(s) => (ffi_return_string!(&s), ptr::null_mut()),
Err((s, e)) => (ffi_return_string!(&s), ffi_return_string!(&e)),
};
box_raw!(Log{
timestamp: to_time_t(e.timestamp),
mapping: maybe_box_raw!(e.mapping),
binding: maybe_box_raw!(e.binding),
key: maybe_box_raw!(e.key),
slug: ffi_return_string!(&e.slug),
status,
error,
})
},
None => ptr::null_mut(),
}
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_log_iter_free(iter: Option<&mut LogIter>) {
ffi_free!(iter)
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_open(ctx: *mut Context,
realm: *const c_char,
name: *const c_char)
-> *mut Mapping {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let realm = ffi_param_cstr!(realm).to_string_lossy();
let name = ffi_param_cstr!(name).to_string_lossy();
ffi_try_box!(Mapping::open(&ctx.c, &realm, &name))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_free(mapping: Option<&mut Mapping>) {
ffi_free!(mapping)
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_add(ctx: *mut Context,
mapping: *const Mapping,
label: *const c_char,
fingerprint: *const Fingerprint)
-> *mut Binding {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let mapping = ffi_param_ref!(mapping);
let label = ffi_param_cstr!(label).to_string_lossy();
let fingerprint = fingerprint.ref_raw();
ffi_try_box!(mapping.add(&label, fingerprint))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_import(ctx: *mut Context,
mapping: *const Mapping,
label: *const c_char,
cert: *const Cert)
-> Maybe<Cert> {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let mapping = ffi_param_ref!(mapping);
let label = ffi_param_cstr!(label).to_string_lossy();
let cert = cert.ref_raw();
mapping.import(&label, cert).move_into_raw(Some(ctx.errp()))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_lookup(ctx: *mut Context,
mapping: *const Mapping,
label: *const c_char)
-> *mut Binding {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let mapping = ffi_param_ref!(mapping);
let label = ffi_param_cstr!(label).to_string_lossy();
ffi_try_box!(mapping.lookup(&label))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_store_lookup_by_keyid(ctx: *mut Context, keyid: *const KeyID)
-> *mut Key
{
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let keyid = keyid.ref_raw();
ffi_try_box!(Store::lookup_by_keyid(&ctx.c, keyid))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_store_lookup_by_subkeyid(ctx: *mut Context, keyid: *const KeyID)
-> *mut Key
{
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let keyid = keyid.ref_raw();
ffi_try_box!(Store::lookup_by_subkeyid(&ctx.c, keyid))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_delete(ctx: *mut Context, mapping: *mut Mapping)
-> Status {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let mapping = ffi_param_move!(mapping);
ffi_try_status!(mapping.delete())
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_iter(ctx: *mut Context, mapping: *const Mapping)
-> *mut BundleIter {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let mapping = ffi_param_ref!(mapping);
ffi_try_box!(mapping.iter())
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_iter_next(iter: *mut BundleIter,
labelp: Option<&mut *mut c_char>,
fpp: Option<&mut Maybe<Fingerprint>>)
-> *mut Binding {
let iter = ffi_param_ref_mut!(iter);
match iter.next() {
Some((label, fp, binding)) => {
if labelp.is_some() {
*labelp.unwrap() = ffi_return_maybe_string!(label);
}
if fpp.is_some() {
*fpp.unwrap() = Some(fp).move_into_raw();
}
box_raw!(binding)
},
None => {
if fpp.is_some() {
*fpp.unwrap() = None;
}
ptr::null_mut()
},
}
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_iter_free(iter: Option<&mut BundleIter>) {
ffi_free!(iter)
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_mapping_log(ctx: *mut Context, mapping: *const Mapping)
-> *mut LogIter {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let mapping = ffi_param_ref!(mapping);
ffi_try_box!(mapping.log())
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_free(binding: Option<&mut Binding>) {
ffi_free!(binding)
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_key_free(key: Option<&mut Key>) {
ffi_free!(key)
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_log_free(log: Option<&mut Log>) {
if let Some(log) = log {
let log = unsafe { Box::from_raw(log) };
if ! log.mapping.is_null() {
ffi_param_move!(log.mapping);
}
if ! log.binding.is_null() {
ffi_param_move!(log.binding);
}
if ! log.key.is_null() {
ffi_param_move!(log.key);
}
unsafe {
libc::free(log.slug as *mut libc::c_void);
libc::free(log.status as *mut libc::c_void);
libc::free(log.error as *mut libc::c_void);
}
drop(log)
}
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_stats(ctx: *mut Context, binding: *const Binding)
-> *mut Stats {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let binding = ffi_param_ref!(binding);
box_raw!(Stats::new(ffi_try!(binding.stats())))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_key(ctx: *mut Context, binding: *const Binding)
-> *mut Key {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let binding = ffi_param_ref!(binding);
ffi_try_box!(binding.key())
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_cert(ctx: *mut Context, binding: *const Binding)
-> Maybe<Cert> {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let binding = ffi_param_ref!(binding);
binding.cert().move_into_raw(Some(ctx.errp()))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_import(ctx: *mut Context,
binding: *const Binding,
cert: *const Cert)
-> Maybe<Cert> {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let binding = ffi_param_ref!(binding);
let cert = cert.ref_raw();
binding.import(&cert).move_into_raw(Some(ctx.errp()))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_rotate(ctx: *mut Context,
binding: *const Binding,
cert: *const Cert)
-> Maybe<Cert> {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let binding = ffi_param_ref!(binding);
let cert = cert.ref_raw();
binding.rotate(&cert).move_into_raw(Some(ctx.errp()))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_delete(ctx: *mut Context,
binding: *mut Binding)
-> Status {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let binding = ffi_param_move!(binding);
ffi_try_status!(binding.delete())
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_binding_log(ctx: *mut Context,
binding: *const Binding)
-> *mut LogIter {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let binding = ffi_param_ref!(binding);
ffi_try_box!(binding.log())
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_key_stats(ctx: *mut Context,
key: *const Key)
-> *mut Stats {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let key = ffi_param_ref!(key);
box_raw!(Stats::new(ffi_try!(key.stats())))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_key_cert(ctx: *mut Context,
key: *const Key)
-> Maybe<Cert> {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let key = ffi_param_ref!(key);
key.cert().move_into_raw(Some(ctx.errp()))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_key_import(ctx: *mut Context,
key: *const Key,
cert: *const Cert)
-> Maybe<Cert> {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let key = ffi_param_ref!(key);
let cert = cert.ref_raw();
key.import(&cert).move_into_raw(Some(ctx.errp()))
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_key_log(ctx: *mut Context,
key: *const Key)
-> *mut LogIter {
let ctx = ffi_param_ref_mut!(ctx);
ffi_make_fry_from_ctx!(ctx);
let key = ffi_param_ref!(key);
ffi_try_box!(key.log())
}
#[::sequoia_ffi_macros::extern_fn] #[no_mangle] pub extern "C"
fn sq_stats_free(stats: Option<&mut Stats>) {
ffi_free!(stats)
}
#[repr(C)]
pub struct Stamps {
pub count: u64,
pub first: libc::time_t,
pub last: libc::time_t,
}
impl Stamps {
fn new(s: &sequoia_store::Stamps) -> Stamps {
Stamps{
count: s.count as u64,
first: to_time_t(s.first),
last: to_time_t(s.last),
}
}
}
#[repr(C)]
pub struct Stats {
pub created: libc::time_t,
pub updated: libc::time_t,
pub encryption: Stamps,
pub verification: Stamps,
}
impl Stats {
fn new(s: sequoia_store::Stats) -> Stats {
Stats {
created: to_time_t(s.created),
updated: to_time_t(s.updated),
encryption: Stamps::new(&s.encryption),
verification: Stamps::new(&s.verification),
}
}
}
#[repr(C)]
pub struct Log {
pub timestamp: libc::time_t,
pub mapping: *mut Mapping,
pub binding: *mut Binding,
pub key: *mut Key,
pub slug: *mut c_char,
pub status: *mut c_char,
pub error: *mut c_char,
}