diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 4fbe3b4bb..15b55a8d7 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -1563,7 +1563,13 @@ pub unsafe extern "C" fn dc_initiate_key_transfer(context: *mut dc_context_t) -> } let ffi_context = &*context; ffi_context - .with_inner(|ctx| dc_imex::dc_initiate_key_transfer(ctx)) + .with_inner(|ctx| match dc_imex::dc_initiate_key_transfer(ctx) { + Ok(res) => res.strdup(), + Err(err) => { + error!(ctx, "dc_initiate_key_transfer(): {}", err); + ptr::null_mut() + } + }) .unwrap_or_else(|_| ptr::null_mut()) } diff --git a/examples/repl/cmdline.rs b/examples/repl/cmdline.rs index 9826b959b..d7c09286c 100644 --- a/examples/repl/cmdline.rs +++ b/examples/repl/cmdline.rs @@ -414,18 +414,13 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E =============================================" ), }, - "initiate-key-transfer" => { - let setup_code = dc_initiate_key_transfer(context); - if !setup_code.is_null() { - println!( - "Setup code for the transferred setup message: {}", - as_str(setup_code), - ); - free(setup_code as *mut libc::c_void); - } else { - bail!("Failed to generate setup code"); - }; - } + "initiate-key-transfer" => match dc_initiate_key_transfer(context) { + Ok(setup_code) => println!( + "Setup code for the transferred setup message: {}", + setup_code, + ), + Err(err) => bail!("Failed to generate setup code: {}", err), + }, "get-setupcodebegin" => { ensure!(!arg1.is_empty(), "Argument missing."); let msg_id: u32 = arg1.parse()?; diff --git a/src/dc_imex.rs b/src/dc_imex.rs index 54c1e9aa3..5875fd772 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -75,11 +75,9 @@ pub fn dc_imex_has_backup(context: &Context, dir_name: impl AsRef) -> Resu } } -pub unsafe fn dc_initiate_key_transfer(context: &Context) -> *mut libc::c_char { +pub fn dc_initiate_key_transfer(context: &Context) -> Result { let mut msg: Message; - if !dc_alloc_ongoing(context) { - return std::ptr::null_mut(); - } + ensure!(dc_alloc_ongoing(context), "could not allocate ongoing"); let setup_code = dc_create_setup_code(context); /* this may require a keypair to be created. this may take a second ... */ if !context @@ -149,7 +147,7 @@ pub unsafe fn dc_initiate_key_transfer(context: &Context) -> *mut libc::c_char { } dc_free_ongoing(context); - setup_code.strdup() + Ok(setup_code) } /// Renders HTML body of a setup file message.