mail-index.c revision c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3ae
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Copyright (C) 2003-2004 Timo Sirainen */
eb209d12e3b1cfed564c35cf19fdb1bf7fcc6811Timo Sirainenstatic int mail_index_try_open_only(struct mail_index *index);
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainenstatic void mail_index_create_in_memory(struct mail_index *index,
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainenstruct mail_index *mail_index_alloc(const char *dir, const char *prefix)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen index->extension_pool = pool_alloconly_create("extension", 512);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_CREATE(&index->extensions, index->extension_pool,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_CREATE(&index->expunge_handlers, default_pool,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_CREATE(&index->sync_lost_handlers, default_pool,
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen mail_index_ext_register(index, "keywords", 128, 2, 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen index->keywords_pool = pool_alloconly_create("keywords", 512);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen ARRAY_CREATE(&index->keywords, default_pool, const char *, 16);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen hash_create(default_pool, index->keywords_pool, 0,
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen strcase_hash, (hash_cmp_callback_t *)strcasecmp);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_set_permissions(struct mail_index *index,
58b8a301b7b36047f10a592751094fbed86d6f0cTimo Sirainenuint32_t mail_index_ext_register(struct mail_index *index, const char *name,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct mail_index_registered_ext *extensions;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen unsigned int i, ext_count;
ece0a20249ce26208db3415ba2e79423678856f8Timo Sirainen extensions = array_get(&index->extensions, &ext_count);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* see if it's already there */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < ext_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen rext.name = p_strdup(index->extension_pool, name);
009217abb57a24a4076092e8e4e165545747839eStephan Boschvoid mail_index_register_expunge_handler(struct mail_index *index,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen p = array_idx_modifyable(&index->expunge_handlers, ext_id);
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainenvoid mail_index_unregister_expunge_handler(struct mail_index *index,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen p = array_idx_modifyable(&index->expunge_handlers, ext_id);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenvoid mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen rext = array_idx_modifyable(&index->extensions, ext_id);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen i_assert(rext->sync_handler.callback == NULL);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainenvoid mail_index_unregister_sync_handler(struct mail_index *index,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen rext = array_idx_modifyable(&index->extensions, ext_id);
550d2fe097e95f12e8fa60ef52753ea7fe53d4eaTimo Sirainen i_assert(rext->sync_handler.callback != NULL);
36e091dc733c6cd690c5aae6e411e41adb1eca73Timo Sirainenvoid mail_index_register_sync_lost_handler(struct mail_index *index,
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainen array_append(&index->sync_lost_handlers, &cb, 1);
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenvoid mail_index_unregister_sync_lost_handler(struct mail_index *index,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_sync_lost_handler_t *const *handlers;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen unsigned int i, count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen handlers = array_get(&index->sync_lost_handlers, &count);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < count; i++) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen array_delete(&index->sync_lost_handlers, i, 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void mail_index_map_init_extbufs(struct mail_index_map *map,
sizeof(struct mail_index_ext) +
sizeof(uint32_t));
unsigned int i, size;
for (i = 0; i < size; i++) {
idx = 0;
return idx;
return FALSE;
return TRUE;
unsigned int i, old_count;
const char *name;
for (i = 0; i < old_count; i++)
t_push();
t_pop();
t_pop();
t_pop();
unsigned int *idx_r)
char *keyword_dup;
void *value;
return TRUE;
if (!autocreate) {
return FALSE;
return TRUE;
const char *name;
#ifdef DEBUG
const unsigned int *old_idx;
unsigned int idx;
unsigned int idx;
#ifndef WORDS_BIGENDIAN
sizeof(struct mail_index_record));
unsigned int records_count;
int ret;
if (ret > 0)
return ret;
if (ret > 0) {
if (ret < 0) {
if (ret == 0) {
int sync_to_index)
const void *tdata;
if (sync_to_index) {
MAIL_TRANSACTION_TYPE_MASK) < 0) {
&skipped)) > 0) {
&prev_offset);
if (sync_to_index) {
int sync_to_index)
unsigned int i, count;
if (ret != 0)
return ret;
for (i = 0; i < count; i++)
for (i = 0; i < MAIL_INDEX_ESTALE_RETRY_COUNT; i++) {
return ret;
if (ret <= 0) {
if (ret == 0) {
int ret;
if (ret != 0) {
return ret;
if (ret > 0) {
if (ret < 0)
ret = 0;
else if (ret == 0) {
if (ret <= 0) {
return ret;
int ret;
if (ret > 0)
return ret;
struct mail_index_map *
unsigned int i, count;
for (i = 0; i < count; i++) {
return mem_map;
unsigned int lock_id;
int ret;
*lock_id_r = 0;
if (ret <= 0)
return ret;
if (ret == 0) {
*lock_id_r = 0;
return ret;
const char *path;
int fd;
return fd;
const char *path;
int ret;
if (ret != 0) {
/* create it fully in index.tmp first */
if (ret == 0) {
if (ret < 0) {
return ret;
#ifndef WORDS_BIGENDIAN
unsigned int lock_id = 0;
if (ret > 0)
else if (ret == 0) {
} else if (ret < 0)
if (lock_id != 0) {
lock_id = 0;
if (lock_id == 0) {
int i = 0, ret;
if (ret <= 0)
if (ret == 0) {
if (ret <= 0)
return ret;
ret = 0;
if (ret > 0)
else if (ret == 0) {
if (ret == 0) {
if (lock_id != 0)
if (ret == 0) {
return ret;
unsigned int lock_id;
int ret;
const char *function)
const char *filepath,
const char *function)
return MAIL_INDEX_ERROR_DISKSPACE;
return MAIL_INDEX_ERROR_INTERNAL;
return MAIL_INDEX_ERROR_NONE;