int dsync_mail_get_hdr_hash(struct mail *mail, const char **hdr_hash_r) { struct istream *hdr_input, *input; struct mailbox_header_lookup_ctx *hdr_ctx; struct md5_context md5_ctx; unsigned char md5_result[MD5_RESULTLEN]; const unsigned char *data; size_t size; int ret = 0; hdr_ctx = mailbox_header_lookup_init(mail->box, hashed_headers); ret = mail_get_header_stream(mail, hdr_ctx, &hdr_input); mailbox_header_lookup_unref(&hdr_ctx); if (ret < 0) return -1; input = i_stream_create_lf(hdr_input); md5_init(&md5_ctx); while (!i_stream_is_eof(input)) { if (i_stream_read_data(input, &data, &size, 0) == -1) break; if (size == 0) break; md5_update(&md5_ctx, data, size); i_stream_skip(input, size); } if (input->stream_errno != 0) ret = -1; i_stream_unref(&input); md5_final(&md5_ctx, md5_result); *hdr_hash_r = binary_to_hex(md5_result, sizeof(md5_result)); return ret; }
static int imapc_mail_get_headers(struct mail *_mail, const char *field, bool decode_to_utf8, const char *const **value_r) { struct mailbox_header_lookup_ctx *headers; const char *header_names[2]; struct istream *input; int ret; header_names[0] = field; header_names[1] = NULL; headers = mailbox_header_lookup_init(_mail->box, header_names); ret = mail_get_header_stream(_mail, headers, &input); mailbox_header_lookup_unref(&headers); if (ret < 0) return -1; /* the header should cached now. */ return index_mail_get_headers(_mail, field, decode_to_utf8, value_r); }
static int virtual_mail_get_header_stream(struct mail *mail, struct mailbox_header_lookup_ctx *headers, struct istream **stream_r) { struct virtual_mail *vmail = (struct virtual_mail *)mail; struct mailbox_header_lookup_ctx *backend_headers; int ret; if (virtual_mail_handle_lost(vmail) < 0) return -1; backend_headers = mailbox_header_lookup_init(vmail->backend_mail->box, headers->headers); ret = mail_get_header_stream(vmail->backend_mail, backend_headers, stream_r); mailbox_header_lookup_unref(&backend_headers); if (ret < 0) { virtual_box_copy_error(mail->box, vmail->backend_mail->box); return -1; } return 0; }
static int imapc_mail_get_headers(struct mail *_mail, const char *field, bool decode_to_utf8, const char *const **value_r) { struct mailbox_header_lookup_ctx *headers; const char *header_names[2]; const unsigned char *data; size_t size; struct istream *input; int ret; header_names[0] = field; header_names[1] = NULL; headers = mailbox_header_lookup_init(_mail->box, header_names); ret = mail_get_header_stream(_mail, headers, &input); mailbox_header_lookup_unref(&headers); if (ret < 0) return -1; while (i_stream_read_data(input, &data, &size, 0) > 0) i_stream_skip(input, size); /* the header should cached now. */ return index_mail_get_headers(_mail, field, decode_to_utf8, value_r); }