mail-index.c revision 369a1084c500a9df7448ffa9409ce32e42060bc2
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi/* Copyright (C) 2003-2004 Timo Sirainen */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomiunsigned int mail_index_module_id = 0;
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainenstatic int mail_index_try_open_only(struct mail_index *index);
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainenstatic void mail_index_create_in_memory(struct mail_index *index,
285f3c4cf828ebe9ff345080aa1df3755613af29Timo Sirainenstruct mail_index *mail_index_alloc(const char *dir, const char *prefix)
c466bbccb4b8b0026aea13540ebdef3bddbd67ddAki Tuomi index->extension_pool = pool_alloconly_create("extension", 512);
c466bbccb4b8b0026aea13540ebdef3bddbd67ddAki Tuomi p_array_init(&index->extensions, index->extension_pool, 5);
c466bbccb4b8b0026aea13540ebdef3bddbd67ddAki Tuomi array_create(&index->mail_index_module_contexts, default_pool,
c466bbccb4b8b0026aea13540ebdef3bddbd67ddAki Tuomi mail_index_ext_register(index, "keywords", 128, 2, 1);
c466bbccb4b8b0026aea13540ebdef3bddbd67ddAki Tuomi index->keywords_pool = pool_alloconly_create("keywords", 512);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi hash_create(default_pool, index->keywords_pool, 0,
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainenvoid mail_index_set_permissions(struct mail_index *index,
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomiuint32_t mail_index_ext_register(struct mail_index *index, const char *name,
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi const struct mail_index_registered_ext *extensions;
7a8ef11587fd50d5888223fc3d91911775a21ba5Aki Tuomi unsigned int i, ext_count;
7a8ef11587fd50d5888223fc3d91911775a21ba5Aki Tuomi extensions = array_get(&index->extensions, &ext_count);
7a8ef11587fd50d5888223fc3d91911775a21ba5Aki Tuomi /* see if it's already there */
7a8ef11587fd50d5888223fc3d91911775a21ba5Aki Tuomi for (i = 0; i < ext_count; i++) {
7d500ecf27acc5b65615ee9e72d6da6bacf799d2Timo Sirainen rext.name = p_strdup(index->extension_pool, name);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomivoid mail_index_register_expunge_handler(struct mail_index *index,
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi rext = array_idx_modifiable(&index->extensions, ext_id);
6a8c95b0693c93601e948e06bfe1f89abdd43307Timo Sirainen i_assert(rext->expunge_handler == NULL || rext->expunge_handler == cb);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomivoid mail_index_unregister_expunge_handler(struct mail_index *index,
6a8c95b0693c93601e948e06bfe1f89abdd43307Timo Sirainen rext = array_idx_modifiable(&index->extensions, ext_id);
6a8c95b0693c93601e948e06bfe1f89abdd43307Timo Sirainenvoid mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
3b759465ad5088a8d491b49c9ebb0dc9d3f66f7eTimo Sirainen rext = array_idx_modifiable(&index->extensions, ext_id);
36a052b7bd94ccb47abbb6b15c1380f03780ba20Timo Sirainen i_assert(rext->sync_handler.callback == NULL);
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainenvoid mail_index_unregister_sync_handler(struct mail_index *index,
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen rext = array_idx_modifiable(&index->extensions, ext_id);
d9a7e950a9cd21f2b4a90ec7759fca9e8fcc7995Timo Sirainen i_assert(rext->sync_handler.callback != NULL);
3b759465ad5088a8d491b49c9ebb0dc9d3f66f7eTimo Sirainenvoid mail_index_register_sync_lost_handler(struct mail_index *index,
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen array_append(&index->sync_lost_handlers, &cb, 1);
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainenvoid mail_index_unregister_sync_lost_handler(struct mail_index *index,
3b759465ad5088a8d491b49c9ebb0dc9d3f66f7eTimo Sirainen mail_index_sync_lost_handler_t *const *handlers;
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen unsigned int i, count;
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen handlers = array_get(&index->sync_lost_handlers, &count);
36a052b7bd94ccb47abbb6b15c1380f03780ba20Timo Sirainen for (i = 0; i < count; i++) {
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen array_delete(&index->sync_lost_handlers, i, 1);
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainenstatic void mail_index_map_init_extbufs(struct mail_index_map *map,
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen ((sizeof(map->extensions) + BUFFER_APPROX_SIZE) * 2)
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen sizeof(struct mail_index_ext) + sizeof(uint32_t))
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen /* try to use the existing pool's size for initial_count so
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen we don't grow it unneededly */
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen size = p_get_max_easy_alloc_size(map->extension_pool);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if (size > EXT_GLOBAL_ALLOC_SIZE + EXT_PER_ALLOC_SIZE) {
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi p_array_init(&map->extensions, map->extension_pool, initial_count);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi p_array_init(&map->ext_id_map, map->extension_pool, initial_count);
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainenuint32_t mail_index_map_lookup_ext(struct mail_index_map *map, const char *name)
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen unsigned int i, size;
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen extensions = array_get(&map->extensions, &size);
55accf49e32ff93bfdd92961cb54ccc8c329147cTimo Sirainen for (i = 0; i < size; i++) {
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomimail_index_map_register_ext(struct mail_index *index,
c5e46dba179864f6f1adf196d46e7a0371b11914Josef 'Jeff' Sipek uint32_t record_align, uint32_t reset_id)
05128fda80748e107bccdece0a3d23551e99e8f3Timo Sirainen i_assert(mail_index_map_lookup_ext(map, name) == (uint32_t)-1);
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi ext->index_idx = mail_index_ext_register(index, name, hdr_size,
db8b229230860a6c12daa0017a49396986368897Aki Tuomi /* Update index ext_id -> map ext_id mapping. Fill non-used
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi ext_ids with (uint32_t)-1 */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi while (array_count(&map->ext_id_map) < ext->index_idx)
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi array_idx_set(&map->ext_id_map, ext->index_idx, &idx);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomistatic bool size_check(size_t *size_left, size_t size)
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi size_t size = sizeof(struct mail_index_ext_header) + name_len;
db8b229230860a6c12daa0017a49396986368897Aki Tuomistatic int mail_index_parse_extensions(struct mail_index *index,
db8b229230860a6c12daa0017a49396986368897Aki Tuomi unsigned int i, old_count;
79ec87ea6861e2dd447f69ab44a7cc4e4fce3fddAki Tuomi const char *name;
79ec87ea6861e2dd447f69ab44a7cc4e4fce3fddAki Tuomi /* extension headers always start from 64bit offsets, so if base header
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi doesn't happen to be 64bit aligned we'll skip some bytes */
4afc67eb96f8d6b7dc94d63d3c7fe4f556c4fceeTimo Sirainen offset = MAIL_INDEX_HEADER_SIZE_ALIGN(map->hdr.base_header_size);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if (offset >= map->hdr.header_size && map->extension_pool == NULL) {
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen /* nothing to do, skip allocatations and all */
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen mail_index_map_init_extbufs(map, old_count + 5);
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen for (i = 0; i < old_count; i++)
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi ext_hdr = CONST_PTR_OFFSET(map->hdr_base, offset);
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi /* Extension header contains:
db8b229230860a6c12daa0017a49396986368897Aki Tuomi - struct mail_index_ext_header
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi - name (not 0-terminated)
db8b229230860a6c12daa0017a49396986368897Aki Tuomi - 64bit alignment padding
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi - extension header contents
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi - 64bit alignment padding
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi !size_check(&size_left, get_align(ext_hdr->name_size)) ||
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi mail_index_set_error(index, "Corrupted index file %s: "
1e8a6a8708b612eee65f83ef6874aab94b15eb50Timo Sirainen "Header extension goes outside header",
c5e46dba179864f6f1adf196d46e7a0371b11914Josef 'Jeff' Sipek offset += ext_hdr->name_size + get_align(ext_hdr->name_size);
1e8a6a8708b612eee65f83ef6874aab94b15eb50Timo Sirainen name = t_strndup(CONST_PTR_OFFSET(map->hdr_base, name_offset),
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen if (mail_index_map_lookup_ext(map, name) != (uint32_t)-1) {
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen mail_index_set_error(index, "Corrupted index file %s: "
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen "Duplicate header extension %s",
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen if ((ext_hdr->record_offset % ext_hdr->record_align) != 0 ||
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen (map->hdr.record_size % ext_hdr->record_align) != 0) {
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen mail_index_set_error(index, "Corrupted index file %s: "
2029c2cb37d7308e74329c9a15b6cf07a3468314Timo Sirainen "Record field %s alignmentation %u not used",
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi offset += MAIL_INDEX_HEADER_SIZE_ALIGN(ext_hdr->hdr_size);
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomibool mail_index_keyword_lookup(struct mail_index *index,
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi unsigned int *idx_r)
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi /* keywords_hash keeps a name => index mapping of keywords.
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi Keywords are never removed from it, so the index values are valid
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi for the lifetime of the mail_index. */
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi if (hash_lookup_full(index->keywords_hash, keyword, NULL, &value)) {
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi keyword = keyword_dup = p_strdup(index->keywords_pool, keyword);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi hash_insert(index->keywords_hash, keyword_dup, POINTER_CAST(*idx_r));
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomiint mail_index_map_parse_keywords(struct mail_index *index,
235ef8cd3865984cc27f88a18d14ea98adb53f09Aki Tuomi const struct mail_index_keyword_header_rec *kw_rec;
235ef8cd3865984cc27f88a18d14ea98adb53f09Aki Tuomi const char *name;
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi ext_id = mail_index_map_lookup_ext(map, "keywords");
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi /* Extension header contains:
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi - struct mail_index_keyword_header
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi - struct mail_index_keyword_header_rec * keywords_count
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi - const char names[] * keywords_count
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi kw_hdr = CONST_PTR_OFFSET(map->hdr_base, ext->hdr_offset);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi name = (const char *)(kw_rec + kw_hdr->keywords_count);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi old_count = !array_is_created(&map->keyword_idx_map) ? 0 :
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi /* Keywords can only be added into same mapping. Removing requires a
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi new mapping (recreating the index file) */
a18ba96c4ecebc9386b92385c546c868f1eae82eTimo Sirainen /* nothing changed */
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo Sirainen /* make sure the header is valid */
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo Sirainen mail_index_set_error(index, "Corrupted index file %s: "
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo Sirainen "Keywords removed unexpectedly",
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if ((size_t)(name - (const char *)kw_hdr) > ext->hdr_size) {
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi mail_index_set_error(index, "Corrupted index file %s: "
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi "keywords_count larger than header size",
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi name_area_end_offset = (const char *)kw_hdr + ext->hdr_size - name;
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if (kw_rec[i].name_offset > name_area_end_offset) {
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi mail_index_set_error(index, "Corrupted index file %s: "
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi "name_offset points outside allocated header",
79ec87ea6861e2dd447f69ab44a7cc4e4fce3fddAki Tuomi mail_index_set_error(index, "Corrupted index file %s: "
79ec87ea6861e2dd447f69ab44a7cc4e4fce3fddAki Tuomi "Keyword header doesn't end with NUL",
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi /* create file -> index mapping */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi i_array_init(&map->keyword_idx_map, kw_hdr->keywords_count);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi /* Check that existing headers are still the same. It's behind DEBUG
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi since it's pretty useless waste of CPU normally. */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi for (i = 0; i < array_count(&map->keyword_idx_map); i++) {
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi const char *keyword = name + kw_rec[i].name_offset;
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi const unsigned int *old_idx;
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if (!mail_index_keyword_lookup(index, keyword, FALSE, &idx) ||
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi mail_index_set_error(index, "Corrupted index file %s: "
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi "Keywords changed unexpectedly",
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi /* Register the newly seen keywords */
6a8c95b0693c93601e948e06bfe1f89abdd43307Timo Sirainen const char *keyword = name + kw_rec[i].name_offset;
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi unsigned int idx;
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi (void)mail_index_keyword_lookup(index, keyword, TRUE, &idx);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomiconst ARRAY_TYPE(keywords) *mail_index_get_keywords(struct mail_index *index)
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi /* Make sure all the keywords are in index->keywords. It's quick to do
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if nothing has changed. */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi (void)mail_index_map_parse_keywords(index, index->map);
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomistatic int mail_index_check_header(struct mail_index *index,
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi enum mail_index_header_compat_flags compat_flags = 0;
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi if (hdr->major_version != MAIL_INDEX_MAJOR_VERSION) {
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi /* major version change - handle silently(?) */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi /* architecture change - handle silently(?) */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi /* we've already complained about it */
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi /* following some extra checks that only take a bit of CPU */
0746d8c498e2bb336399c37715d4fef9d64560c7Aki Tuomi if (hdr->uid_validity == 0 && hdr->next_uid != 1) {
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi mail_index_set_error(index, "Corrupted index file %s: "
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi "uid_validity = 0, next_uid = %u",
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if (hdr->record_size < sizeof(struct mail_index_record)) {
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi mail_index_set_error(index, "Corrupted index file %s: "
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi sizeof(struct mail_index_record));
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if (hdr->recent_messages_count > hdr->messages_count ||
aaa1b6bb4cd2d7f8f4e7977d61176ea1c8f7e32bAki Tuomi hdr->deleted_messages_count > hdr->messages_count)
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi if (hdr->first_recent_uid_lowwater > hdr->next_uid ||
1e8a6a8708b612eee65f83ef6874aab94b15eb50Timo Sirainen /* last message's UID must be smaller than next_uid */
14af7be4aa26d55c341cd6efe32bb2add2c39830Aki Tuomi rec = MAIL_INDEX_MAP_IDX(map, map->records_count-1);
1e8a6a8708b612eee65f83ef6874aab94b15eb50Timo Sirainenstatic void mail_index_map_clear(struct mail_index *index,
unsigned int records_count;
int ret;
pos = 0;
if (ret > 0)
return ret;
pos);
if (ret > 0) {
if (ret < 0) {
if (ret == 0) {
&prev_offset);
bool sync_to_index)
const void *tdata;
int ret;
if (sync_to_index) {
MAIL_TRANSACTION_TYPE_MASK) <= 0) {
&skipped)) > 0) {
ret = 0;
&prev_offset);
return ret;
bool sync_to_index)
unsigned int i, count;
int ret;
bool retry;
if (ret != 0)
return ret;
for (i = 0; i < 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;
&pos);
if (ret <= 0) {
if (ret == 0) {
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;
int ret;
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;
int ret = 0;
return 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;