message-parser.c revision 94271e397d577a3e8787f4d96ae0b3a8b728f321
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002-2006 Timo Sirainen */
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainen/* RFC-2046 requires boundaries are max. 70 chars + "--" prefix + "--" suffix.
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch We'll add a bit more just in case. */
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainen struct message_header_parser_ctx *hdr_parser_ctx;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch int (*parse_next_block)(struct message_parser_ctx *ctx,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschmessage_part_header_callback_t *null_message_part_header_callback = NULL;
d49214c55881d251a54edddb117ca7735360addcTimo Sirainenstatic int parse_next_header_init(struct message_parser_ctx *ctx,
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainenstatic int parse_next_body_to_boundary(struct message_parser_ctx *ctx,
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainenstatic int parse_next_body_to_eof(struct message_parser_ctx *ctx,
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainenboundary_find(struct message_boundary *boundaries,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch /* As MIME spec says: search from latest one to oldest one so that we
d49214c55881d251a54edddb117ca7735360addcTimo Sirainen don't break if the same boundary is used in nested parts. Also the
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch full message line doesn't have to match the boundary, only the
9c32eb25e7b90e753e0cd7b30f7a70e8ca9121d9Timo Sirainen beginning. */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch memcmp(boundaries->boundary, data, boundaries->len) == 0)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstatic void parse_body_add_block(struct message_parser_ctx *ctx,
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainen unsigned int missing_cr_count = 0;
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainen ctx->part->flags |= MESSAGE_PART_FLAG_HAS_NULS;
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainen ctx->part->body_size.physical_size += block->size;
4abdade2cb09266ea3d063d5cb6893cb0583f20eTimo Sirainen ctx->part->body_size.virtual_size += block->size + missing_cr_count;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstatic int message_parser_read_more(struct message_parser_ctx *ctx,
int ret;
if (ret == 0) {
static struct message_part *
return part;
struct message_boundary *b;
size_t i;
size_t i;
int ret;
return ret;
const unsigned char *data;
int ret;
return ret;
if (ret >= 0) {
if (ret == 0)
boundary_start = i;
if (boundary_start != 0)
&boundary);
if (ret >= 0) {
if (eof)
ret = 0;
if (ret >= 0) {
int ret;
return ret;
const char *str;
t_push();
t_pop();
char *boundary;
if (value_quoted)
#define MUTEX_FLAGS \
int ret;
return ret;
MESSAGE_PART_FLAG_MULTIPART_DIGEST) != 0) {
TRUE);
struct message_parser_ctx *
return ctx;
return parts;
int ret;
if (ret <= 0) {
if (ret == 0) {
if (ret < 0) {
if (ret < 0) {
return ret;
void *context)
int ret;
if (ret < 0) {
void *context)
int ret;
void *context)
int ret;
void *context)
if (use_crlf) {
if (!use_crlf)