mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
1986 lines
60 KiB
Rust
1986 lines
60 KiB
Rust
use crate::clist::*;
|
|
use crate::mailimf::types::*;
|
|
use crate::other::*;
|
|
|
|
pub const STATE_WORD: libc::c_uint = 1;
|
|
pub const STATE_SPACE: libc::c_uint = 2;
|
|
pub const STATE_BEGIN: libc::c_uint = 0;
|
|
|
|
/*
|
|
mailimf_string_write writes a string to a given stream
|
|
|
|
@param f is the stream
|
|
@param col (* col) is the column number where we will start to
|
|
write the text, the ending column will be stored in (* col)
|
|
@param str is the string to write
|
|
*/
|
|
pub unsafe fn mailimf_string_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut str: *const libc::c_char,
|
|
mut length: size_t,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
let mut count: size_t = 0;
|
|
let mut block_begin: *const libc::c_char = 0 as *const libc::c_char;
|
|
let mut p: *const libc::c_char = 0 as *const libc::c_char;
|
|
let mut done: libc::c_int = 0;
|
|
p = str;
|
|
block_begin = str;
|
|
count = 0i32 as size_t;
|
|
while length > 0i32 as libc::size_t {
|
|
if count >= 998i32 as libc::size_t {
|
|
r = flush_buf(do_write, data, block_begin, count);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
(::std::mem::size_of::<[libc::c_char; 3]>() as libc::size_t)
|
|
.wrapping_sub(1i32 as libc::size_t),
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
count = 0i32 as size_t;
|
|
block_begin = p;
|
|
*col = 0i32
|
|
}
|
|
match *p as libc::c_int {
|
|
10 => {
|
|
r = flush_buf(do_write, data, block_begin, count);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
(::std::mem::size_of::<[libc::c_char; 3]>() as libc::size_t)
|
|
.wrapping_sub(1i32 as libc::size_t),
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
p = p.offset(1isize);
|
|
length = length.wrapping_sub(1);
|
|
count = 0i32 as size_t;
|
|
block_begin = p;
|
|
*col = 0i32
|
|
}
|
|
13 => {
|
|
done = 0i32;
|
|
if length >= 2i32 as libc::size_t {
|
|
if *p.offset(1isize) as libc::c_int == '\n' as i32 {
|
|
r = flush_buf(do_write, data, block_begin, count);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
(::std::mem::size_of::<[libc::c_char; 3]>() as libc::size_t)
|
|
.wrapping_sub(1i32 as libc::size_t),
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
p = p.offset(2isize);
|
|
length = (length as libc::size_t).wrapping_sub(2i32 as libc::size_t)
|
|
as size_t as size_t;
|
|
count = 0i32 as size_t;
|
|
block_begin = p;
|
|
*col = 0i32;
|
|
done = 1i32
|
|
}
|
|
}
|
|
if 0 == done {
|
|
r = flush_buf(do_write, data, block_begin, count);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
(::std::mem::size_of::<[libc::c_char; 3]>() as libc::size_t)
|
|
.wrapping_sub(1i32 as libc::size_t),
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
p = p.offset(1isize);
|
|
length = length.wrapping_sub(1);
|
|
count = 0i32 as size_t;
|
|
block_begin = p;
|
|
*col = 0i32
|
|
}
|
|
}
|
|
_ => {
|
|
p = p.offset(1isize);
|
|
count = count.wrapping_add(1);
|
|
length = length.wrapping_sub(1)
|
|
}
|
|
}
|
|
}
|
|
r = flush_buf(do_write, data, block_begin, count);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
*col = (*col as libc::size_t).wrapping_add(count) as libc::c_int as libc::c_int;
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
/* ************************ */
|
|
#[inline]
|
|
unsafe fn flush_buf(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut str: *const libc::c_char,
|
|
mut length: size_t,
|
|
) -> libc::c_int {
|
|
if length != 0i32 as libc::size_t {
|
|
let mut r: libc::c_int = 0;
|
|
if length > 0i32 as libc::size_t {
|
|
r = do_write.expect("non-null function pointer")(data, str, length);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
}
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
/*
|
|
mailimf_fields_write writes the fields to a given stream
|
|
|
|
@param f is the stream
|
|
@param col (* col) is the column number where we will start to
|
|
write the text, the ending column will be stored in (* col)
|
|
@param fields is the fields to write
|
|
*/
|
|
|
|
pub unsafe fn mailimf_fields_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut fields: *mut mailimf_fields,
|
|
) -> libc::c_int {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
cur = (*(*fields).fld_list).first;
|
|
while !cur.is_null() {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_field_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut mailimf_field,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
/*
|
|
mailimf_field_write writes a field to a given stream
|
|
|
|
@param f is the stream
|
|
@param col (* col) is the column number where we will start to
|
|
write the text, the ending column will be stored in (* col)
|
|
@param field is the field to write
|
|
*/
|
|
pub unsafe fn mailimf_field_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut field: *mut mailimf_field,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
match (*field).fld_type {
|
|
1 => {
|
|
r = mailimf_return_write_driver(do_write, data, col, (*field).fld_data.fld_return_path)
|
|
}
|
|
2 => {
|
|
r = mailimf_resent_date_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_resent_date,
|
|
)
|
|
}
|
|
3 => {
|
|
r = mailimf_resent_from_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_resent_from,
|
|
)
|
|
}
|
|
4 => {
|
|
r = mailimf_resent_sender_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_resent_sender,
|
|
)
|
|
}
|
|
5 => {
|
|
r = mailimf_resent_to_write_driver(do_write, data, col, (*field).fld_data.fld_resent_to)
|
|
}
|
|
6 => {
|
|
r = mailimf_resent_cc_write_driver(do_write, data, col, (*field).fld_data.fld_resent_cc)
|
|
}
|
|
7 => {
|
|
r = mailimf_resent_bcc_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_resent_bcc,
|
|
)
|
|
}
|
|
8 => {
|
|
r = mailimf_resent_msg_id_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_resent_msg_id,
|
|
)
|
|
}
|
|
9 => {
|
|
r = mailimf_orig_date_write_driver(do_write, data, col, (*field).fld_data.fld_orig_date)
|
|
}
|
|
10 => r = mailimf_from_write_driver(do_write, data, col, (*field).fld_data.fld_from),
|
|
11 => r = mailimf_sender_write_driver(do_write, data, col, (*field).fld_data.fld_sender),
|
|
12 => {
|
|
r = mailimf_reply_to_write_driver(do_write, data, col, (*field).fld_data.fld_reply_to)
|
|
}
|
|
13 => r = mailimf_to_write_driver(do_write, data, col, (*field).fld_data.fld_to),
|
|
14 => r = mailimf_cc_write_driver(do_write, data, col, (*field).fld_data.fld_cc),
|
|
15 => r = mailimf_bcc_write_driver(do_write, data, col, (*field).fld_data.fld_bcc),
|
|
16 => {
|
|
r = mailimf_message_id_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_message_id,
|
|
)
|
|
}
|
|
17 => {
|
|
r = mailimf_in_reply_to_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_in_reply_to,
|
|
)
|
|
}
|
|
18 => {
|
|
r = mailimf_references_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_references,
|
|
)
|
|
}
|
|
19 => r = mailimf_subject_write_driver(do_write, data, col, (*field).fld_data.fld_subject),
|
|
20 => {
|
|
r = mailimf_comments_write_driver(do_write, data, col, (*field).fld_data.fld_comments)
|
|
}
|
|
21 => {
|
|
r = mailimf_keywords_write_driver(do_write, data, col, (*field).fld_data.fld_keywords)
|
|
}
|
|
22 => {
|
|
r = mailimf_optional_field_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_data.fld_optional_field,
|
|
)
|
|
}
|
|
_ => r = MAILIMF_ERROR_INVAL as libc::c_int,
|
|
}
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_optional_field_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut field: *mut mailimf_optional_field,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
if strlen((*field).fld_name).wrapping_add(2i32 as libc::size_t) > 998i32 as libc::size_t {
|
|
return MAILIMF_ERROR_INVAL as libc::c_int;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_name,
|
|
strlen((*field).fld_name),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b": \x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_header_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*field).fld_value,
|
|
strlen((*field).fld_value),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
/*
|
|
mailimf_header_string_write writes a header value and fold the header
|
|
if needed.
|
|
|
|
@param f is the stream
|
|
@param col (* col) is the column number where we will start to
|
|
write the text, the ending column will be stored in (* col)
|
|
@param str is the string to write
|
|
*/
|
|
pub unsafe fn mailimf_header_string_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut str: *const libc::c_char,
|
|
mut length: size_t,
|
|
) -> libc::c_int {
|
|
let mut state: libc::c_int = 0;
|
|
let mut p: *const libc::c_char = 0 as *const libc::c_char;
|
|
let mut word_begin: *const libc::c_char = 0 as *const libc::c_char;
|
|
let mut first: libc::c_int = 0;
|
|
state = STATE_BEGIN as libc::c_int;
|
|
p = str;
|
|
word_begin = p;
|
|
first = 1i32;
|
|
while length > 0i32 as libc::size_t {
|
|
match state {
|
|
0 => match *p as libc::c_int {
|
|
13 | 10 | 32 | 9 => {
|
|
p = p.offset(1isize);
|
|
length = length.wrapping_sub(1)
|
|
}
|
|
_ => {
|
|
word_begin = p;
|
|
state = STATE_WORD as libc::c_int
|
|
}
|
|
},
|
|
2 => match *p as libc::c_int {
|
|
13 | 10 | 32 | 9 => {
|
|
p = p.offset(1isize);
|
|
length = length.wrapping_sub(1)
|
|
}
|
|
_ => {
|
|
word_begin = p;
|
|
state = STATE_WORD as libc::c_int
|
|
}
|
|
},
|
|
1 => match *p as libc::c_int {
|
|
13 | 10 | 32 | 9 => {
|
|
if p.wrapping_offset_from(word_begin) as libc::c_int
|
|
+ *col as libc::c_int
|
|
+ 1i32 as libc::c_int
|
|
> 72i32 as libc::c_int
|
|
{
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n \x00" as *const u8 as *const libc::c_char,
|
|
(::std::mem::size_of::<[libc::c_char; 4]>() as libc::size_t)
|
|
.wrapping_sub(1i32 as libc::size_t),
|
|
);
|
|
} else if 0 == first {
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b" \x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
}
|
|
first = 0i32;
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
word_begin,
|
|
p.wrapping_offset_from(word_begin) as libc::c_int as size_t,
|
|
);
|
|
state = STATE_SPACE as libc::c_int
|
|
}
|
|
_ => {
|
|
if p.wrapping_offset_from(word_begin) as libc::c_int + *col as libc::c_int
|
|
>= 998i32 as libc::c_int
|
|
{
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
word_begin,
|
|
p.wrapping_offset_from(word_begin) as libc::c_int as size_t,
|
|
);
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n \x00" as *const u8 as *const libc::c_char,
|
|
(::std::mem::size_of::<[libc::c_char; 4]>() as libc::size_t)
|
|
.wrapping_sub(1i32 as libc::size_t),
|
|
);
|
|
word_begin = p
|
|
}
|
|
p = p.offset(1isize);
|
|
length = length.wrapping_sub(1)
|
|
}
|
|
},
|
|
_ => {}
|
|
}
|
|
}
|
|
if state == STATE_WORD as libc::c_int {
|
|
if p.wrapping_offset_from(word_begin) as libc::c_int + *col as libc::c_int
|
|
>= 72i32 as libc::c_int
|
|
{
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n \x00" as *const u8 as *const libc::c_char,
|
|
(::std::mem::size_of::<[libc::c_char; 4]>() as libc::size_t)
|
|
.wrapping_sub(1i32 as libc::size_t),
|
|
);
|
|
} else if 0 == first {
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b" \x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
}
|
|
first = 0i32;
|
|
mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
word_begin,
|
|
p.wrapping_offset_from(word_begin) as libc::c_int as size_t,
|
|
);
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_keywords_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut keywords: *mut mailimf_keywords,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
let mut first: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Keywords: \x00" as *const u8 as *const libc::c_char,
|
|
10i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
first = 1i32;
|
|
cur = (*(*keywords).kw_list).first;
|
|
while !cur.is_null() {
|
|
let mut keyword: *mut libc::c_char = 0 as *mut libc::c_char;
|
|
let mut len: size_t = 0;
|
|
keyword = (if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut libc::c_char;
|
|
len = strlen(keyword);
|
|
if 0 == first {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b", \x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
} else {
|
|
first = 0i32
|
|
}
|
|
r = mailimf_header_string_write_driver(do_write, data, col, keyword, len);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_comments_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut comments: *mut mailimf_comments,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Comments: \x00" as *const u8 as *const libc::c_char,
|
|
10i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_header_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*comments).cm_value,
|
|
strlen((*comments).cm_value),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_subject_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut subject: *mut mailimf_subject,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Subject: \x00" as *const u8 as *const libc::c_char,
|
|
9i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_header_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*subject).sbj_value,
|
|
strlen((*subject).sbj_value),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_references_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut references: *mut mailimf_references,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"References: \x00" as *const u8 as *const libc::c_char,
|
|
12i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_msg_id_list_write_driver(do_write, data, col, (*references).mid_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_msg_id_list_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut mid_list: *mut clist,
|
|
) -> libc::c_int {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
let mut r: libc::c_int = 0;
|
|
let mut first: libc::c_int = 0;
|
|
first = 1i32;
|
|
cur = (*mid_list).first;
|
|
while !cur.is_null() {
|
|
let mut msgid: *mut libc::c_char = 0 as *mut libc::c_char;
|
|
let mut len: size_t = 0;
|
|
msgid = (if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut libc::c_char;
|
|
len = strlen(msgid);
|
|
if 0 == first {
|
|
if *col > 1i32 {
|
|
if (*col as libc::size_t).wrapping_add(len) >= 72i32 as libc::size_t {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n \x00" as *const u8 as *const libc::c_char,
|
|
3i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
first = 1i32
|
|
}
|
|
}
|
|
}
|
|
if 0 == first {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b" \x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
} else {
|
|
first = 0i32
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"<\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(do_write, data, col, msgid, len);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b">\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_in_reply_to_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut in_reply_to: *mut mailimf_in_reply_to,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"In-Reply-To: \x00" as *const u8 as *const libc::c_char,
|
|
13i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_msg_id_list_write_driver(do_write, data, col, (*in_reply_to).mid_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_message_id_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut message_id: *mut mailimf_message_id,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Message-ID: \x00" as *const u8 as *const libc::c_char,
|
|
12i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"<\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*message_id).mid_value,
|
|
strlen((*message_id).mid_value),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b">\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_bcc_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut bcc: *mut mailimf_bcc,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Bcc: \x00" as *const u8 as *const libc::c_char,
|
|
5i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
if !(*bcc).bcc_addr_list.is_null() {
|
|
r = mailimf_address_list_write_driver(do_write, data, col, (*bcc).bcc_addr_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
pub unsafe fn mailimf_address_list_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut addr_list: *mut mailimf_address_list,
|
|
) -> libc::c_int {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
let mut r: libc::c_int = 0;
|
|
let mut first: libc::c_int = 0;
|
|
first = 1i32;
|
|
cur = (*(*addr_list).ad_list).first;
|
|
while !cur.is_null() {
|
|
let mut addr: *mut mailimf_address = 0 as *mut mailimf_address;
|
|
addr = (if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut mailimf_address;
|
|
if 0 == first {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b", \x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
} else {
|
|
first = 0i32
|
|
}
|
|
r = mailimf_address_write_driver(do_write, data, col, addr);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_address_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut addr: *mut mailimf_address,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
match (*addr).ad_type {
|
|
1 => {
|
|
r = mailimf_mailbox_write_driver(do_write, data, col, (*addr).ad_data.ad_mailbox);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
2 => {
|
|
r = mailimf_group_write_driver(do_write, data, col, (*addr).ad_data.ad_group);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
_ => {}
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_group_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut group: *mut mailimf_group,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_header_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*group).grp_display_name,
|
|
strlen((*group).grp_display_name),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b": \x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
if !(*group).grp_mb_list.is_null() {
|
|
r = mailimf_mailbox_list_write_driver(do_write, data, col, (*group).grp_mb_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b";\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
|
|
pub unsafe fn mailimf_mailbox_list_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut mb_list: *mut mailimf_mailbox_list,
|
|
) -> libc::c_int {
|
|
let mut cur: *mut clistiter = 0 as *mut clistiter;
|
|
let mut r: libc::c_int = 0;
|
|
let mut first: libc::c_int = 0;
|
|
first = 1i32;
|
|
cur = (*(*mb_list).mb_list).first;
|
|
while !cur.is_null() {
|
|
let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox;
|
|
mb = (if !cur.is_null() {
|
|
(*cur).data
|
|
} else {
|
|
0 as *mut libc::c_void
|
|
}) as *mut mailimf_mailbox;
|
|
if 0 == first {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b", \x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
} else {
|
|
first = 0i32
|
|
}
|
|
r = mailimf_mailbox_write_driver(do_write, data, col, mb);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
cur = if !cur.is_null() {
|
|
(*cur).next
|
|
} else {
|
|
0 as *mut clistcell
|
|
}
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_mailbox_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut mb: *mut mailimf_mailbox,
|
|
) -> 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) {
|
|
r = mailimf_header_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*mb).mb_display_name,
|
|
strlen((*mb).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))
|
|
>= 72i32 as libc::size_t
|
|
{
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n \x00" as *const u8 as *const libc::c_char,
|
|
3i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
}
|
|
if strlen((*mb).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),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
do_fold = 0i32;
|
|
if *col > 1i32 {
|
|
if (*col as libc::size_t)
|
|
.wrapping_add(strlen((*mb).mb_addr_spec))
|
|
.wrapping_add(3i32 as libc::size_t)
|
|
>= 72i32 as libc::size_t
|
|
{
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n \x00" as *const u8 as *const libc::c_char,
|
|
3i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
do_fold = 1i32
|
|
}
|
|
}
|
|
if 0 != do_fold {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"<\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
)
|
|
} else {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b" <\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
)
|
|
}
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*mb).mb_addr_spec,
|
|
strlen((*mb).mb_addr_spec),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b">\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
} else {
|
|
if (*col as libc::size_t).wrapping_add(strlen((*mb).mb_addr_spec)) >= 72i32 as libc::size_t
|
|
{
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n \x00" as *const u8 as *const libc::c_char,
|
|
3i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*mb).mb_addr_spec,
|
|
strlen((*mb).mb_addr_spec),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
/*
|
|
mailimf_quoted_string_write writes a string that is quoted
|
|
to a given stream
|
|
|
|
@param f is the stream
|
|
@param col (* col) is the column number where we will start to
|
|
write the text, the ending column will be stored in (* col)
|
|
@param string is the string to quote and write
|
|
*/
|
|
pub unsafe fn mailimf_quoted_string_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut string: *const libc::c_char,
|
|
mut len: size_t,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
let mut i: size_t = 0;
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
b"\"\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
i = 0i32 as size_t;
|
|
while i < len {
|
|
match *string.offset(i as isize) as libc::c_int {
|
|
92 | 34 => {
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
b"\\\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
&*string.offset(i as isize),
|
|
1i32 as size_t,
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
*col += 2i32
|
|
}
|
|
_ => {
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
&*string.offset(i as isize),
|
|
1i32 as size_t,
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
*col += 1
|
|
}
|
|
}
|
|
i = i.wrapping_add(1)
|
|
}
|
|
r = do_write.expect("non-null function pointer")(
|
|
data,
|
|
b"\"\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r == 0i32 {
|
|
return MAILIMF_ERROR_FILE as libc::c_int;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
/*
|
|
static int
|
|
atext = ALPHA / DIGIT / ; Any character except controls,
|
|
"!" / "#" / ; SP, and specials.
|
|
"$" / "%" / ; Used for atoms
|
|
"&" / "'" /
|
|
"*" / "+" /
|
|
"-" / "/" /
|
|
"=" / "?" /
|
|
"^" / "_" /
|
|
"`" / "{" /
|
|
"|" / "}" /
|
|
"~"
|
|
*/
|
|
unsafe fn is_atext(mut s: *const libc::c_char) -> libc::c_int {
|
|
let mut p: *const libc::c_char = 0 as *const libc::c_char;
|
|
p = s;
|
|
while *p as libc::c_int != 0i32 {
|
|
if !(0 != isalpha(*p as libc::c_uchar as libc::c_int)) {
|
|
if !(0 != isdigit(*p as libc::c_uchar as libc::c_int)) {
|
|
match *p as libc::c_int {
|
|
32 | 9 | 33 | 35 | 36 | 37 | 38 | 39 | 42 | 43 | 45 | 47 | 61 | 63 | 94
|
|
| 95 | 96 | 123 | 124 | 125 | 126 => {}
|
|
_ => return 0i32,
|
|
}
|
|
}
|
|
}
|
|
p = p.offset(1isize)
|
|
}
|
|
return 1i32;
|
|
}
|
|
|
|
unsafe fn mailimf_cc_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut cc: *mut mailimf_cc,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Cc: \x00" as *const u8 as *const libc::c_char,
|
|
4i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_address_list_write_driver(do_write, data, col, (*cc).cc_addr_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_to_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut to: *mut mailimf_to,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"To: \x00" as *const u8 as *const libc::c_char,
|
|
4i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_address_list_write_driver(do_write, data, col, (*to).to_addr_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_reply_to_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut reply_to: *mut mailimf_reply_to,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Reply-To: \x00" as *const u8 as *const libc::c_char,
|
|
10i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_address_list_write_driver(do_write, data, col, (*reply_to).rt_addr_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_sender_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut sender: *mut mailimf_sender,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Sender: \x00" as *const u8 as *const libc::c_char,
|
|
8i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_mailbox_write_driver(do_write, data, col, (*sender).snd_mb);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_from_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut from: *mut mailimf_from,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"From: \x00" as *const u8 as *const libc::c_char,
|
|
6i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_mailbox_list_write_driver(do_write, data, col, (*from).frm_mb_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
/*
|
|
* libEtPan! -- a mail stuff library
|
|
*
|
|
* Copyright (C) 2001, 2005 - DINH Viet Hoa
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the libEtPan! project nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
/*
|
|
* $Id: mailimf_write_generic.c,v 1.3 2006/05/22 13:39:42 hoa Exp $
|
|
*/
|
|
unsafe fn mailimf_orig_date_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut date: *mut mailimf_orig_date,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Date: \x00" as *const u8 as *const libc::c_char,
|
|
6i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_date_time_write_driver(do_write, data, col, (*date).dt_date_time);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_date_time_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut date_time: *mut mailimf_date_time,
|
|
) -> libc::c_int {
|
|
let wday = dayofweek(
|
|
(*date_time).dt_year,
|
|
(*date_time).dt_month,
|
|
(*date_time).dt_day,
|
|
);
|
|
|
|
let date_str = format!(
|
|
"{}, {} {} {} {:02}:{:02}:{:02} {:+05}",
|
|
week_of_day_str[wday as usize],
|
|
(*date_time).dt_day,
|
|
month_str[((*date_time).dt_month - 1i32) as usize],
|
|
(*date_time).dt_year,
|
|
(*date_time).dt_hour,
|
|
(*date_time).dt_min,
|
|
(*date_time).dt_sec,
|
|
(*date_time).dt_zone,
|
|
);
|
|
let date_str_c = std::ffi::CString::new(date_str).unwrap();
|
|
let r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
date_str_c.as_ptr() as *mut _,
|
|
strlen(date_str_c.as_ptr()),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
static mut month_str: [&'static str; 12] = [
|
|
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
|
];
|
|
static mut week_of_day_str: [&'static str; 7] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
/* 0 = Sunday */
|
|
/* y > 1752 */
|
|
unsafe fn dayofweek(
|
|
mut year: libc::c_int,
|
|
mut month: libc::c_int,
|
|
mut day: libc::c_int,
|
|
) -> libc::c_int {
|
|
static mut offset: [libc::c_int; 12] = [
|
|
0i32, 3i32, 2i32, 5i32, 0i32, 3i32, 5i32, 1i32, 4i32, 6i32, 2i32, 4i32,
|
|
];
|
|
year -= (month < 3i32) as libc::c_int;
|
|
return (year + year / 4i32 - year / 100i32
|
|
+ year / 400i32
|
|
+ offset[(month - 1i32) as usize]
|
|
+ day)
|
|
% 7i32;
|
|
}
|
|
unsafe fn mailimf_resent_msg_id_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut message_id: *mut mailimf_message_id,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Resent-Message-ID: \x00" as *const u8 as *const libc::c_char,
|
|
19i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"<\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*message_id).mid_value,
|
|
strlen((*message_id).mid_value),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b">\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_resent_bcc_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut bcc: *mut mailimf_bcc,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Resent-Bcc: \x00" as *const u8 as *const libc::c_char,
|
|
12i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
if !(*bcc).bcc_addr_list.is_null() {
|
|
r = mailimf_address_list_write_driver(do_write, data, col, (*bcc).bcc_addr_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_resent_cc_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut cc: *mut mailimf_cc,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Resent-Cc: \x00" as *const u8 as *const libc::c_char,
|
|
11i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_address_list_write_driver(do_write, data, col, (*cc).cc_addr_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_resent_to_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut to: *mut mailimf_to,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Resent-To: \x00" as *const u8 as *const libc::c_char,
|
|
11i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_address_list_write_driver(do_write, data, col, (*to).to_addr_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_resent_sender_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut sender: *mut mailimf_sender,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Resent-Sender: \x00" as *const u8 as *const libc::c_char,
|
|
15i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_mailbox_write_driver(do_write, data, col, (*sender).snd_mb);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_resent_from_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut from: *mut mailimf_from,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Resent-From: \x00" as *const u8 as *const libc::c_char,
|
|
13i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_mailbox_list_write_driver(do_write, data, col, (*from).frm_mb_list);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_resent_date_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut date: *mut mailimf_orig_date,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Resent-Date: \x00" as *const u8 as *const libc::c_char,
|
|
13i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_date_time_write_driver(do_write, data, col, (*date).dt_date_time);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_return_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut return_path: *mut mailimf_return,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"Return-Path: \x00" as *const u8 as *const libc::c_char,
|
|
13i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_path_write_driver(do_write, data, col, (*return_path).ret_path);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"\r\n\x00" as *const u8 as *const libc::c_char,
|
|
2i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|
|
unsafe fn mailimf_path_write_driver(
|
|
mut do_write: Option<
|
|
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
|
|
>,
|
|
mut data: *mut libc::c_void,
|
|
mut col: *mut libc::c_int,
|
|
mut path: *mut mailimf_path,
|
|
) -> libc::c_int {
|
|
let mut r: libc::c_int = 0;
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b"<\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
if !(*path).pt_addr_spec.is_null() {
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
(*path).pt_addr_spec,
|
|
strlen((*path).pt_addr_spec),
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
}
|
|
r = mailimf_string_write_driver(
|
|
do_write,
|
|
data,
|
|
col,
|
|
b">\x00" as *const u8 as *const libc::c_char,
|
|
1i32 as size_t,
|
|
);
|
|
if r != MAILIMF_NO_ERROR as libc::c_int {
|
|
return r;
|
|
}
|
|
return MAILIMF_NO_ERROR as libc::c_int;
|
|
}
|