mail-index-private.h revision 8ababf3e7b15f793370d1dedf85825d38b42633f
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#ifndef __MAIL_INDEX_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define __MAIL_INDEX_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen#include "file-lock.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-index.h"
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen#include "mail-index-view-private.h"
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen#include "mail-index-transaction-private.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen#include <sys/stat.h>
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_header;
fea541eec46707f9b01bd3cbc981d73c1e808a54Timo Sirainenstruct mail_transaction_log_view;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenstruct mail_index_sync_map_ctx;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen/* How large index files to mmap() instead of reading to memory. */
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen#define MAIL_INDEX_MMAP_MIN_SIZE (1024*64)
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen/* How many times to retry opening index files if read/fstat returns ESTALE.
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen This happens with NFS when the file has been deleted (ie. index file was
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen rewritten by another computer than us). */
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainen#define MAIL_INDEX_ESTALE_RETRY_COUNT NFS_ESTALE_RETRY_COUNT
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen#define MAIL_INDEX_IS_IN_MEMORY(index) \
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen ((index)->dir == NULL)
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define MAIL_INDEX_MAP_IS_IN_MEMORY(map) \
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ((map)->rec_map->mmap_base == NULL)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen#define MAIL_INDEX_MAP_IDX(map, idx) \
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen ((struct mail_index_record *) \
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen PTR_OFFSET((map)->rec_map->records, (idx) * (map)->hdr.record_size))
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainentypedef int mail_index_expunge_handler_t(struct mail_index_sync_map_ctx *ctx,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen uint32_t seq, const void *data,
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen void **sync_context, void *context);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainentypedef int mail_index_sync_handler_t(struct mail_index_sync_map_ctx *ctx,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen uint32_t seq, void *old_data,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen const void *new_data, void **context);
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainentypedef void mail_index_sync_lost_handler_t(struct mail_index *index);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo SirainenARRAY_DEFINE_TYPE(seq_array, uint32_t);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen#define MAIL_INDEX_HEADER_SIZE_ALIGN(size) \
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen (((size) + 7) & ~7)
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenstruct mail_index_ext {
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen const char *name;
ab286a8b58306eb8d22fc18342b6c199fd428e1eTimo Sirainen uint32_t index_idx; /* index ext_id */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen uint32_t reset_id;
cfa9359fbd6a967ccdcd553c5e483a093885ab6fTimo Sirainen uint32_t ext_offset; /* points to beginning of mail_index_ext_header */
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen uint32_t hdr_offset; /* points to mail_index_ext_header.data[] */
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint16_t record_offset;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint16_t record_size;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint16_t record_align;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen};
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainenstruct mail_index_ext_header {
d74899545d913eac91c82b692927b32c3bf36abaTimo Sirainen uint32_t hdr_size; /* size of data[] */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen uint32_t reset_id;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint16_t record_offset;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint16_t record_size;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint16_t record_align;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint16_t name_size;
d74899545d913eac91c82b692927b32c3bf36abaTimo Sirainen /* unsigned char name[name_size] */
d74899545d913eac91c82b692927b32c3bf36abaTimo Sirainen /* unsigned char data[hdr_size] (starting 64bit aligned) */
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen};
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenstruct mail_index_keyword_header {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen uint32_t keywords_count;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen /* struct mail_index_keyword_header_rec[] */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen /* char name[][] */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen};
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenstruct mail_index_keyword_header_rec {
625101600b8c05f72f79b13604de0c751a73e959Timo Sirainen uint32_t unused; /* for backwards compatibility */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen uint32_t name_offset; /* relative to beginning of name[] */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen};
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainenenum mail_index_sync_handler_type {
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen MAIL_INDEX_SYNC_HANDLER_FILE = 0x01,
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen MAIL_INDEX_SYNC_HANDLER_HEAD = 0x02,
9315dd69233d554452df0c12bc57002d2042a8f4Timo Sirainen MAIL_INDEX_SYNC_HANDLER_VIEW = 0x04
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen};
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainenstruct mail_index_sync_handler {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen mail_index_sync_handler_t *callback;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen enum mail_index_sync_handler_type type;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen};
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainenstruct mail_index_registered_ext {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen const char *name;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen uint32_t index_idx; /* index ext_id */
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen uint16_t record_size;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen uint16_t record_align;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen struct mail_index_sync_handler sync_handler;
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen mail_index_expunge_handler_t *expunge_handler;
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen void *expunge_context;
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen unsigned int expunge_handler_call_always:1;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen};
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainenstruct mail_index_record_map {
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen ARRAY_DEFINE(maps, struct mail_index_map *);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen void *mmap_base;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen size_t mmap_size, mmap_used_size;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen unsigned int lock_id;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen buffer_t *buffer;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen void *records; /* struct mail_index_record[] */
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen unsigned int records_count;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen uint32_t last_appended_uid;
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen /* If this mapping is written to disk and write_atomic=FALSE,
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen write_seq_* specify the message sequence range that needs to be
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen written. */
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen uint32_t write_seq_first, write_seq_last;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen};
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_index_map {
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainen struct mail_index *index;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int refcount;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1b3bb8d39686ed24730cbc31cc9a33dc62c8c6c3Timo Sirainen struct mail_index_header hdr;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen const void *hdr_base;
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen buffer_t *hdr_copy_buf;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen pool_t extension_pool;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(extensions, struct mail_index_ext);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(ext_id_map, uint32_t); /* index -> file */
7e94cf9d70ce9fdeccb7a85ff400b899e6386f36Timo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(keyword_idx_map, unsigned int); /* file -> index */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen struct mail_index_record_map *rec_map;
41bb0aa8e357876bc9a1916a37c9e3e78e5f8185Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen unsigned int write_base_header:1;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen unsigned int write_ext_header:1;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen unsigned int write_atomic:1; /* write to a new file and rename() */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainenstruct mail_index_module_register {
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen unsigned int id;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen};
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainenunion mail_index_module_context {
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen struct mail_index_module_register *reg;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen};
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_index {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *dir, *prefix;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_cache *cache;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_transaction_log *log;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mode_t mode;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen gid_t gid;
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen pool_t extension_pool;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(extensions, struct mail_index_registered_ext);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(sync_lost_handlers, mail_index_sync_lost_handler_t *);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *filepath;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int fd;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct mail_index_map *map;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t indexid;
3b80595fcf2001cf7b2fcc6290823e38f4a142fcTimo Sirainen unsigned int inconsistency_id;
3b80595fcf2001cf7b2fcc6290823e38f4a142fcTimo Sirainen
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen /* last_read_log_file_* contains the seq/offsets we last read from
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen the main index file's headers. these are used to figure out when
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen the main index file should be updated, and if we can update it
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen by writing on top of it or if we need to recreate it. */
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen uint32_t last_read_log_file_seq;
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen uint32_t last_read_log_file_head_offset;
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen uint32_t last_read_log_file_tail_offset;
8e57335924f5ff57cbd1929ec99764dc267c3312Timo Sirainen struct stat last_read_stat;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen /* transaction log head seq/offset when we last fscked */
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen uint32_t fsck_log_head_file_seq;
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen uoff_t fsck_log_head_file_offset;
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int lock_type, shared_lock_count, excl_lock_count;
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen unsigned int lock_id_counter;
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen enum file_lock_method lock_method;
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen struct file_lock *file_lock;
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainen struct dotlock *dotlock;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen pool_t keywords_pool;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_TYPE(keywords) keywords;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct hash_table *keywords_hash; /* name -> idx */
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen uint32_t keywords_ext_id;
690af4a90eaf8611c2573d34126bb7a852c50a44Timo Sirainen
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen /* Module-specific contexts. */
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_index_module_context *);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *error;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int nodiskspace:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int index_lock_timeout:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int opened:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int log_locked:1;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen unsigned int mmap_disable:1;
369a1084c500a9df7448ffa9409ce32e42060bc2Timo Sirainen unsigned int fsync_disable:1;
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainen unsigned int use_excl_dotlocks:1;
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen unsigned int nfs_flush:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int readonly:1;
ed3ce1282f6bc35d20e82c2c23a2990c8dfe876fTimo Sirainen unsigned int mapping:1;
3bf14402b7ec0795fbe5721b31b7e98e883d98c0Timo Sirainen unsigned int need_recreate:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainenextern struct mail_index_module_register mail_index_module_register;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen/* Add/replace sync handler for specified extra record. */
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenvoid mail_index_register_expunge_handler(struct mail_index *index,
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen uint32_t ext_id, bool call_always,
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen mail_index_expunge_handler_t *callback,
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen void *context);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainenvoid mail_index_unregister_expunge_handler(struct mail_index *index,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen uint32_t ext_id);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenvoid mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen mail_index_sync_handler_t *cb,
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen enum mail_index_sync_handler_type type);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainenvoid mail_index_unregister_sync_handler(struct mail_index *index,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen uint32_t ext_id);
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainenvoid mail_index_register_sync_lost_handler(struct mail_index *index,
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen mail_index_sync_lost_handler_t *cb);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainenvoid mail_index_unregister_sync_lost_handler(struct mail_index *index,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen mail_index_sync_lost_handler_t *cb);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_index_create_tmp_file(struct mail_index *index, const char **path_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenint mail_index_try_open_only(struct mail_index *index);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenint mail_index_reopen_if_changed(struct mail_index *index);
10a97b15c34119ffe2d2eab9b975252fed631df2Timo Sirainen/* Update/rewrite the main index file from index->map */
10a97b15c34119ffe2d2eab9b975252fed631df2Timo Sirainenvoid mail_index_write(struct mail_index *index, bool want_rotate);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
5c1a8aee989af87bddefd71e2aa83aa2bd695155Timo Sirainen/* Returns 0 = ok, -1 = error. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenint mail_index_lock_shared(struct mail_index *index, unsigned int *lock_id_r);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen/* Returns 1 = ok, 0 = already locked, -1 = error. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenint mail_index_try_lock_exclusive(struct mail_index *index,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen unsigned int *lock_id_r);
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainenvoid mail_index_unlock(struct mail_index *index, unsigned int *lock_id);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen/* Returns TRUE if given lock_id is valid. */
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenbool mail_index_is_locked(struct mail_index *index, unsigned int lock_id);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2af769daebd83719ac696a440e06f6020471cec0Timo Sirainenint mail_index_lock_fd(struct mail_index *index, const char *path, int fd,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen int lock_type, unsigned int timeout_secs,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen struct file_lock **lock_r);
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen/* Allocate a new empty map. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstruct mail_index_map *mail_index_map_alloc(struct mail_index *index);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen/* Replace index->map with the latest index changes. This may reopen the index
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen file and/or it may read the latest changes from transaction log. The log is
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen read up to EOF, but non-synced expunges are skipped.
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen If we mmap()ed the index file, the map is returned locked.
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
3b80595fcf2001cf7b2fcc6290823e38f4a142fcTimo Sirainen Returns 1 = ok, 0 = corrupted, -1 = error. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenint mail_index_map(struct mail_index *index,
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen enum mail_index_sync_handler_type type);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Unreference given mapping and unmap it if it's dropped to zero. */
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainenvoid mail_index_unmap(struct mail_index_map **map);
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen/* Clone a map. The returned map is always in memory. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstruct mail_index_map *mail_index_map_clone(const struct mail_index_map *map);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainenvoid mail_index_record_map_move_to_private(struct mail_index_map *map);
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen/* Move a mmaped map to memory. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenvoid mail_index_map_move_to_memory(struct mail_index_map *map);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainenbool mail_index_map_lookup_ext(struct mail_index_map *map, const char *name,
7ded22760598b78ee29f9418eacc0abe3fb51055Timo Sirainen uint32_t *idx_r);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainenuint32_t
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainenmail_index_map_register_ext(struct mail_index_map *map, const char *name,
cfa9359fbd6a967ccdcd553c5e483a093885ab6fTimo Sirainen uint32_t ext_offset, uint32_t hdr_size,
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint32_t record_offset, uint32_t record_size,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen uint32_t record_align, uint32_t reset_id);
12053b7b4b57dbd2790057426d1633988eedad56Timo Sirainenbool mail_index_map_get_ext_idx(struct mail_index_map *map,
12053b7b4b57dbd2790057426d1633988eedad56Timo Sirainen uint32_t ext_id, uint32_t *idx_r);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenconst struct mail_index_ext *
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainenmail_index_view_get_ext(struct mail_index_view *view, uint32_t ext_id);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
f7656d7bc15510a4259ed74ddda3c560de8a51c1Timo Sirainenint mail_index_map_check_header(struct mail_index_map *map);
b0be0bead3d6963149f7f2a9504b8ab5aced9af5Timo Sirainenint mail_index_map_parse_keywords(struct mail_index_map *map);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainenint mail_index_map_ext_get_next(struct mail_index_map *map,
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainen unsigned int *offset,
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainen const struct mail_index_ext_header **ext_hdr_r,
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainen const char **name_r);
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainenint mail_index_map_ext_hdr_check(const struct mail_index_header *hdr,
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainen const struct mail_index_ext_header *ext_hdr,
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainen const char *name, const char **error_r);
8ababf3e7b15f793370d1dedf85825d38b42633fTimo Sirainenunsigned int mail_index_map_ext_hdr_offset(unsigned int name_len);
746d35bf3dba3ae5ddbcecb9732f60d5e9de77efTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_index_view_transaction_ref(struct mail_index_view *view);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_index_view_transaction_unref(struct mail_index_view *view);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
3b80595fcf2001cf7b2fcc6290823e38f4a142fcTimo Sirainenvoid mail_index_fsck_locked(struct mail_index *index);
3b80595fcf2001cf7b2fcc6290823e38f4a142fcTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_index_set_error(struct mail_index *index, const char *fmt, ...)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen __attr_format__(2, 3);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* "%s failed with index file %s: %m" */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_index_set_syscall_error(struct mail_index *index,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *function);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* "%s failed with file %s: %m" */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_index_file_set_syscall_error(struct mail_index *index,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *filepath,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *function);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
44ff75ca53188056ff5a3e50428e3f2078800b3cTimo Sirainenuint32_t mail_index_uint32_to_offset(uint32_t offset);
44ff75ca53188056ff5a3e50428e3f2078800b3cTimo Sirainenuint32_t mail_index_offset_to_uint32(uint32_t offset);
44ff75ca53188056ff5a3e50428e3f2078800b3cTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#endif