/usr/include/dovecot/mail-index-private.h is in dovecot-dev 1:2.2.9-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 | #ifndef MAIL_INDEX_PRIVATE_H
#define MAIL_INDEX_PRIVATE_H
#include "file-lock.h"
#include "mail-index.h"
#include "mail-index-util.h"
#include "mail-index-view-private.h"
#include "mail-index-transaction-private.h"
#include <sys/stat.h>
struct mail_transaction_header;
struct mail_transaction_log_view;
struct mail_index_sync_map_ctx;
/* How large index files to mmap() instead of reading to memory. */
#define MAIL_INDEX_MMAP_MIN_SIZE (1024*64)
/* How many times to retry opening index files if read/fstat returns ESTALE.
This happens with NFS when the file has been deleted (ie. index file was
rewritten by another computer than us). */
#define MAIL_INDEX_ESTALE_RETRY_COUNT NFS_ESTALE_RETRY_COUNT
/* Large extension header sizes are probably caused by file corruption, so
try to catch them by limiting the header size. */
#define MAIL_INDEX_EXT_HEADER_MAX_SIZE (1024*1024*16-1)
/* Write to main index file when bytes-to-be-read-from-log is between these
values. */
#define MAIL_INDEX_MIN_WRITE_BYTES (1024*8)
#define MAIL_INDEX_MAX_WRITE_BYTES (1024*128)
#define MAIL_INDEX_IS_IN_MEMORY(index) \
((index)->dir == NULL)
#define MAIL_INDEX_MAP_IS_IN_MEMORY(map) \
((map)->rec_map->mmap_base == NULL)
#define MAIL_INDEX_MAP_IDX(map, idx) \
((struct mail_index_record *) \
PTR_OFFSET((map)->rec_map->records, (idx) * (map)->hdr.record_size))
#define MAIL_TRANSACTION_FLAG_UPDATE_IS_INTERNAL(u) \
((((u)->add_flags | (u)->remove_flags) & MAIL_INDEX_FLAGS_MASK) == 0 && \
(u)->modseq_inc_flag == 0)
#define MAIL_INDEX_EXT_KEYWORDS "keywords"
typedef int mail_index_expunge_handler_t(struct mail_index_sync_map_ctx *ctx,
uint32_t seq, const void *data,
void **sync_context, void *context);
typedef int mail_index_sync_handler_t(struct mail_index_sync_map_ctx *ctx,
uint32_t seq, void *old_data,
const void *new_data, void **context);
typedef void mail_index_sync_lost_handler_t(struct mail_index *index);
#define MAIL_INDEX_HEADER_SIZE_ALIGN(size) \
(((size) + 7) & ~7)
struct mail_index_ext {
const char *name;
uint32_t index_idx; /* index ext_id */
uint32_t reset_id;
uint32_t ext_offset; /* points to beginning of mail_index_ext_header */
uint32_t hdr_offset; /* points to mail_index_ext_header.data[] */
uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
uint16_t record_offset;
uint16_t record_size;
uint16_t record_align;
};
struct mail_index_ext_header {
uint32_t hdr_size; /* size of data[] */
uint32_t reset_id;
uint16_t record_offset;
uint16_t record_size;
uint16_t record_align;
uint16_t name_size;
/* unsigned char name[name_size] */
/* unsigned char data[hdr_size] (starting 64bit aligned) */
};
struct mail_index_keyword_header {
uint32_t keywords_count;
/* struct mail_index_keyword_header_rec[] */
/* char name[][] */
};
struct mail_index_keyword_header_rec {
uint32_t unused; /* for backwards compatibility */
uint32_t name_offset; /* relative to beginning of name[] */
};
enum mail_index_sync_handler_type {
MAIL_INDEX_SYNC_HANDLER_FILE = 0x01,
MAIL_INDEX_SYNC_HANDLER_HEAD = 0x02,
MAIL_INDEX_SYNC_HANDLER_VIEW = 0x04
};
struct mail_index_sync_handler {
mail_index_sync_handler_t *callback;
enum mail_index_sync_handler_type type;
};
struct mail_index_registered_ext {
const char *name;
uint32_t index_idx; /* index ext_id */
uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
uint16_t record_size;
uint16_t record_align;
struct mail_index_sync_handler sync_handler;
mail_index_expunge_handler_t *expunge_handler;
void *expunge_context;
unsigned int expunge_handler_call_always:1;
};
struct mail_index_record_map {
ARRAY(struct mail_index_map *) maps;
void *mmap_base;
size_t mmap_size, mmap_used_size;
buffer_t *buffer;
void *records; /* struct mail_index_record[] */
unsigned int records_count;
struct mail_index_map_modseq *modseq;
uint32_t last_appended_uid;
};
struct mail_index_map {
struct mail_index *index;
int refcount;
struct mail_index_header hdr;
const void *hdr_base;
buffer_t *hdr_copy_buf;
pool_t extension_pool;
ARRAY(struct mail_index_ext) extensions;
ARRAY(uint32_t) ext_id_map; /* index -> file */
ARRAY(unsigned int) keyword_idx_map; /* file -> index */
struct mail_index_record_map *rec_map;
};
struct mail_index_module_register {
unsigned int id;
};
union mail_index_module_context {
struct mail_index_module_register *reg;
};
struct mail_index {
char *dir, *prefix;
struct mail_cache *cache;
struct mail_transaction_log *log;
unsigned int open_count;
enum mail_index_open_flags flags;
enum fsync_mode fsync_mode;
enum mail_index_fsync_mask fsync_mask;
mode_t mode;
gid_t gid;
char *gid_origin;
pool_t extension_pool;
ARRAY(struct mail_index_registered_ext) extensions;
uint32_t ext_hdr_init_id;
void *ext_hdr_init_data;
ARRAY(mail_index_sync_lost_handler_t *) sync_lost_handlers;
char *filepath;
int fd;
struct mail_index_map *map;
uint32_t indexid;
unsigned int inconsistency_id;
/* last_read_log_file_* contains the seq/offsets we last read from
the main index file's headers. these are used to figure out when
the main index file should be updated, and if we can update it
by writing on top of it or if we need to recreate it. */
uint32_t last_read_log_file_seq;
uint32_t last_read_log_file_head_offset;
uint32_t last_read_log_file_tail_offset;
struct stat last_read_stat;
/* transaction log head seq/offset when we last fscked */
uint32_t fsck_log_head_file_seq;
uoff_t fsck_log_head_file_offset;
/* syncing will update this if non-NULL */
struct mail_index_transaction_commit_result *sync_commit_result;
int lock_type;
unsigned int lock_id_counter;
enum file_lock_method lock_method;
unsigned int max_lock_timeout_secs;
struct file_lock *file_lock;
struct dotlock *dotlock;
pool_t keywords_pool;
ARRAY_TYPE(keywords) keywords;
HASH_TABLE(char *, void *) keywords_hash; /* name -> unsigned int idx */
uint32_t keywords_ext_id;
uint32_t modseq_ext_id;
unsigned int view_count;
/* Module-specific contexts. */
ARRAY(union mail_index_module_context *) module_contexts;
char *error;
unsigned int nodiskspace:1;
unsigned int index_lock_timeout:1;
unsigned int index_delete_requested:1; /* next sync sets it deleted */
unsigned int index_deleted:1; /* no changes allowed anymore */
unsigned int log_sync_locked:1;
unsigned int readonly:1;
unsigned int mapping:1;
unsigned int syncing:1;
unsigned int need_recreate:1;
unsigned int index_min_write:1;
unsigned int modseqs_enabled:1;
unsigned int initial_create:1;
unsigned int initial_mapped:1;
unsigned int fscked:1;
};
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_create_tmp_file(struct mail_index *index, const char **path_r);
int mail_index_try_open_only(struct mail_index *index);
void mail_index_close_file(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);
void mail_index_flush_read_cache(struct mail_index *index, const char *path,
int fd, bool locked);
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 we mmap()ed the index file, the map is returned locked.
Returns 1 = ok, 0 = corrupted, -1 = error. */
int mail_index_map(struct mail_index *index,
enum mail_index_sync_handler_type type);
/* Unreference given mapping and unmap it if it's dropped to zero. */
void mail_index_unmap(struct mail_index_map **map);
/* Clone a map. The returned map is always in memory. */
struct mail_index_map *mail_index_map_clone(const struct mail_index_map *map);
void mail_index_record_map_move_to_private(struct mail_index_map *map);
/* Move a mmaped map to memory. */
void mail_index_map_move_to_memory(struct mail_index_map *map);
void mail_index_fchown(struct mail_index *index, int fd, const char *path);
bool mail_index_map_lookup_ext(struct mail_index_map *map, const char *name,
uint32_t *idx_r);
uint32_t
mail_index_map_register_ext(struct mail_index_map *map,
const char *name, uint32_t ext_offset,
const struct mail_index_ext_header *ext_hdr);
bool 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);
void mail_index_map_lookup_seq_range(struct mail_index_map *map,
uint32_t first_uid, uint32_t last_uid,
uint32_t *first_seq_r,
uint32_t *last_seq_r);
int mail_index_map_check_header(struct mail_index_map *map);
bool mail_index_check_header_compat(struct mail_index *index,
const struct mail_index_header *hdr,
uoff_t file_size);
int mail_index_map_parse_extensions(struct mail_index_map *map);
int mail_index_map_parse_keywords(struct mail_index_map *map);
void mail_index_map_init_extbufs(struct mail_index_map *map,
unsigned int initial_count);
int mail_index_map_ext_get_next(struct mail_index_map *map,
unsigned int *offset,
const struct mail_index_ext_header **ext_hdr_r,
const char **name_r);
int mail_index_map_ext_hdr_check(const struct mail_index_header *hdr,
const struct mail_index_ext_header *ext_hdr,
const char *name, const char **error_r);
unsigned int mail_index_map_ext_hdr_offset(unsigned int name_len);
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_fsck_locked(struct mail_index *index);
void mail_index_set_error(struct mail_index *index, const char *fmt, ...)
ATTR_FORMAT(2, 3);
/* "%s failed with index file %s: %m" */
void mail_index_set_syscall_error(struct mail_index *index,
const char *function);
/* "%s failed with file %s: %m" */
void mail_index_file_set_syscall_error(struct mail_index *index,
const char *filepath,
const char *function);
#endif
|