mail-index-private.h revision 190237ce467d2389dfb809874b0fec86d3c7968d
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* How many seconds to wait a lock for index file. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Index file is grown exponentially when we're adding less than this many
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
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainen PTR_OFFSET((map)->records, (idx) * (map)->hdr.record_size))
03fa2d644be0a9274e7e94fb4835cc374c539264Timo Sirainentypedef int mail_index_expunge_handler_t(struct mail_index_sync_map_ctx *ctx,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainentypedef int mail_index_sync_handler_t(struct mail_index_sync_map_ctx *ctx,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainentypedef void mail_index_sync_lost_handler_t(struct mail_index *index);
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[] */
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen /* unsigned char name[name_size] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* unsigned char data[hdr_size] (starting 64bit aligned) */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* struct mail_index_keyword_header_rec[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* char name[][] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t name_offset; /* relative to beginning of name[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_expunge_handler_t *expunge_handler;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void *records; /* struct mail_index_record[] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(extensions, struct mail_index_ext);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen ARRAY_DEFINE(ext_id_map, uint32_t); /* index -> file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(keyword_idx_map, unsigned int); /* file -> index */
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 unsigned int write_atomic:1; /* copy to new file and rename() */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(extensions, struct mail_index_registered_ext);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(sync_lost_handlers, mail_index_sync_lost_handler_t *);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen int lock_type, shared_lock_count, excl_lock_count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int lock_id;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* These are typically same as map->hdr->log_file_*, but with
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mmap_disable we may have synced more than index */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct hash_table *keywords_hash; /* name -> idx */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* Module-specific contexts. See mail_index_module_id. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_DEFINE(mail_index_module_contexts, void);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Add/replace sync handler for specified extra record. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_register_expunge_handler(struct mail_index *index,
36a687c1ed3ce55520bdf28cd2fa1f653360068dTimo Sirainenvoid mail_index_unregister_expunge_handler(struct mail_index *index,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_unregister_sync_handler(struct mail_index *index,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_register_sync_lost_handler(struct mail_index *index,
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainenvoid mail_index_unregister_sync_lost_handler(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_write_base_header(struct mail_index *index,
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/* 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 Sirainenint mail_index_lock_fd(struct mail_index *index, const char *path, int fd,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Reopen index file if it has changed. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_reopen_if_needed(struct mail_index *index);
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,
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 Sirainenmail_index_map_clone(const struct mail_index_map *map,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenuint32_t mail_index_map_lookup_ext(struct mail_index_map *map,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen const char *name);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenmail_index_map_register_ext(struct mail_index *index,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenint mail_index_map_get_ext_idx(struct mail_index_map *map,
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 Sirainenint mail_index_map_parse_keywords(struct mail_index *index,
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,
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 Sirainenvoid mail_index_set_inconsistent(struct mail_index *index);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_set_error(struct mail_index *index, const char *fmt, ...)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* "%s failed with index file %s: %m" */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_set_syscall_error(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* "%s failed with file %s: %m" */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_index_file_set_syscall_error(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenuint32_t mail_index_uint32_to_offset(uint32_t offset);