mbox-sync-private.h revision 511a7ccd55cea57c9d953920b7d651720128ada9
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen#ifndef MBOX_SYNC_PRIVATE_H
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#define MBOX_SYNC_PRIVATE_H
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "md5.h"
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#include "mail-index.h"
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen#include <sys/stat.h>
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenenum mbox_sync_flags {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_SYNC_HEADER = 0x02,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_SYNC_LOCK_READING = 0x04,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_SYNC_UNDIRTY = 0x08,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_SYNC_REWRITE = 0x10,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_SYNC_FORCE_SYNC = 0x20,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_SYNC_READONLY = 0x40
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen};
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstruct mbox_flag_type {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen char chr;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen enum mail_flags flag;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen};
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenenum header_position {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_HDR_STATUS,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_HDR_X_IMAPBASE,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen MBOX_HDR_X_KEYWORDS,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen MBOX_HDR_X_STATUS,
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen MBOX_HDR_X_UID,
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen MBOX_HDR_COUNT
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen};
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen/* kludgy. swap MAIL_RECENT with MBOX_NONRECENT_KLUDGE when writing Status
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen header, because 'O' flag means non-recent but internally we want to use
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen recent flag. */
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#define MBOX_NONRECENT_KLUDGE MAIL_RECENT
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen#define STATUS_FLAGS_MASK (MAIL_SEEN|MBOX_NONRECENT_KLUDGE)
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen#define XSTATUS_FLAGS_MASK (MAIL_ANSWERED|MAIL_FLAGGED|MAIL_DRAFT|MAIL_DELETED)
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainenextern struct mbox_flag_type mbox_status_flags[];
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenextern struct mbox_flag_type mbox_xstatus_flags[];
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenstruct mbox_sync_mail {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* uid=0 can mean that this mail describes an expunged area or that
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen this is a pseudo message */
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uint32_t uid;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uint32_t idx_seq;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen ARRAY_TYPE(keyword_indexes) keywords;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uint8_t flags;
beae08c3abc23434d15572ab3b059fbdf8efc2dfTimo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int uid_broken:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int expunged:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int pseudo:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int status_broken:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int xstatus_broken:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t from_offset;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t body_size;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen /* following variables have a bit overloaded functionality:
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen a) space <= 0 : offset points to beginning of headers. space is the
beae08c3abc23434d15572ab3b059fbdf8efc2dfTimo Sirainen amount of space missing that is required to be able to rewrite
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen the headers
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen b) space > 0 : offset points to beginning of whitespace that can
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen be removed. space is the amount of data that can be removed from
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen there. note that the message may contain more whitespace
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen elsewhere. */
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t offset;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen off_t space;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen};
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstruct mbox_sync_mail_context {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mbox_sync_context *sync_ctx;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mbox_sync_mail mail;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uint32_t seq;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t hdr_offset, body_offset;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen size_t header_first_change, header_last_change;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen string_t *header;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned char hdr_md5_sum[16];
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t content_length;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen size_t hdr_pos[MBOX_HDR_COUNT];
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uint32_t parsed_uid, last_uid_updated_value;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int last_uid_value_start_pos;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int have_eoh:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int need_rewrite:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int seen_imapbase:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int updated:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int recent:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int dirty:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int imapbase_rewrite:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int imapbase_updated:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen};
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenstruct mbox_sync_context {
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mbox_mailbox *mbox;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen enum mbox_sync_flags flags;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct istream *input, *file_input;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen int write_fd;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen time_t orig_mtime, orig_atime;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t orig_size;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct stat last_stat;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mail_index_sync_ctx *index_sync_ctx;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mail_index_view *sync_view;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mail_index_transaction *t;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mail_index_header reset_hdr;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const struct mail_index_header *hdr;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen string_t *header, *from_line;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen /* header state: */
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen uint32_t base_uid_validity, base_uid_last;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen uoff_t base_uid_last_offset;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen /* mail state: */
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen ARRAY(struct mbox_sync_mail) mails;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen struct index_sync_changes_context *sync_changes;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen /* per-mail pool */
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen pool_t mail_keyword_pool;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen /* used for mails[].keywords */
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen pool_t saved_keywords_pool;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen uint32_t prev_msg_uid, next_uid, idx_next_uid;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen uint32_t seq, idx_seq, need_space_seq;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen uint32_t last_nonrecent_uid;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen off_t expunged_space, space_diff;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen unsigned int dest_first_mail:1;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen unsigned int first_mail_crlf_expunged:1;
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen /* global flags: */
53ec1ff2231d477db3103c51987fa9cb6033bc16Timo Sirainen unsigned int keep_recent:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int readonly:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int delay_writes:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int renumber_uids:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int moved_offsets:1;
53ec1ff2231d477db3103c51987fa9cb6033bc16Timo Sirainen unsigned int ext_modified:1;
53ec1ff2231d477db3103c51987fa9cb6033bc16Timo Sirainen unsigned int index_reset:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen unsigned int errors:1;
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen};
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_sync_header_refresh(struct mbox_mailbox *mbox);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_sync(struct mbox_mailbox *mbox, enum mbox_sync_flags flags);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_sync_has_changed(struct mbox_mailbox *mbox, bool leave_dirty);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_sync_has_changed_full(struct mbox_mailbox *mbox, bool leave_dirty,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen bool *empty_r);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_set_critical(struct mbox_sync_context *sync_ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen const char *fmt, ...) ATTR_FORMAT(2, 3);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_parse_next_mail(struct istream *input,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mbox_sync_mail_context *ctx);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenbool mbox_sync_parse_match_mail(struct mbox_mailbox *mbox,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mail_index_view *view, uint32_t seq);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_update_header(struct mbox_sync_mail_context *ctx);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_update_header_from(struct mbox_sync_mail_context *ctx,
c649139f889c02154fc9a153728b81619edb5663Timo Sirainen const struct mbox_sync_mail *mail);
c649139f889c02154fc9a153728b81619edb5663Timo Sirainenint mbox_sync_try_rewrite(struct mbox_sync_mail_context *ctx, off_t move_diff);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_sync_rewrite(struct mbox_sync_context *sync_ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen struct mbox_sync_mail_context *mail_ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t end_offset, off_t move_diff, uoff_t extra_space,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uint32_t first_seq, uint32_t last_seq);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_sync_seek(struct mbox_sync_context *sync_ctx, uoff_t from_offset);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_file_update_ext_modified(struct mbox_sync_context *sync_ctx);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_file_updated(struct mbox_sync_context *sync_ctx, bool dirty);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_move(struct mbox_sync_context *sync_ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen uoff_t dest, uoff_t source, uoff_t size);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen size_t pos, size_t need, size_t have);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenvoid mbox_sync_headers_add_space(struct mbox_sync_mail_context *ctx,
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen size_t size);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainenint mbox_sync_get_guid(struct mbox_mailbox *mbox);
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen#endif
48566ca412a7cf3b42512fd0ec112744778e5da0Timo Sirainen