refactor(mmime): rustify mailbox

This commit is contained in:
dignifiedquire
2019-09-28 14:42:06 -06:00
parent c18bdc39e5
commit 50ca75398f
5 changed files with 59 additions and 62 deletions

View File

@@ -221,13 +221,10 @@ unsafe fn display_orig_date(mut orig_date: *mut mailimf_orig_date) {
display_date_time((*orig_date).dt_date_time); display_date_time((*orig_date).dt_date_time);
} }
unsafe fn display_mailbox(mut mb: *mut mailimf_mailbox) { unsafe fn display_mailbox(mut mb: *mut mailimf_mailbox) {
if !(*mb).mb_display_name.is_null() { if !(*mb).display_name.is_null() {
print!( print!("{}", CStr::from_ptr((*mb).display_name).to_str().unwrap());
"{}",
CStr::from_ptr((*mb).mb_display_name).to_str().unwrap()
);
} }
print!("<{}>", CStr::from_ptr((*mb).mb_addr_spec).to_str().unwrap()); print!("<{}>", CStr::from_ptr((*mb).addr_spec).to_str().unwrap());
} }
unsafe fn display_mailbox_list(mut mb_list: *mut mailimf_mailbox_list) { unsafe fn display_mailbox_list(mut mb_list: *mut mailimf_mailbox_list) {
for (i, mb) in (*mb_list).0.iter().enumerate() { for (i, mb) in (*mb_list).0.iter().enumerate() {

View File

@@ -75,22 +75,26 @@ impl Drop for mailimf_mailbox_list {
} }
} }
/* /// A single mailbox.
mailimf_mailbox is a mailbox #[derive(Clone)]
- display_name is the name that will be displayed for this mailbox,
for example 'name' in '"name" <mailbox@domain>,
should be allocated with malloc()
- addr_spec is the mailbox, for example 'mailbox@domain'
in '"name" <mailbox@domain>, should be allocated with malloc()
*/
#[derive(Copy, Clone)]
#[repr(C)]
pub struct mailimf_mailbox { pub struct mailimf_mailbox {
pub mb_display_name: *mut libc::c_char, /// The name that will be displayed for this mailbox,
pub mb_addr_spec: *mut libc::c_char, /// for example 'name' in '"name" <mailbox@domain>.
pub display_name: *mut libc::c_char,
/// addr_spec is the mailbox, for example 'mailbox@domain'
/// in '"name" <mailbox@domain>.
pub addr_spec: *mut libc::c_char,
} }
impl Drop for mailimf_mailbox {
fn drop(&mut self) {
if !self.display_name.is_null() {
unsafe { mailimf_display_name_free(self.display_name) };
}
unsafe { mailimf_addr_spec_free(self.addr_spec) };
}
}
/* /*
mailimf_address_list is a list of addresses mailimf_address_list is a list of addresses
@@ -518,31 +522,28 @@ pub unsafe fn mailimf_mailbox_list_free(mb_list: *mut mailimf_mailbox_list) {
let _ = Box::from_raw(mb_list); let _ = Box::from_raw(mb_list);
} }
#[no_mangle] pub unsafe fn mailimf_mailbox_free(mailbox: *mut mailimf_mailbox) {
pub unsafe fn mailimf_mailbox_free(mut mailbox: *mut mailimf_mailbox) { if mailbox.is_null() {
if !(*mailbox).mb_display_name.is_null() { return;
mailimf_display_name_free((*mailbox).mb_display_name);
} }
mailimf_addr_spec_free((*mailbox).mb_addr_spec); let _ = Box::from_raw(mailbox);
free(mailbox as *mut libc::c_void);
} }
#[no_mangle] #[no_mangle]
pub unsafe fn mailimf_addr_spec_free(mut addr_spec: *mut libc::c_char) { pub unsafe fn mailimf_addr_spec_free(mut addr_spec: *mut libc::c_char) {
free(addr_spec as *mut libc::c_void); free(addr_spec as *mut libc::c_void);
} }
#[no_mangle]
pub unsafe fn mailimf_mailbox_new( pub fn mailimf_mailbox_new(
mut mb_display_name: *mut libc::c_char, display_name: *mut libc::c_char,
mut mb_addr_spec: *mut libc::c_char, addr_spec: *mut libc::c_char,
) -> *mut mailimf_mailbox { ) -> *mut mailimf_mailbox {
let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox; let mb = mailimf_mailbox {
mb = malloc(::std::mem::size_of::<mailimf_mailbox>() as libc::size_t) as *mut mailimf_mailbox; display_name,
if mb.is_null() { addr_spec,
return 0 as *mut mailimf_mailbox; };
}
(*mb).mb_display_name = mb_display_name; Box::into_raw(Box::new(mb))
(*mb).mb_addr_spec = mb_addr_spec;
return mb;
} }
pub fn mailimf_group_new( pub fn mailimf_group_new(

View File

@@ -1084,21 +1084,21 @@ unsafe fn mailimf_mailbox_write_driver(
) -> libc::c_int { ) -> libc::c_int {
let mut r: libc::c_int = 0; let mut r: libc::c_int = 0;
let mut do_fold: libc::c_int = 0; let mut do_fold: libc::c_int = 0;
if !(*mb).mb_display_name.is_null() { if !(*mb).display_name.is_null() {
if 0 != is_atext((*mb).mb_display_name) { if 0 != is_atext((*mb).display_name) {
r = mailimf_header_string_write_driver( r = mailimf_header_string_write_driver(
do_write, do_write,
data, data,
col, col,
(*mb).mb_display_name, (*mb).display_name,
strlen((*mb).mb_display_name), strlen((*mb).display_name),
); );
if r != MAILIMF_NO_ERROR as libc::c_int { if r != MAILIMF_NO_ERROR as libc::c_int {
return r; return r;
} }
} else { } else {
if !(*mb).mb_display_name.is_null() { if !(*mb).display_name.is_null() {
if (*col as libc::size_t).wrapping_add(strlen((*mb).mb_display_name)) if (*col as libc::size_t).wrapping_add(strlen((*mb).display_name))
>= 72i32 as libc::size_t >= 72i32 as libc::size_t
{ {
r = mailimf_string_write_driver( r = mailimf_string_write_driver(
@@ -1113,15 +1113,15 @@ unsafe fn mailimf_mailbox_write_driver(
} }
} }
} }
if strlen((*mb).mb_display_name) > (998i32 / 2i32) as libc::size_t { if strlen((*mb).display_name) > (998i32 / 2i32) as libc::size_t {
return MAILIMF_ERROR_INVAL as libc::c_int; return MAILIMF_ERROR_INVAL as libc::c_int;
} }
r = mailimf_quoted_string_write_driver( r = mailimf_quoted_string_write_driver(
do_write, do_write,
data, data,
col, col,
(*mb).mb_display_name, (*mb).display_name,
strlen((*mb).mb_display_name), strlen((*mb).display_name),
); );
if r != MAILIMF_NO_ERROR as libc::c_int { if r != MAILIMF_NO_ERROR as libc::c_int {
return r; return r;
@@ -1130,7 +1130,7 @@ unsafe fn mailimf_mailbox_write_driver(
do_fold = 0i32; do_fold = 0i32;
if *col > 1i32 { if *col > 1i32 {
if (*col as libc::size_t) if (*col as libc::size_t)
.wrapping_add(strlen((*mb).mb_addr_spec)) .wrapping_add(strlen((*mb).addr_spec))
.wrapping_add(3i32 as libc::size_t) .wrapping_add(3i32 as libc::size_t)
>= 72i32 as libc::size_t >= 72i32 as libc::size_t
{ {
@@ -1171,8 +1171,8 @@ unsafe fn mailimf_mailbox_write_driver(
do_write, do_write,
data, data,
col, col,
(*mb).mb_addr_spec, (*mb).addr_spec,
strlen((*mb).mb_addr_spec), strlen((*mb).addr_spec),
); );
if r != MAILIMF_NO_ERROR as libc::c_int { if r != MAILIMF_NO_ERROR as libc::c_int {
return r; return r;
@@ -1188,8 +1188,7 @@ unsafe fn mailimf_mailbox_write_driver(
return r; return r;
} }
} else { } else {
if (*col as libc::size_t).wrapping_add(strlen((*mb).mb_addr_spec)) >= 72i32 as libc::size_t if (*col as libc::size_t).wrapping_add(strlen((*mb).addr_spec)) >= 72i32 as libc::size_t {
{
r = mailimf_string_write_driver( r = mailimf_string_write_driver(
do_write, do_write,
data, data,
@@ -1205,8 +1204,8 @@ unsafe fn mailimf_mailbox_write_driver(
do_write, do_write,
data, data,
col, col,
(*mb).mb_addr_spec, (*mb).addr_spec,
strlen((*mb).mb_addr_spec), strlen((*mb).addr_spec),
); );
if r != MAILIMF_NO_ERROR as libc::c_int { if r != MAILIMF_NO_ERROR as libc::c_int {
return r; return r;

View File

@@ -847,7 +847,7 @@ impl<'a> MimeParser<'a> {
.unwrap_or_else(|| ptr::null_mut()); .unwrap_or_else(|| ptr::null_mut());
if !mb.is_null() { if !mb.is_null() {
let from_addr_norm = addr_normalize(as_str((*mb).mb_addr_spec)); let from_addr_norm = addr_normalize(as_str((*mb).addr_spec));
let recipients = mailimf_get_recipients(self.header_root); let recipients = mailimf_get_recipients(self.header_root);
if recipients.len() == 1 { if recipients.len() == 1 {
if recipients.contains(from_addr_norm) { if recipients.contains(from_addr_norm) {
@@ -916,8 +916,8 @@ pub fn mailimf_find_first_addr(mb_list: *const mailimf_mailbox_list) -> Option<S
for mb in unsafe { &(*mb_list).0 } { for mb in unsafe { &(*mb_list).0 } {
let mb = *mb; let mb = *mb;
if !mb.is_null() && !unsafe { (*mb).mb_addr_spec.is_null() } { if !mb.is_null() && !unsafe { (*mb).addr_spec.is_null() } {
let addr = unsafe { as_str((*mb).mb_addr_spec) }; let addr = unsafe { as_str((*mb).addr_spec) };
return Some(addr_normalize(addr).to_string()); return Some(addr_normalize(addr).to_string());
} }
} }
@@ -1272,7 +1272,7 @@ pub fn mailimf_get_recipients(imffields: *mut mailimf_fields) -> HashSet<String>
fn mailimf_get_recipients_add_addr(recipients: &mut HashSet<String>, mb: *mut mailimf_mailbox) { fn mailimf_get_recipients_add_addr(recipients: &mut HashSet<String>, mb: *mut mailimf_mailbox) {
if !mb.is_null() { if !mb.is_null() {
let addr_norm = addr_normalize(as_str(unsafe { (*mb).mb_addr_spec })); let addr_norm = addr_normalize(as_str(unsafe { (*mb).addr_spec }));
recipients.insert(addr_norm.into()); recipients.insert(addr_norm.into());
} }
} }

View File

@@ -1868,8 +1868,8 @@ unsafe fn dc_add_or_lookup_contacts_by_address_list(
if !mb.is_null() { if !mb.is_null() {
add_or_lookup_contact_by_addr( add_or_lookup_contact_by_addr(
context, context,
(*mb).mb_display_name, (*mb).display_name,
(*mb).mb_addr_spec, (*mb).addr_spec,
origin, origin,
ids, ids,
check_self, check_self,
@@ -1906,8 +1906,8 @@ unsafe fn dc_add_or_lookup_contacts_by_mailbox_list(
if !mb.is_null() { if !mb.is_null() {
add_or_lookup_contact_by_addr( add_or_lookup_contact_by_addr(
context, context,
(*mb).mb_display_name, (*mb).display_name,
(*mb).mb_addr_spec, (*mb).addr_spec,
origin, origin,
ids, ids,
check_self, check_self,