start refactor of fields

This commit is contained in:
dignifiedquire
2019-09-28 16:30:22 -06:00
parent 347a4d110a
commit 625bc90c30
6 changed files with 506 additions and 2082 deletions

View File

@@ -50,10 +50,7 @@ pub unsafe fn display_mime(mut mime: *mut Mailmime) {
}
MAILMIME_MESSAGE => {
if !(*mime).mm_data.mm_message.mm_fields.is_null() {
if !(*(*(*mime).mm_data.mm_message.mm_fields).fld_list)
.first
.is_null()
{
if !(*(*mime).mm_data.mm_message.mm_fields).0.is_empty() {
println!("headers begin");
display_fields((*mime).mm_data.mm_message.mm_fields);
println!("headers end");
@@ -279,59 +276,44 @@ unsafe fn display_cc(mut cc: *mut mailimf_cc) {
unsafe fn display_subject(mut subject: *mut mailimf_subject) {
print!("{}", CStr::from_ptr((*subject).sbj_value).to_str().unwrap());
}
unsafe fn display_field(mut field: *mut mailimf_field) {
match (*field).fld_type {
9 => {
unsafe fn display_field(field: &mailimf_field) {
match *field {
mailimf_field::OrigDate(date) => {
print!("Date: ");
display_orig_date((*field).fld_data.fld_orig_date);
display_orig_date(date);
println!("");
}
10 => {
mailimf_field::From(from) => {
print!("From: ");
display_from((*field).fld_data.fld_from);
display_from(from);
println!("");
}
13 => {
mailimf_field::To(to) => {
print!("To: ");
display_to((*field).fld_data.fld_to);
display_to(to);
println!("");
}
14 => {
mailimf_field::Cc(cc) => {
print!("Cc: ");
display_cc((*field).fld_data.fld_cc);
display_cc(cc);
println!("");
}
19 => {
mailimf_field::Subject(subject) => {
print!("Subject: ");
display_subject((*field).fld_data.fld_subject);
display_subject(subject);
println!("");
}
16 => {
mailimf_field::MessageId(message_id) => {
println!(
"Message-ID: {}",
CStr::from_ptr((*(*field).fld_data.fld_message_id).mid_value)
.to_str()
.unwrap(),
CStr::from_ptr((*message_id).mid_value).to_str().unwrap(),
);
}
_ => {}
};
}
unsafe fn display_fields(mut fields: *mut mailimf_fields) {
let mut cur: *mut clistiter = 0 as *mut clistiter;
cur = (*(*fields).fld_list).first;
while !cur.is_null() {
let mut f: *mut mailimf_field = 0 as *mut mailimf_field;
f = (if !cur.is_null() {
(*cur).data
} else {
0 as *mut libc::c_void
}) as *mut mailimf_field;
unsafe fn display_fields(fields: *mut mailimf_fields) {
for f in &(*fields).0 {
display_field(f);
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -134,100 +134,70 @@ pub struct mailimf_message {
pub msg_fields: *mut mailimf_fields,
pub msg_body: *mut mailimf_body,
}
/*
mailimf_fields is a list of header fields
- fld_list is a list of header fields
*/
#[derive(Copy, Clone)]
#[repr(C)]
pub struct mailimf_fields {
pub fld_list: *mut clist,
/// List of header field.
#[derive(Debug, Clone)]
pub struct mailimf_fields(pub Vec<mailimf_field>);
#[derive(Debug, Clone)]
pub enum mailimf_field {
ReturnPath(*mut mailimf_return),
ResentDate(*mut mailimf_orig_date),
ResentFrom(*mut mailimf_from),
ResentSender(*mut mailimf_sender),
ResentTo(*mut mailimf_to),
ResentCc(*mut mailimf_cc),
ResentBcc(*mut mailimf_bcc),
ResentMsgId(*mut mailimf_message_id),
OrigDate(*mut mailimf_orig_date),
From(*mut mailimf_from),
Sender(*mut mailimf_sender),
ReplyTo(*mut mailimf_reply_to),
To(*mut mailimf_to),
Cc(*mut mailimf_cc),
Bcc(*mut mailimf_bcc),
MessageId(*mut mailimf_message_id),
InReplyTo(*mut mailimf_in_reply_to),
References(*mut mailimf_references),
Subject(*mut mailimf_subject),
Comments(*mut mailimf_comments),
Keywords(*mut mailimf_keywords),
OptionalField(*mut mailimf_optional_field),
}
/*
mailimf_field is a field
- fld_type is the type of the field
- fld_data.fld_return_path is the parsed content of the Return-Path
field if type is MAILIMF_FIELD_RETURN_PATH
- fld_data.fld_resent_date is the parsed content of the Resent-Date field
if type is MAILIMF_FIELD_RESENT_DATE
- fld_data.fld_resent_from is the parsed content of the Resent-From field
- fld_data.fld_resent_sender is the parsed content of the Resent-Sender field
- fld_data.fld_resent_to is the parsed content of the Resent-To field
- fld_data.fld_resent_cc is the parsed content of the Resent-Cc field
- fld_data.fld_resent_bcc is the parsed content of the Resent-Bcc field
- fld_data.fld_resent_msg_id is the parsed content of the Resent-Message-ID
field
- fld_data.fld_orig_date is the parsed content of the Date field
- fld_data.fld_from is the parsed content of the From field
- fld_data.fld_sender is the parsed content of the Sender field
- fld_data.fld_reply_to is the parsed content of the Reply-To field
- fld_data.fld_to is the parsed content of the To field
- fld_data.fld_cc is the parsed content of the Cc field
- fld_data.fld_bcc is the parsed content of the Bcc field
- fld_data.fld_message_id is the parsed content of the Message-ID field
- fld_data.fld_in_reply_to is the parsed content of the In-Reply-To field
- fld_data.fld_references is the parsed content of the References field
- fld_data.fld_subject is the content of the Subject field
- fld_data.fld_comments is the content of the Comments field
- fld_data.fld_keywords is the parsed content of the Keywords field
- fld_data.fld_optional_field is an other field and is not parsed
*/
#[derive(Copy, Clone)]
#[repr(C)]
pub struct mailimf_field {
pub fld_type: libc::c_int,
pub fld_data: unnamed_1,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub union unnamed_1 {
pub fld_return_path: *mut mailimf_return,
pub fld_resent_date: *mut mailimf_orig_date,
pub fld_resent_from: *mut mailimf_from,
pub fld_resent_sender: *mut mailimf_sender,
pub fld_resent_to: *mut mailimf_to,
pub fld_resent_cc: *mut mailimf_cc,
pub fld_resent_bcc: *mut mailimf_bcc,
pub fld_resent_msg_id: *mut mailimf_message_id,
pub fld_orig_date: *mut mailimf_orig_date,
pub fld_from: *mut mailimf_from,
pub fld_sender: *mut mailimf_sender,
pub fld_reply_to: *mut mailimf_reply_to,
pub fld_to: *mut mailimf_to,
pub fld_cc: *mut mailimf_cc,
pub fld_bcc: *mut mailimf_bcc,
pub fld_message_id: *mut mailimf_message_id,
pub fld_in_reply_to: *mut mailimf_in_reply_to,
pub fld_references: *mut mailimf_references,
pub fld_subject: *mut mailimf_subject,
pub fld_comments: *mut mailimf_comments,
pub fld_keywords: *mut mailimf_keywords,
pub fld_optional_field: *mut mailimf_optional_field,
impl Drop for mailimf_field {
fn drop(&mut self) {
use mailimf_field::*;
unsafe {
match self {
ReturnPath(p) => mailimf_return_free(*p),
OrigDate(d) => mailimf_orig_date_free(*d),
ResentFrom(r) => mailimf_from_free(*r),
ResentSender(r) => mailimf_sender_free(*r),
ResentTo(r) => mailimf_to_free(*r),
ResentCc(r) => mailimf_cc_free(*r),
ResentBcc(r) => mailimf_bcc_free(*r),
ResentMsgId(r) => mailimf_message_id_free(*r),
OrigDate(d) => mailimf_orig_date_free(*d),
From(f) => mailimf_from_free(*f),
Sender(s) => mailimf_sender_free(*s),
ReplyTo(t) => mailimf_reply_to_free(*t),
To(t) => mailimf_to_free(*t),
Cc(c) => mailimf_cc_free(*c),
Bcc(c) => mailimf_bcc_free(*c),
MessageId(m) => mailimf_message_id_free(*m),
InReplyTo(i) => mailimf_in_reply_to_free(*i),
References(r) => mailimf_references_free(*r),
Subject(s) => mailimf_subject_free(*s),
Comments(c) => mailimf_comments_free(*c),
Keywords(k) => mailimf_keywords_free(*k),
OptionalField(o) => mailimf_optional_field_free(*o),
_ => {}
}
}
}
}
/*
mailimf_optional_field is a non-parsed field
@@ -634,93 +604,15 @@ pub unsafe fn mailimf_message_free(mut message: *mut mailimf_message) {
mailimf_fields_free((*message).msg_fields);
free(message as *mut libc::c_void);
}
#[no_mangle]
pub unsafe fn mailimf_fields_free(mut fields: *mut mailimf_fields) {
if !(*fields).fld_list.is_null() {
clist_foreach(
(*fields).fld_list,
::std::mem::transmute::<Option<unsafe fn(_: *mut mailimf_field) -> ()>, clist_func>(
Some(mailimf_field_free),
),
0 as *mut libc::c_void,
);
clist_free((*fields).fld_list);
pub unsafe fn mailimf_fields_free(fields: *mut mailimf_fields) {
if fields.is_null() {
return;
}
free(fields as *mut libc::c_void);
}
#[no_mangle]
pub unsafe fn mailimf_field_free(mut field: *mut mailimf_field) {
match (*field).fld_type {
1 => {
mailimf_return_free((*field).fld_data.fld_return_path);
}
2 => {
mailimf_orig_date_free((*field).fld_data.fld_resent_date);
}
3 => {
mailimf_from_free((*field).fld_data.fld_resent_from);
}
4 => {
mailimf_sender_free((*field).fld_data.fld_resent_sender);
}
5 => {
mailimf_to_free((*field).fld_data.fld_resent_to);
}
6 => {
mailimf_cc_free((*field).fld_data.fld_resent_cc);
}
7 => {
mailimf_bcc_free((*field).fld_data.fld_resent_bcc);
}
8 => {
mailimf_message_id_free((*field).fld_data.fld_resent_msg_id);
}
9 => {
mailimf_orig_date_free((*field).fld_data.fld_orig_date);
}
10 => {
mailimf_from_free((*field).fld_data.fld_from);
}
11 => {
mailimf_sender_free((*field).fld_data.fld_sender);
}
12 => {
mailimf_reply_to_free((*field).fld_data.fld_reply_to);
}
13 => {
mailimf_to_free((*field).fld_data.fld_to);
}
14 => {
mailimf_cc_free((*field).fld_data.fld_cc);
}
15 => {
mailimf_bcc_free((*field).fld_data.fld_bcc);
}
16 => {
mailimf_message_id_free((*field).fld_data.fld_message_id);
}
17 => {
mailimf_in_reply_to_free((*field).fld_data.fld_in_reply_to);
}
18 => {
mailimf_references_free((*field).fld_data.fld_references);
}
19 => {
mailimf_subject_free((*field).fld_data.fld_subject);
}
20 => {
mailimf_comments_free((*field).fld_data.fld_comments);
}
21 => {
mailimf_keywords_free((*field).fld_data.fld_keywords);
}
22 => {
mailimf_optional_field_free((*field).fld_data.fld_optional_field);
}
_ => {}
}
free(field as *mut libc::c_void);
let _ = Box::from_raw(fields);
}
#[no_mangle]
pub unsafe fn mailimf_optional_field_free(mut opt_field: *mut mailimf_optional_field) {
mailimf_field_name_free((*opt_field).fld_name);
@@ -853,88 +745,11 @@ pub unsafe fn mailimf_path_free(mut path: *mut mailimf_path) {
}
free(path as *mut libc::c_void);
}
#[no_mangle]
pub unsafe fn mailimf_fields_new(mut fld_list: *mut clist) -> *mut mailimf_fields {
let mut fields: *mut mailimf_fields = 0 as *mut mailimf_fields;
fields = malloc(::std::mem::size_of::<mailimf_fields>() as libc::size_t) as *mut mailimf_fields;
if fields.is_null() {
return 0 as *mut mailimf_fields;
}
(*fields).fld_list = fld_list;
return fields;
}
#[no_mangle]
pub unsafe fn mailimf_field_new(
mut fld_type: libc::c_int,
mut fld_return_path: *mut mailimf_return,
mut fld_resent_date: *mut mailimf_orig_date,
mut fld_resent_from: *mut mailimf_from,
mut fld_resent_sender: *mut mailimf_sender,
mut fld_resent_to: *mut mailimf_to,
mut fld_resent_cc: *mut mailimf_cc,
mut fld_resent_bcc: *mut mailimf_bcc,
mut fld_resent_msg_id: *mut mailimf_message_id,
mut fld_orig_date: *mut mailimf_orig_date,
mut fld_from: *mut mailimf_from,
mut fld_sender: *mut mailimf_sender,
mut fld_reply_to: *mut mailimf_reply_to,
mut fld_to: *mut mailimf_to,
mut fld_cc: *mut mailimf_cc,
mut fld_bcc: *mut mailimf_bcc,
mut fld_message_id: *mut mailimf_message_id,
mut fld_in_reply_to: *mut mailimf_in_reply_to,
mut fld_references: *mut mailimf_references,
mut fld_subject: *mut mailimf_subject,
mut fld_comments: *mut mailimf_comments,
mut fld_keywords: *mut mailimf_keywords,
mut fld_optional_field: *mut mailimf_optional_field,
) -> *mut mailimf_field {
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
field = malloc(::std::mem::size_of::<mailimf_field>() as libc::size_t) as *mut mailimf_field;
if field.is_null() {
return 0 as *mut mailimf_field;
}
(*field).fld_type = fld_type;
match fld_type {
1 => (*field).fld_data.fld_return_path = fld_return_path,
2 => (*field).fld_data.fld_resent_date = fld_resent_date,
3 => (*field).fld_data.fld_resent_from = fld_resent_from,
4 => (*field).fld_data.fld_resent_sender = fld_resent_sender,
5 => (*field).fld_data.fld_resent_to = fld_resent_to,
6 => (*field).fld_data.fld_resent_cc = fld_resent_cc,
7 => (*field).fld_data.fld_resent_bcc = fld_resent_bcc,
8 => (*field).fld_data.fld_resent_msg_id = fld_resent_msg_id,
9 => (*field).fld_data.fld_orig_date = fld_orig_date,
10 => (*field).fld_data.fld_from = fld_from,
11 => (*field).fld_data.fld_sender = fld_sender,
12 => (*field).fld_data.fld_reply_to = fld_reply_to,
13 => (*field).fld_data.fld_to = fld_to,
14 => (*field).fld_data.fld_cc = fld_cc,
15 => (*field).fld_data.fld_bcc = fld_bcc,
16 => (*field).fld_data.fld_message_id = fld_message_id,
17 => (*field).fld_data.fld_in_reply_to = fld_in_reply_to,
18 => (*field).fld_data.fld_references = fld_references,
19 => (*field).fld_data.fld_subject = fld_subject,
20 => (*field).fld_data.fld_comments = fld_comments,
21 => (*field).fld_data.fld_keywords = fld_keywords,
22 => (*field).fld_data.fld_optional_field = fld_optional_field,
_ => {}
}
return field;
}
pub unsafe fn mailimf_fields_new(fld_list: Vec<mailimf_field>) -> *mut mailimf_fields {
let fields = mailimf_fields(fld_list);
#[no_mangle]
pub unsafe fn mailimf_field_new_subject(fld_subject: *mut mailimf_subject) -> *mut mailimf_field {
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
field = malloc(::std::mem::size_of::<mailimf_field>() as libc::size_t) as *mut mailimf_field;
if field.is_null() {
return 0 as *mut mailimf_field;
}
(*field).fld_type = MAILIMF_FIELD_SUBJECT as libc::c_int;
(*field).fld_data.fld_subject = fld_subject;
field
Box::into_raw(Box::new(fields))
}
#[no_mangle]
@@ -1037,7 +852,7 @@ pub unsafe fn mailimf_in_reply_to_new(mut mid_list: *mut clist) -> *mut mailimf_
}
/* != NULL */
#[no_mangle]
pub unsafe fn mailimf_references_new(mut mid_list: *mut clist) -> *mut mailimf_references {
pub unsafe fn mailimf_references_new(mid_list: *mut clist) -> *mut mailimf_references {
let mut ref_0: *mut mailimf_references = 0 as *mut mailimf_references;
ref_0 = malloc(::std::mem::size_of::<mailimf_references>() as libc::size_t)
as *mut mailimf_references;

View File

@@ -6,18 +6,9 @@ use crate::other::*;
this function creates a new mailimf_fields structure with no fields
*/
pub unsafe fn mailimf_fields_new_empty() -> *mut mailimf_fields {
let mut list: *mut clist = 0 as *mut clist;
let mut fields_list: *mut mailimf_fields = 0 as *mut mailimf_fields;
list = clist_new();
if list.is_null() {
return 0 as *mut mailimf_fields;
}
fields_list = mailimf_fields_new(list);
if fields_list.is_null() {
return 0 as *mut mailimf_fields;
}
return fields_list;
mailimf_fields_new(Vec::new())
}
/*
this function adds a field to the mailimf_fields structure
@@ -54,31 +45,7 @@ pub unsafe fn mailimf_field_new_custom(
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
opt_field = mailimf_optional_field_new(name, value);
if !opt_field.is_null() {
field = mailimf_field_new(
MAILIMF_FIELD_OPTIONAL_FIELD as libc::c_int,
0 as *mut mailimf_return,
0 as *mut mailimf_orig_date,
0 as *mut mailimf_from,
0 as *mut mailimf_sender,
0 as *mut mailimf_to,
0 as *mut mailimf_cc,
0 as *mut mailimf_bcc,
0 as *mut mailimf_message_id,
0 as *mut mailimf_orig_date,
0 as *mut mailimf_from,
0 as *mut mailimf_sender,
0 as *mut mailimf_reply_to,
0 as *mut mailimf_to,
0 as *mut mailimf_cc,
0 as *mut mailimf_bcc,
0 as *mut mailimf_message_id,
0 as *mut mailimf_in_reply_to,
0 as *mut mailimf_references,
0 as *mut mailimf_subject,
0 as *mut mailimf_comments,
0 as *mut mailimf_keywords,
opt_field,
);
field = mailimf_field::OptionalField(opt_field);
if field.is_null() {
mailimf_optional_field_free(opt_field);
} else {

View File

@@ -1243,30 +1243,21 @@ unsafe fn mailmime_preamble_parse(
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn remove_unparsed_mime_headers(mut fields: *mut mailimf_fields) {
let mut cur: *mut clistiter = 0 as *mut clistiter;
cur = (*(*fields).fld_list).first;
while !cur.is_null() {
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
let mut delete: libc::c_int = 0;
field = (if !cur.is_null() {
(*cur).data
} else {
0 as *mut libc::c_void
}) as *mut mailimf_field;
match (*field).fld_type {
22 => {
delete = 0i32;
unsafe fn remove_unparsed_mime_headers(fields: *mut mailimf_fields) {
(*fields).0.retain(|field| {
let mut delete = false;
match field {
mailimf_field::OptionalField(data) => {
delete = false;
if strncasecmp(
(*(*field).fld_data.fld_optional_field).fld_name,
data.fld_name,
b"Content-\x00" as *const u8 as *const libc::c_char,
8i32 as libc::size_t,
) == 0i32
{
let mut name: *mut libc::c_char = 0 as *mut libc::c_char;
name = (*(*field).fld_data.fld_optional_field)
.fld_name
.offset(8isize);
name = data.fld_name.offset(8isize);
if strcasecmp(name, b"Type\x00" as *const u8 as *const libc::c_char) == 0i32
|| strcasecmp(
name,
@@ -1280,35 +1271,22 @@ unsafe fn remove_unparsed_mime_headers(mut fields: *mut mailimf_fields) {
|| strcasecmp(name, b"Language\x00" as *const u8 as *const libc::c_char)
== 0i32
{
delete = 1i32
delete = true;
}
} else if strcasecmp(
(*(*field).fld_data.fld_optional_field).fld_name,
data.fld_name,
b"MIME-Version\x00" as *const u8 as *const libc::c_char,
) == 0i32
{
delete = 1i32
}
if 0 != delete {
cur = clist_delete((*fields).fld_list, cur);
mailimf_field_free(field);
} else {
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
}
_ => {
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
delete = true;
}
}
_ => {}
}
}
// retain keeps everything true
!delete
});
}
pub unsafe fn mailmime_extract_boundary(

File diff suppressed because it is too large Load Diff