mail-index-private.h revision 8d131435ba4648c8821160ec38d508c97177c715
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;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_transaction_log_view;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_sync_map_ctx;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* How large index files to mmap() instead of reading to memory. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_MMAP_MIN_SIZE (1024*256)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* How many seconds to wait a lock for index file. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_LOCK_SECS 120
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
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define MAIL_INDEX_MAP_IDX(map, idx) \
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ((struct mail_index_record *) \
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen PTR_OFFSET((map)->records, (idx) * (map)->hdr.record_size))
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainentypedef int mail_index_expunge_handler_t(struct mail_index_sync_map_ctx *ctx,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t seq, const void *data,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void **sync_context, void *context);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo 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);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainentypedef void mail_index_sync_lost_handler_t(struct mail_index *index);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo SirainenARRAY_DEFINE_TYPE(seq_array, uint32_t);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo 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;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_size;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t record_align;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint16_t name_size;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* unsigned char name[name_size] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* unsigned char data[hdr_size] (starting 64bit aligned) */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo 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 unused; /* for backwards compatibility */
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);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(ext_id_map, uint32_t); /* index -> file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void *mmap_base;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen size_t mmap_size, mmap_used_size;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo 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 this mapping is written to disk and write_atomic=FALSE,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen write_seq_* specify the message sequence range that needs to be
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen written. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t write_seq_first, write_seq_last;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int keywords_read:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int write_base_header:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int write_ext_header:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int write_atomic:1; /* write to a new file and rename() */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index_module_register {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int id;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenunion mail_index_module_context {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_index_module_register *reg;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_index {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen char *dir, *prefix;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo 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;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t indexid;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* last known log_file_tail_offset in main index file. used for
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen optimizing main index updates. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t last_read_log_file_tail_offset;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int lock_type, shared_lock_count, excl_lock_count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int lock_id;
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 pool_t keywords_pool;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo 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
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* Module-specific contexts. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(module_contexts, union mail_index_module_context *);
bcbca4b66800f0fbfe2643a86d5a6b63d752454dTimo 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 use_excl_dotlocks:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int readonly:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int fsck:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int mapping:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
extern struct mail_index_module_register mail_index_module_register;
/* Add/replace sync handler for specified extra record. */
void mail_index_register_expunge_handler(struct mail_index *index,
uint32_t ext_id, bool call_always,
mail_index_expunge_handler_t *callback,
void *context);
void mail_index_unregister_expunge_handler(struct mail_index *index,
uint32_t ext_id);
void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
mail_index_sync_handler_t *cb,
enum mail_index_sync_handler_type type);
void mail_index_unregister_sync_handler(struct mail_index *index,
uint32_t ext_id);
void mail_index_register_sync_lost_handler(struct mail_index *index,
mail_index_sync_lost_handler_t *cb);
void mail_index_unregister_sync_lost_handler(struct mail_index *index,
mail_index_sync_lost_handler_t *cb);
int mail_index_write_base_header(struct mail_index *index,
const struct mail_index_header *hdr);
int mail_index_create_tmp_file(struct mail_index *index, const char **path_r);
int mail_index_try_open_only(struct mail_index *index);
int mail_index_reopen_if_changed(struct mail_index *index);
/* Update/rewrite the main index file from index->map */
void mail_index_write(struct mail_index *index, bool want_rotate);
/* Returns 0 = ok, -1 = error. */
int mail_index_lock_shared(struct mail_index *index, unsigned int *lock_id_r);
/* Returns 1 = ok, 0 = already locked, -1 = error. */
int mail_index_try_lock_exclusive(struct mail_index *index,
unsigned int *lock_id_r);
void mail_index_unlock(struct mail_index *index, unsigned int lock_id);
/* Returns TRUE if given lock_id is valid. */
bool mail_index_is_locked(struct mail_index *index, unsigned int lock_id);
int mail_index_lock_fd(struct mail_index *index, const char *path, int fd,
int lock_type, unsigned int timeout_secs,
struct file_lock **lock_r);
/* Allocate a new empty map. */
struct mail_index_map *mail_index_map_alloc(struct mail_index *index);
/* Replace index->map with the latest index changes. This may reopen the index
file and/or it may read the latest changes from transaction log. The log is
read up to EOF, but non-synced expunges are skipped.
If mapping required reading the index file, it's shared locked and lock_id
is returned. Otherwise returned lock_id is 0.
Returns 1 = ok, 0 = corrupted, -1 = error. If non-fatal problems were found,
1 is returned but index->fsck=TRUE is set. */
int mail_index_map(struct mail_index *index,
enum mail_index_sync_handler_type type,
unsigned int *lock_id_r);
/* Return the latest index file's header. This should be used only when you
don't want to see later changes from transaction log.
Returns 1 = ok, 0 = corrupted, -1 = error. */
int mail_index_get_last_written_header(struct mail_index *index,
struct mail_index_header *hdr_r);
/* Unreference given mapping and unmap it if it's dropped to zero. */
void mail_index_unmap(struct mail_index *index, struct mail_index_map **map);
struct mail_index_map *mail_index_map_clone(const struct mail_index_map *map);
void mail_index_map_move_to_memory(struct mail_index_map *map);
uint32_t mail_index_map_lookup_ext(struct mail_index_map *map,
const char *name);
uint32_t
mail_index_map_register_ext(struct mail_index *index,
struct mail_index_map *map, const char *name,
uint32_t hdr_offset, uint32_t hdr_size,
uint32_t record_offset, uint32_t record_size,
uint32_t record_align, uint32_t reset_id);
int mail_index_map_get_ext_idx(struct mail_index_map *map,
uint32_t ext_id, uint32_t *idx_r);
const struct mail_index_ext *
mail_index_view_get_ext(struct mail_index_view *view, uint32_t ext_id);
int mail_index_map_parse_keywords(struct mail_index *index,
struct mail_index_map *map);
void mail_index_view_transaction_ref(struct mail_index_view *view);
void mail_index_view_transaction_unref(struct mail_index_view *view);
void mail_index_set_inconsistent(struct mail_index *index);
int mail_index_set_error(struct mail_index *index, const char *fmt, ...)
__attr_format__(2, 3);
/* "%s failed with index file %s: %m" */
int mail_index_set_syscall_error(struct mail_index *index,
const char *function);
/* "%s failed with file %s: %m" */
int mail_index_file_set_syscall_error(struct mail_index *index,
const char *filepath,
const char *function);
uint32_t mail_index_uint32_to_offset(uint32_t offset);
uint32_t mail_index_offset_to_uint32(uint32_t offset);
#endif