mail-index-private.h revision 5aeb15e5817fbd4b1d8de540aa7673e3819a8030
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen#ifndef MAIL_INDEX_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define MAIL_INDEX_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen#include "file-lock.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "mail-index.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-index-view-private.h"
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen#include "mail-index-transaction-private.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include <sys/stat.h>
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainenstruct mail_transaction_header;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_log_view;
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainenstruct mail_index_sync_map_ctx;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen/* How large index files to mmap() instead of reading to memory. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define MAIL_INDEX_MMAP_MIN_SIZE (1024*64)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* How many times to retry opening index files if read/fstat returns ESTALE.
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen This happens with NFS when the file has been deleted (ie. index file was
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen rewritten by another computer than us). */
dd0ba1bab2c1b89c7e063fa45d156fa72b8260d5Timo Sirainen#define MAIL_INDEX_ESTALE_RETRY_COUNT NFS_ESTALE_RETRY_COUNT
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen/* Large extension header sizes are probably caused by file corruption, so
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen try to catch them by limiting the header size. */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen#define MAIL_INDEX_EXT_HEADER_MAX_SIZE (1024*1024*16-1)
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen#define MAIL_INDEX_IS_IN_MEMORY(index) \
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen ((index)->dir == NULL)
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen#define MAIL_INDEX_MAP_IS_IN_MEMORY(map) \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ((map)->rec_map->mmap_base == NULL)
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen#define MAIL_INDEX_MAP_IDX(map, idx) \
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen ((struct mail_index_record *) \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen PTR_OFFSET((map)->rec_map->records, (idx) * (map)->hdr.record_size))
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define MAIL_TRANSACTION_FLAG_UPDATE_IS_INTERNAL(u) \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ((((u)->add_flags | (u)->remove_flags) & \
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen MAIL_INDEX_FLAGS_MASK) == 0)
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen#define MAIL_INDEX_EXT_KEYWORDS "keywords"
e9f2d9104d395bcf54be3f8ba8d9f63aecf0bcbeTimo Sirainen
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainentypedef int mail_index_expunge_handler_t(struct mail_index_sync_map_ctx *ctx,
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen uint32_t seq, const void *data,
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen void **sync_context, void *context);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainentypedef int mail_index_sync_handler_t(struct mail_index_sync_map_ctx *ctx,
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen uint32_t seq, void *old_data,
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen const void *new_data, void **context);
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainentypedef void mail_index_sync_lost_handler_t(struct mail_index *index);
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenARRAY_DEFINE_TYPE(seq_array, uint32_t);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen#define MAIL_INDEX_HEADER_SIZE_ALIGN(size) \
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen (((size) + 7) & ~7)
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainenstruct mail_index_ext {
e1f05b193ac1edd3267294e9501e8063aa0f791aTimo Sirainen const char *name;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t index_idx; /* index ext_id */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t reset_id;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t ext_offset; /* points to beginning of mail_index_ext_header */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t hdr_offset; /* points to mail_index_ext_header.data[] */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
61b6d1256936065321153bcd9228b9e45d95c9abTimo Sirainen uint16_t record_offset;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint16_t record_size;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint16_t record_align;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen};
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainenstruct mail_index_ext_header {
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen uint32_t hdr_size; /* size of data[] */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t reset_id;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint16_t record_offset;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint16_t record_size;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint16_t record_align;
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen uint16_t name_size;
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen /* unsigned char name[name_size] */
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen /* unsigned char data[hdr_size] (starting 64bit aligned) */
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen};
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainenstruct mail_index_keyword_header {
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t keywords_count;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen /* struct mail_index_keyword_header_rec[] */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen /* char name[][] */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen};
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainenstruct mail_index_keyword_header_rec {
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t unused; /* for backwards compatibility */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen uint32_t name_offset; /* relative to beginning of name[] */
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen};
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainenenum mail_index_sync_handler_type {
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen MAIL_INDEX_SYNC_HANDLER_FILE = 0x01,
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen MAIL_INDEX_SYNC_HANDLER_HEAD = 0x02,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MAIL_INDEX_SYNC_HANDLER_VIEW = 0x04
61b6d1256936065321153bcd9228b9e45d95c9abTimo Sirainen};
61b6d1256936065321153bcd9228b9e45d95c9abTimo Sirainen
61b6d1256936065321153bcd9228b9e45d95c9abTimo Sirainenstruct mail_index_sync_handler {
61b6d1256936065321153bcd9228b9e45d95c9abTimo Sirainen mail_index_sync_handler_t *callback;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mail_index_sync_handler_type type;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen};
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_index_registered_ext {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *name;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t index_idx; /* index ext_id */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint16_t record_size;
ee26329cb5cc679b5645e4933d529f86accb976aTimo Sirainen uint16_t record_align;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen struct mail_index_sync_handler sync_handler;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen mail_index_expunge_handler_t *expunge_handler;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen void *expunge_context;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen unsigned int expunge_handler_call_always:1;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen};
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainenstruct mail_index_record_map {
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen ARRAY_DEFINE(maps, struct mail_index_map *);
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void *mmap_base;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t mmap_size, mmap_used_size;
61b6d1256936065321153bcd9228b9e45d95c9abTimo Sirainen unsigned int lock_id;
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen
1a5fcc972dbadfe7959011b8ad422707e2dfc19fTimo Sirainen buffer_t *buffer;
1a5fcc972dbadfe7959011b8ad422707e2dfc19fTimo Sirainen
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen void *records; /* struct mail_index_record[] */
df6478c4cf605bd81b3891c148b84c14eb6c4035Timo Sirainen unsigned int records_count;
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen
cfbf891f065b18602703ed6fa2af1a541d4d0b04Timo Sirainen struct mail_index_map_modseq *modseq;
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen uint32_t last_appended_uid;
e9f2d9104d395bcf54be3f8ba8d9f63aecf0bcbeTimo Sirainen
e9f2d9104d395bcf54be3f8ba8d9f63aecf0bcbeTimo Sirainen /* If this mapping is written to disk and write_atomic=FALSE,
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen write_seq_* specify the message sequence range that needs to be
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen written. */
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen uint32_t write_seq_first, write_seq_last;
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen};
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainenstruct mail_index_map {
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen struct mail_index *index;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int refcount;
6f73af3a3a6ee900c7e736874587968d76a20bc0Timo Sirainen
6f73af3a3a6ee900c7e736874587968d76a20bc0Timo Sirainen struct mail_index_header hdr;
6f73af3a3a6ee900c7e736874587968d76a20bc0Timo Sirainen const void *hdr_base;
6f73af3a3a6ee900c7e736874587968d76a20bc0Timo Sirainen buffer_t *hdr_copy_buf;
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen pool_t extension_pool;
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen ARRAY_DEFINE(extensions, struct mail_index_ext);
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen ARRAY_DEFINE(ext_id_map, uint32_t); /* index -> file */
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen ARRAY_DEFINE(keyword_idx_map, unsigned int); /* file -> index */
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen struct mail_index_record_map *rec_map;
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen unsigned int write_base_header:1;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen unsigned int write_ext_header:1;
5e40ed3f0a2c2acddc9b8eab59670c7a850114c5Timo Sirainen unsigned int write_atomic:1; /* write to a new file and rename() */
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen};
ca316aeb7648d3f1bcf45231f73ddeb1b67a6961Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenstruct mail_index_module_register {
6f73af3a3a6ee900c7e736874587968d76a20bc0Timo Sirainen unsigned int id;
50c4a9739b55370b1d3950d7b3ec2f7cd2ed5f49Timo Sirainen};
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen
e9f2d9104d395bcf54be3f8ba8d9f63aecf0bcbeTimo Sirainenunion mail_index_module_context {
e9f2d9104d395bcf54be3f8ba8d9f63aecf0bcbeTimo Sirainen struct mail_index_module_register *reg;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_index {
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen char *dir, *prefix;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen struct mail_cache *cache;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen struct mail_transaction_log *log;
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen enum mail_index_sync_type fsync_mask;
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen mode_t mode;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen gid_t gid;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen pool_t extension_pool;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen ARRAY_DEFINE(extensions, struct mail_index_registered_ext);
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen ARRAY_DEFINE(sync_lost_handlers, mail_index_sync_lost_handler_t *);
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen char *filepath;
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen int fd;
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen struct mail_index_map *map;
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen uint32_t indexid;
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen unsigned int inconsistency_id;
9404a7b90dcb80d31bd37ee2493f03751acdb1bdTimo Sirainen
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen /* last_read_log_file_* contains the seq/offsets we last read from
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen the main index file's headers. these are used to figure out when
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen the main index file should be updated, and if we can update it
d24daa83c25063ef12b524c9ffcc9ecca34dadb9Timo Sirainen by writing on top of it or if we need to recreate it. */
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen uint32_t last_read_log_file_seq;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen uint32_t last_read_log_file_head_offset;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen uint32_t last_read_log_file_tail_offset;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen struct stat last_read_stat;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen /* transaction log head seq/offset when we last fscked */
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen uint32_t fsck_log_head_file_seq;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen uoff_t fsck_log_head_file_offset;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen int lock_type, shared_lock_count, excl_lock_count;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen unsigned int lock_id_counter;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen enum file_lock_method lock_method;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen struct file_lock *file_lock;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen struct dotlock *dotlock;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen pool_t keywords_pool;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen ARRAY_TYPE(keywords) keywords;
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen struct hash_table *keywords_hash; /* name -> idx */
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen uint32_t keywords_ext_id;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen uint32_t modseq_ext_id;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen /* Module-specific contexts. */
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_index_module_context *);
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen char *error;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int nodiskspace:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int index_lock_timeout:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int opened:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int log_locked:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int mmap_disable:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int fsync_disable:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int use_excl_dotlocks:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int nfs_flush:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int readonly:1;
8fcaba5977f7d596632df1ed2af8541e5f154258Timo Sirainen unsigned int mapping:1;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen unsigned int syncing:1;
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen unsigned int need_recreate:1;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen unsigned int modseqs_enabled:1;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen unsigned int initial_create:1;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen unsigned int initial_mapped:1;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen};
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainenextern struct mail_index_module_register mail_index_module_register;
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen/* Add/replace sync handler for specified extra record. */
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainenvoid mail_index_register_expunge_handler(struct mail_index *index,
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen uint32_t ext_id, bool call_always,
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen mail_index_expunge_handler_t *callback,
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen void *context);
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainenvoid mail_index_unregister_expunge_handler(struct mail_index *index,
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen uint32_t ext_id);
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainenvoid mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen mail_index_sync_handler_t *cb,
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen enum mail_index_sync_handler_type type);
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainenvoid mail_index_unregister_sync_handler(struct mail_index *index,
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen uint32_t ext_id);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenvoid mail_index_register_sync_lost_handler(struct mail_index *index,
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen mail_index_sync_lost_handler_t *cb);
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainenvoid mail_index_unregister_sync_lost_handler(struct mail_index *index,
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen mail_index_sync_lost_handler_t *cb);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenint mail_index_create_tmp_file(struct mail_index *index, const char **path_r);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenint mail_index_try_open_only(struct mail_index *index);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenvoid mail_index_close_file(struct mail_index *index);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenint mail_index_reopen_if_changed(struct mail_index *index);
dc0474dc9d5652d76cb41f439844dd80c8b96642Timo Sirainen/* Update/rewrite the main index file from index->map */
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenvoid mail_index_write(struct mail_index *index, bool want_rotate);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenvoid mail_index_flush_read_cache(struct mail_index *index, const char *path,
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen int fd, bool locked);
cfbf891f065b18602703ed6fa2af1a541d4d0b04Timo Sirainen
a2ec607689dc88112bf08785960e441153f35d57Timo Sirainen/* Returns 0 = ok, -1 = error. */
20ecea31024db11ea4ca51c87f34fa15470e9c28Timo Sirainenint mail_index_lock_shared(struct mail_index *index, unsigned int *lock_id_r);
a2ec607689dc88112bf08785960e441153f35d57Timo Sirainen/* Returns 1 = ok, 0 = already locked, -1 = error. */
20ecea31024db11ea4ca51c87f34fa15470e9c28Timo Sirainenint mail_index_try_lock_exclusive(struct mail_index *index,
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen unsigned int *lock_id_r);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenvoid mail_index_unlock(struct mail_index *index, unsigned int *lock_id);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen/* Returns TRUE if given lock_id is valid. */
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenbool mail_index_is_locked(struct mail_index *index, unsigned int lock_id);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainenint mail_index_lock_fd(struct mail_index *index, const char *path, int fd,
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen int lock_type, unsigned int timeout_secs,
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen struct file_lock **lock_r);
b159b7fb9740b6e37238016d8395a351de498d50Timo Sirainen
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen/* Allocate a new empty map. */
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainenstruct mail_index_map *mail_index_map_alloc(struct mail_index *index);
a2ce2eb4c266e2854fd34416ea5cfbe05dfd3971Timo Sirainen/* Replace index->map with the latest index changes. This may reopen the index
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen file and/or it may read the latest changes from transaction log. The log is
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen read up to EOF, but non-synced expunges are skipped.
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen If we mmap()ed the index file, the map is returned locked.
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen Returns 1 = ok, 0 = corrupted, -1 = error. */
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenint mail_index_map(struct mail_index *index,
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen enum mail_index_sync_handler_type type);
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen/* Unreference given mapping and unmap it if it's dropped to zero. */
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenvoid mail_index_unmap(struct mail_index_map **map);
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen/* Clone a map. The returned map is always in memory. */
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenstruct mail_index_map *mail_index_map_clone(const struct mail_index_map *map);
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenvoid mail_index_record_map_move_to_private(struct mail_index_map *map);
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen/* Move a mmaped map to memory. */
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenvoid mail_index_map_move_to_memory(struct mail_index_map *map);
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenbool mail_index_map_lookup_ext(struct mail_index_map *map, const char *name,
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen uint32_t *idx_r);
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenuint32_t
e37fbcda56ab154557e84f990012502be53aa6c6Timo Sirainenmail_index_map_register_ext(struct mail_index_map *map,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen const char *name, uint32_t ext_offset,
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen const struct mail_index_ext_header *ext_hdr);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenbool mail_index_map_get_ext_idx(struct mail_index_map *map,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen uint32_t ext_id, uint32_t *idx_r);
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainenconst struct mail_index_ext *
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenmail_index_view_get_ext(struct mail_index_view *view, uint32_t ext_id);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenint mail_index_map_check_header(struct mail_index_map *map);
16c28dd75976f94acc4940d6ba68b6cd4853aac7Timo Sirainenint mail_index_map_parse_keywords(struct mail_index_map *map);
16c28dd75976f94acc4940d6ba68b6cd4853aac7Timo Sirainen
16c28dd75976f94acc4940d6ba68b6cd4853aac7Timo Sirainenint mail_index_map_ext_get_next(struct mail_index_map *map,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen unsigned int *offset,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen const struct mail_index_ext_header **ext_hdr_r,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen const char **name_r);
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainenint mail_index_map_ext_hdr_check(const struct mail_index_header *hdr,
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen const struct mail_index_ext_header *ext_hdr,
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen const char *name, const char **error_r);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenunsigned int mail_index_map_ext_hdr_offset(unsigned int name_len);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenvoid mail_index_view_transaction_ref(struct mail_index_view *view);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenvoid mail_index_view_transaction_unref(struct mail_index_view *view);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenvoid mail_index_fsck_locked(struct mail_index *index);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenint mail_index_set_error(struct mail_index *index, const char *fmt, ...)
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen ATTR_FORMAT(2, 3);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen/* "%s failed with index file %s: %m" */
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenint mail_index_set_syscall_error(struct mail_index *index,
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen const char *function);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen/* "%s failed with file %s: %m" */
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenint mail_index_file_set_syscall_error(struct mail_index *index,
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen const char *filepath,
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen const char *function);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenuint32_t mail_index_uint32_to_offset(uint32_t offset);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenuint32_t mail_index_offset_to_uint32(uint32_t offset);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen#define MAIL_INDEX_PACK_MAX_SIZE ((sizeof(uint32_t) * 8 + 7) / 7)
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenvoid mail_index_pack_num(uint8_t **p, uint32_t num);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainenint mail_index_unpack_num(const uint8_t **p, const uint8_t *end,
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen uint32_t *num_r);
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen#endif
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen