static int fetch_section_mime(mailmessage * msg_info, struct mailmime * mime, char ** result, size_t * result_len) { int r; int res; int col; MMAPString * str; if (msg_info->msg_mime == NULL) return MAIL_ERROR_INVAL; str = mmap_string_new(""); if (str == NULL) { res = MAIL_ERROR_MEMORY; goto err; } col = 0; if (mime->mm_content_type != NULL) { r = mailmime_content_write_mem(str, &col, mime->mm_content_type); if (r != MAILIMF_NO_ERROR) { res = maildriver_imf_error_to_mail_error(r); goto free; } } if (mime->mm_mime_fields != NULL) { r = mailmime_fields_write_mem(str, &col, mime->mm_mime_fields); if (r != MAILIMF_NO_ERROR) { res = maildriver_imf_error_to_mail_error(r); goto free; } } mailimf_string_write_mem(str, &col, "\r\n", 2); r = mmap_string_ref(str); if (r < 0) { res = MAIL_ERROR_MEMORY; goto free; } * result = str->str; * result_len = str->len; return MAIL_NO_ERROR; free: mmap_string_free(str); err: return res; }
static int body_body_to_mmapstr(char * data, size_t size, char ** result, size_t * result_len) { size_t cur_token; int res; int r; cur_token = 0; /* skip header */ /* MIME header */ while (1) { r = mailimf_ignore_field_parse(data, size, &cur_token); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else break; } r = mailimf_crlf_parse(data, size, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { res = maildriver_imf_error_to_mail_error(r); goto err; } return body_to_mmapstr(data + cur_token, size - cur_token, result, result_len); err: return res; }
int mailmessage_generic_fetch_section_body(mailmessage * msg_info, struct mailmime * mime, char ** result, size_t * result_len) { MMAPString * mmapstr; int r; int res; size_t cur_token; cur_token = 0; if (mime->mm_type == MAILMIME_MESSAGE) { /* skip header */ while (1) { r = mailimf_ignore_field_parse(mime->mm_body->dt_data.dt_text.dt_data, mime->mm_body->dt_data.dt_text.dt_length, &cur_token); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else break; } r = mailimf_crlf_parse(mime->mm_body->dt_data.dt_text.dt_data, mime->mm_body->dt_data.dt_text.dt_length, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { res = maildriver_imf_error_to_mail_error(r); goto err; } } mmapstr = mmap_string_new_len(mime->mm_body->dt_data.dt_text.dt_data + cur_token, mime->mm_body->dt_data.dt_text.dt_length - cur_token); if (mmapstr == NULL) { res = MAIL_ERROR_MEMORY; goto err; } r = mmap_string_ref(mmapstr); if (r < 0) { res = MAIL_ERROR_MEMORY; goto free_mmap; } * result = mmapstr->str; * result_len = mmapstr->len; return MAIL_NO_ERROR; free_mmap: mmap_string_free(mmapstr); err: return res; }
static int fetch_section(mailmessage * msg_info, struct mailmime * mime, char ** result, size_t * result_len) { int r; int res; int col; MMAPString * str; if (msg_info->msg_mime == NULL) return MAIL_ERROR_INVAL; str = mmap_string_new(""); if (str == NULL) { res = MAILIMF_ERROR_MEMORY; goto err; } col = 0; r = mailmime_write_mem(str, &col, mime); if (r != MAILIMF_NO_ERROR) { res = maildriver_imf_error_to_mail_error(r); goto free; } if (mime->mm_parent == NULL) { r = mmap_string_ref(str); if (r < 0) { res = MAIL_ERROR_MEMORY; goto free; } * result = str->str; * result_len = str->len; r = MAIL_NO_ERROR; } else { r = body_to_mmapstr(str->str, str->len, result, result_len); if (r == MAIL_NO_ERROR) { mmap_string_free(str); } } if (r != MAIL_NO_ERROR) { res = r; goto free; } return MAIL_NO_ERROR; free: mmap_string_free(str); err: return res; }
static int imap_fetch_section_body(mailmessage * msg_info, struct mailmime * mime, char ** result, size_t * result_len) { struct mailimap_section * section; struct mailimap_fetch_att * fetch_att; int r; struct mailimap_fetch_type * fetch_type; char * text; size_t text_length; struct mailmime_section * part; if (mime->mm_parent == NULL) return imap_fetch_body(msg_info, result, result_len); if (mime->mm_parent->mm_parent == NULL) return imap_fetch_body(msg_info, result, result_len); r = mailmime_get_section_id(mime, &part); if (r != MAILIMF_NO_ERROR) return maildriver_imf_error_to_mail_error(r); r = imap_section_to_imap_section(part, IMAP_SECTION_BODY, §ion); mailmime_section_free(part); if (r != MAIL_NO_ERROR) return MAIL_ERROR_MEMORY; fetch_att = mailimap_fetch_att_new_body_peek_section(section); if (fetch_att == NULL) { mailimap_section_free(section); return MAIL_ERROR_MEMORY; } fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att); if (fetch_type == NULL) { mailimap_fetch_att_free(fetch_att); return MAIL_ERROR_MEMORY; } text = NULL; text_length = 0; r = fetch_imap(msg_info, fetch_type, &text, &text_length); mailimap_fetch_type_free(fetch_type); if (r != MAIL_NO_ERROR) return r; * result = text; * result_len = text_length; return MAIL_NO_ERROR; }
static int body_to_mmapstr(char * data, size_t size, char ** result, size_t * result_len) { MMAPString * mmapstr; size_t cur_token; int res; int r; cur_token = 0; /* skip header */ while (1) { r = mailimf_ignore_field_parse(data, size, &cur_token); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else break; } r = mailimf_crlf_parse(data, size, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { res = maildriver_imf_error_to_mail_error(r); goto err; } mmapstr = mmap_string_new_len(data + cur_token, size - cur_token); if (mmapstr == NULL) { res = MAIL_ERROR_MEMORY; goto err; } r = mmap_string_ref(mmapstr); if (r != 0) { mmap_string_free(mmapstr); res = MAIL_ERROR_MEMORY; goto err; } * result = mmapstr->str; * result_len = mmapstr->len; return MAIL_NO_ERROR; err: return res; }
static int fetch_section_body(mailmessage * msg_info, struct mailmime * mime, char ** result, size_t * result_len) { int r; int res; int col; MMAPString * str; if (msg_info->msg_mime == NULL) return MAIL_ERROR_INVAL; str = mmap_string_new(""); if (str == NULL) { res = MAIL_ERROR_MEMORY; goto err; } col = 0; if (mime->mm_mime_fields != NULL) { r = mailmime_write_mem(str, &col, mime); if (r != MAILIMF_NO_ERROR) { res = maildriver_imf_error_to_mail_error(r); goto free; } } if (mime->mm_type == MAILMIME_MESSAGE) r = body_body_to_mmapstr(str->str, str->len, result, result_len); else r = body_to_mmapstr(str->str, str->len, result, result_len); if (r != MAIL_NO_ERROR) { res = r; goto free; } mmap_string_free(str); return MAIL_NO_ERROR; free: mmap_string_free(str); err: return res; }
int mailmessage_generic_fetch_envelope(mailmessage * msg_info, struct mailimf_fields ** result) { int r; int res; size_t cur_token; char * header; size_t length; struct mailimf_fields * fields; r = mailmessage_fetch_header(msg_info, &header, &length); if (r != MAIL_NO_ERROR) { res = r; goto err; } cur_token = 0; r = mailimf_envelope_fields_parse(header, length, &cur_token, &fields); if (r != MAILIMF_NO_ERROR) { res = maildriver_imf_error_to_mail_error(r); goto free; /* do nothing */ } mailmessage_fetch_result_free(msg_info, header); * result = fields; return MAIL_NO_ERROR; free: mailmessage_fetch_result_free(msg_info, header); err: return res; }
static int xover_resp_to_fields(struct newsnntp_xover_resp_item * item, struct mailimf_fields ** result) { size_t cur_token; clist * list; int r; struct mailimf_fields * fields; int res; list = clist_new(); if (list == NULL) { res = MAIL_ERROR_MEMORY; goto err; } if (item->ovr_subject != NULL) { char * subject_str; struct mailimf_subject * subject; struct mailimf_field * field; subject_str = strdup(item->ovr_subject); if (subject_str == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } subject = mailimf_subject_new(subject_str); if (subject == NULL) { free(subject_str); res = MAIL_ERROR_MEMORY; goto free_list; } field = mailimf_field_new(MAILIMF_FIELD_SUBJECT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, subject, NULL, NULL, NULL); if (field == NULL) { mailimf_subject_free(subject); res = MAIL_ERROR_MEMORY; goto free_list; } r = clist_append(list, field); if (r < 0) { mailimf_field_free(field); res = MAIL_ERROR_MEMORY; goto free_list; } } if (item->ovr_author != NULL) { struct mailimf_mailbox_list * mb_list; struct mailimf_from * from; struct mailimf_field * field; cur_token = 0; r = mailimf_mailbox_list_parse(item->ovr_author, strlen(item->ovr_author), &cur_token, &mb_list); switch (r) { case MAILIMF_NO_ERROR: from = mailimf_from_new(mb_list); if (from == NULL) { mailimf_mailbox_list_free(mb_list); res = MAIL_ERROR_MEMORY; goto free_list; } field = mailimf_field_new(MAILIMF_FIELD_FROM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, from, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (field == NULL) { mailimf_from_free(from); res = MAIL_ERROR_MEMORY; goto free_list; } r = clist_append(list, field); if (r < 0) { mailimf_field_free(field); res = MAIL_ERROR_MEMORY; goto free_list; } break; case MAILIMF_ERROR_PARSE: break; default: res = maildriver_imf_error_to_mail_error(r); goto free_list; } } if (item->ovr_date != NULL) { struct mailimf_date_time * date_time; struct mailimf_orig_date * orig_date; struct mailimf_field * field; cur_token = 0; r = mailimf_date_time_parse(item->ovr_date, strlen(item->ovr_date), &cur_token, &date_time); switch (r) { case MAILIMF_NO_ERROR: orig_date = mailimf_orig_date_new(date_time); if (orig_date == NULL) { mailimf_date_time_free(date_time); res = MAIL_ERROR_MEMORY; goto free_list; } field = mailimf_field_new(MAILIMF_FIELD_ORIG_DATE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, orig_date, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (field == NULL) { mailimf_orig_date_free(orig_date); res = MAIL_ERROR_MEMORY; goto free_list; } r = clist_append(list, field); if (r < 0) { mailimf_field_free(field); res = MAIL_ERROR_MEMORY; goto free_list; } break; case MAILIMF_ERROR_PARSE: break; default: res = maildriver_imf_error_to_mail_error(r); goto free_list; } } if (item->ovr_message_id != NULL) { char * msgid_str; struct mailimf_message_id * msgid; struct mailimf_field * field; cur_token = 0; r = mailimf_msg_id_parse(item->ovr_message_id, strlen(item->ovr_message_id), &cur_token, &msgid_str); switch (r) { case MAILIMF_NO_ERROR: msgid = mailimf_message_id_new(msgid_str); if (msgid == NULL) { mailimf_msg_id_free(msgid_str); res = MAIL_ERROR_MEMORY; goto free_list; } field = mailimf_field_new(MAILIMF_FIELD_MESSAGE_ID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, msgid, NULL, NULL, NULL, NULL, NULL, NULL); r = clist_append(list, field); if (r < 0) { mailimf_field_free(field); res = MAIL_ERROR_MEMORY; goto free_list; } break; case MAILIMF_ERROR_PARSE: break; default: res = maildriver_imf_error_to_mail_error(r); goto free_list; } } if (item->ovr_references != NULL) { clist * msgid_list; struct mailimf_references * references; struct mailimf_field * field; cur_token = 0; r = mailimf_msg_id_list_parse(item->ovr_references, strlen(item->ovr_references), &cur_token, &msgid_list); switch (r) { case MAILIMF_NO_ERROR: references = mailimf_references_new(msgid_list); if (references == NULL) { clist_foreach(msgid_list, (clist_func) mailimf_msg_id_free, NULL); clist_free(msgid_list); res = MAIL_ERROR_MEMORY; goto free_list; } field = mailimf_field_new(MAILIMF_FIELD_REFERENCES, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, references, NULL, NULL, NULL, NULL); r = clist_append(list, field); if (r < 0) { mailimf_field_free(field); res = MAIL_ERROR_MEMORY; goto free_list; } case MAILIMF_ERROR_PARSE: break; default: res = maildriver_imf_error_to_mail_error(r); goto free_list; } } fields = mailimf_fields_new(list); if (fields == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } * result = fields; return MAIL_NO_ERROR; free_list: clist_foreach(list, (clist_func) mailimf_field_free, NULL); clist_free(list); err: return res; }