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);
}
unsafe fn display_mailbox(mut mb: *mut mailimf_mailbox) {
if !(*mb).mb_display_name.is_null() {
print!(
"{}",
CStr::from_ptr((*mb).mb_display_name).to_str().unwrap()
);
if !(*mb).display_name.is_null() {
print!("{}", CStr::from_ptr((*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) {
for (i, mb) in (*mb_list).0.iter().enumerate() {

View File

@@ -75,22 +75,26 @@ impl Drop for mailimf_mailbox_list {
}
}
/*
mailimf_mailbox is a mailbox
- 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)]
/// A single mailbox.
#[derive(Clone)]
pub struct mailimf_mailbox {
pub mb_display_name: *mut libc::c_char,
pub mb_addr_spec: *mut libc::c_char,
/// The name that will be displayed for this mailbox,
/// 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
@@ -518,31 +522,28 @@ pub unsafe fn mailimf_mailbox_list_free(mb_list: *mut mailimf_mailbox_list) {
let _ = Box::from_raw(mb_list);
}
#[no_mangle]
pub unsafe fn mailimf_mailbox_free(mut mailbox: *mut mailimf_mailbox) {
if !(*mailbox).mb_display_name.is_null() {
mailimf_display_name_free((*mailbox).mb_display_name);
pub unsafe fn mailimf_mailbox_free(mailbox: *mut mailimf_mailbox) {
if mailbox.is_null() {
return;
}
mailimf_addr_spec_free((*mailbox).mb_addr_spec);
free(mailbox as *mut libc::c_void);
let _ = Box::from_raw(mailbox);
}
#[no_mangle]
pub unsafe fn mailimf_addr_spec_free(mut addr_spec: *mut libc::c_char) {
free(addr_spec as *mut libc::c_void);
}
#[no_mangle]
pub unsafe fn mailimf_mailbox_new(
mut mb_display_name: *mut libc::c_char,
mut mb_addr_spec: *mut libc::c_char,
pub fn mailimf_mailbox_new(
display_name: *mut libc::c_char,
addr_spec: *mut libc::c_char,
) -> *mut mailimf_mailbox {
let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox;
mb = malloc(::std::mem::size_of::<mailimf_mailbox>() as libc::size_t) as *mut mailimf_mailbox;
if mb.is_null() {
return 0 as *mut mailimf_mailbox;
}
(*mb).mb_display_name = mb_display_name;
(*mb).mb_addr_spec = mb_addr_spec;
return mb;
let mb = mailimf_mailbox {
display_name,
addr_spec,
};
Box::into_raw(Box::new(mb))
}
pub fn mailimf_group_new(

View File

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

View File

@@ -847,7 +847,7 @@ impl<'a> MimeParser<'a> {
.unwrap_or_else(|| ptr::null_mut());
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);
if recipients.len() == 1 {
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 } {
let mb = *mb;
if !mb.is_null() && !unsafe { (*mb).mb_addr_spec.is_null() } {
let addr = unsafe { as_str((*mb).mb_addr_spec) };
if !mb.is_null() && !unsafe { (*mb).addr_spec.is_null() } {
let addr = unsafe { as_str((*mb).addr_spec) };
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) {
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());
}
}

View File

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