mail-index-private.h revision 190237ce467d2389dfb809874b0fec86d3c7968d
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#ifndef __MAIL_INDEX_PRIVATE_H
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define __MAIL_INDEX_PRIVATE_H
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "file-lock.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "mail-index.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "mail-index-view-private.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "mail-index-transaction-private.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_transaction_header;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstruct mail_transaction_log_view;
9522aa5f33cc37fe8ccd0d647cc51dd3ba6a9b55Timo Sirainenstruct mail_index_sync_map_ctx;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* How many seconds to wait a lock for index file. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_LOCK_SECS 120
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Index file is grown exponentially when we're adding less than this many
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen records. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_MAX_POWER_GROW (1024*1024 / sizeof(struct mail_index_record))
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* How many times to retry opening index files if read/fstat returns ESTALE.
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen This happens with NFS when the file has been deleted (ie. index file was
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen rewritten by another computer than us). */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_ESTALE_RETRY_COUNT NFS_ESTALE_RETRY_COUNT
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_IS_IN_MEMORY(index) \
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ((index)->dir == NULL)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_MAP_IS_IN_MEMORY(map) \
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ((map)->buffer != NULL)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen#define MAIL_INDEX_MAP_IDX(map, idx) \
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ((struct mail_index_record *) \
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen PTR_OFFSET((map)->records, (idx) * (map)->hdr.record_size))
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainentypedef int mail_index_expunge_handler_t(struct mail_index_sync_map_ctx *ctx,
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen uint32_t seq, const void *data,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen void **sync_context, void *context);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainentypedef int mail_index_sync_handler_t(struct mail_index_sync_map_ctx *ctx,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t seq, void *old_data,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const void *new_data, void **context);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainentypedef void mail_index_sync_lost_handler_t(struct mail_index *index);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo SirainenARRAY_DEFINE_TYPE(seq_array, uint32_t);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_HEADER_SIZE_ALIGN(size) \
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen (((size) + 7) & ~7)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_ext {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const char *name;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t index_idx; /* index ext_id */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t reset_id;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t hdr_offset; /* points to mail_index_ext_header.data[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_offset;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_size;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_align;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_ext_header {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t hdr_size; /* size of data[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t reset_id;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_offset;
8d63b0ab4dea920a4dd6a4469289950eef50a063Timo Sirainen uint16_t record_size;
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen uint16_t record_align;
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen uint16_t name_size;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen /* unsigned char name[name_size] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* unsigned char data[hdr_size] (starting 64bit aligned) */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstruct mail_index_keyword_header {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t keywords_count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* struct mail_index_keyword_header_rec[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* char name[][] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_keyword_header_rec {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t name_offset; /* relative to beginning of name[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenenum mail_index_sync_handler_type {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen MAIL_INDEX_SYNC_HANDLER_FILE = 0x01,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen MAIL_INDEX_SYNC_HANDLER_HEAD = 0x02,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen MAIL_INDEX_SYNC_HANDLER_VIEW = 0x04
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_sync_handler {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_sync_handler_t *callback;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen enum mail_index_sync_handler_type type;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_registered_ext {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const char *name;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t index_idx; /* index ext_id */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_size;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_align;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_index_sync_handler sync_handler;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_expunge_handler_t *expunge_handler;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void *expunge_context;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int expunge_handler_call_always:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_map {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int refcount;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_index_header hdr;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const void *hdr_base;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void *records; /* struct mail_index_record[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int records_count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen pool_t extension_pool;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(extensions, struct mail_index_ext);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ARRAY_DEFINE(ext_id_map, uint32_t); /* index -> file */
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void *mmap_base;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen size_t mmap_size, mmap_used_size;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen buffer_t *buffer;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen buffer_t *hdr_copy_buf;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(keyword_idx_map, unsigned int); /* file -> index */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* If write_to_disk=TRUE and write_atomic=FALSE, these sequences
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen specify the range that needs to be written. Header should always
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen be rewritten. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t write_seq_first, write_seq_last;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int keywords_read:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int write_to_disk:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int write_atomic:1; /* copy to new file and rename() */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen char *dir, *prefix;
1055d8038122c4f4190d37d98fdff6791d1306f8Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_cache *cache;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_transaction_log *log;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mode_t mode;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen gid_t gid;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen pool_t extension_pool;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(extensions, struct mail_index_registered_ext);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(sync_lost_handlers, mail_index_sync_lost_handler_t *);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen char *filepath;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int fd;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_index_map *map;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen const struct mail_index_header *hdr;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen uint32_t indexid;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int lock_type, shared_lock_count, excl_lock_count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int lock_id;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen char *copy_lock_path;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen enum file_lock_method lock_method;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct file_lock *file_lock;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct dotlock *dotlock;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* These are typically same as map->hdr->log_file_*, but with
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mmap_disable we may have synced more than index */
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen uint32_t sync_log_file_seq;
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen uoff_t sync_log_file_offset;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen pool_t keywords_pool;
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen ARRAY_TYPE(keywords) keywords;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct hash_table *keywords_hash; /* name -> idx */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t keywords_ext_id;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int last_grow_count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* Module-specific contexts. See mail_index_module_id. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(mail_index_module_contexts, void);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen char *error;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int nodiskspace:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int index_lock_timeout:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int opened:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int log_locked:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int mmap_disable:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int fsync_disable:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int mmap_no_write:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int use_excl_dotlocks:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int readonly:1;
dc1bc1685e4a0d58ae7bacaecc282d0ebde2d7daTimo Sirainen unsigned int fsck:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int sync_update:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int mapping:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Add/replace sync handler for specified extra record. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_register_expunge_handler(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t ext_id, bool call_always,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_expunge_handler_t *callback,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void *context);
36a687c1ed3ce55520bdf28cd2fa1f653360068dTimo Sirainenvoid mail_index_unregister_expunge_handler(struct mail_index *index,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen uint32_t ext_id);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen mail_index_sync_handler_t *cb,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen enum mail_index_sync_handler_type type);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_unregister_sync_handler(struct mail_index *index,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen uint32_t ext_id);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_register_sync_lost_handler(struct mail_index *index,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen mail_index_sync_lost_handler_t *cb);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_unregister_sync_lost_handler(struct mail_index *index,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen mail_index_sync_lost_handler_t *cb);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_write_base_header(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct mail_index_header *hdr);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_reopen(struct mail_index *index, int fd);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_create_tmp_file(struct mail_index *index, const char **path_r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Returns 0 = ok, -1 = error. If update_index is TRUE, reopens the index
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen file if needed to get later version of it (not necessarily latest due to
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen races, unless transaction log is exclusively locked). */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_lock_shared(struct mail_index *index, bool update_index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int *lock_id_r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Returns 0 = ok, -1 = error. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_lock_exclusive(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int *lock_id_r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_unlock(struct mail_index *index, unsigned int lock_id);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Returns TRUE if given lock_id is valid. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenbool mail_index_is_locked(struct mail_index *index, unsigned int lock_id);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_lock_fd(struct mail_index *index, const char *path, int fd,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int lock_type, unsigned int timeout_secs,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct file_lock **lock_r);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Reopen index file if it has changed. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_reopen_if_needed(struct mail_index *index);
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Map index file to memory, replacing the previous mapping for index.
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen Returns 1 = ok, 0 = corrupted, -1 = error. If index needs fscking, it
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen returns 1 but sets index->fsck = TRUE. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_map(struct mail_index *index, bool force);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Read the latest available header. Normally this is pretty much the same as
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen calling mail_index_map(), but with mmap_disable the header can be generated
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen by reading just log files, so eg. log_file_*_offset values can be wrong.
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen Returns 1 = ok, 0 = EOF, -1 = error. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_get_latest_header(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_index_header *hdr_r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen/* Unreference given mapping and unmap it if it's dropped to zero. */
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenvoid mail_index_unmap(struct mail_index *index, struct mail_index_map **map);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstruct mail_index_map *
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenmail_index_map_clone(const struct mail_index_map *map,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen uint32_t new_record_size);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenuint32_t mail_index_map_lookup_ext(struct mail_index_map *map,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen const char *name);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenuint32_t
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenmail_index_map_register_ext(struct mail_index *index,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct mail_index_map *map, const char *name,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen uint32_t hdr_offset, uint32_t hdr_size,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen uint32_t record_offset, uint32_t record_size,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen uint32_t record_align, uint32_t reset_id);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenint mail_index_map_get_ext_idx(struct mail_index_map *map,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen uint32_t ext_id, uint32_t *idx_r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenconst struct mail_index_ext *
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenmail_index_view_get_ext(struct mail_index_view *view, uint32_t ext_id);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenvoid mail_index_view_recalc_counters(struct mail_index_view *view);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenint mail_index_map_parse_keywords(struct mail_index *index,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct mail_index_map *map);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenint mail_index_fix_header(struct mail_index *index, struct mail_index_map *map,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct mail_index_header *hdr, const char **error_r);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenbool mail_index_is_ext_synced(struct mail_transaction_log_view *log_view,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct mail_index_map *map);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_view_transaction_ref(struct mail_index_view *view);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_view_transaction_unref(struct mail_index_view *view);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_set_inconsistent(struct mail_index *index);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_set_error(struct mail_index *index, const char *fmt, ...)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen __attr_format__(2, 3);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* "%s failed with index file %s: %m" */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_set_syscall_error(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const char *function);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* "%s failed with file %s: %m" */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_file_set_syscall_error(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const char *filepath,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const char *function);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenuint32_t mail_index_uint32_to_offset(uint32_t offset);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenuint32_t mail_index_offset_to_uint32(uint32_t offset);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#endif
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen