mail-index-data.c revision d5aa01c4d7cc8b099f47cf011cba850b1759eb2d
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Copyright (C) 2002 Timo Sirainen */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ((off_t) ((char *) (rec) - (char *) ((data)->mmap_base)))
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Never compress the file if it's smaller than this (50kB) */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Compress the file when deleted space reaches 20% of total size */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic int mmap_update(MailIndexData *data, off_t pos, unsigned int size)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (!data->dirty_mmap || (size != 0 && pos+size <= data->mmap_length))
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter (void)munmap(data->mmap_base, data->mmap_length);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter data->mmap_base = mmap_rw_file(data->fd, &data->mmap_length);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(data->index, "index data: mmap() failed with "
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter } else if (data->mmap_length < sizeof(MailIndexDataHeader)) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(data->index, "index data: truncated data "
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char *path;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter path = t_strconcat(index->filepath, DATA_FILE_PREFIX, NULL);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* doesn't exist, rebuild the index */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(index, "Can't open index data %s: %m", path);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (!mmap_update(data, 0, sizeof(MailIndexDataHeader))) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* verify that this really is the data file for wanted index */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(index, "IndexID mismatch with file %s", path);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic const char *init_data_file(MailIndex *index, int fd,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* write header */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(index, "Error writing to temp index data "
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter /* move temp file into .data file, deleting old one
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if it already exists */
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter realpath = t_strconcat(index->filepath, DATA_FILE_PREFIX, NULL);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter index_set_error(index, "rename(%s, %s) failed: %m",
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter fd = mail_index_create_temp_file(index, &temppath);
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter (void)munmap(data->mmap_base, data->mmap_length);
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter if (ftruncate(data->fd, sizeof(MailIndexDataHeader)) == -1) {
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter index_set_error(data->index, "ftruncate() failed for data file "
c2cc119de8eac712c040b3993f41c967ff2278deStef Walter index_set_error(data->index, "lseek() failed for data file "
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter if (write_full(data->fd, &hdr, sizeof(hdr)) < 0) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(data->index, "write() failed for data file "
c2cc119de8eac712c040b3993f41c967ff2278deStef Waltervoid mail_index_data_new_data_notify(MailIndexData *data)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walteroff_t mail_index_data_append(MailIndexData *data, const void *buffer,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(data->index, "lseek() failed with file %s: %m",
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter index_set_error(data->index, "Error appending to file %s: %m",
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterint mail_index_data_add_deleted_space(MailIndexData *data,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter unsigned int data_size)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter i_assert(data->index->lock_type == MAIL_LOCK_EXCLUSIVE);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter /* make sure the whole file is mmaped */
return TRUE;
return FALSE;
return FALSE;
return TRUE;
return NULL;
return NULL;
(unsigned long) max_pos,
return NULL;
(unsigned long) pos,
(unsigned long) pos,
return rec;
return NULL;
return NULL;
return NULL;
(unsigned long) pos,
return NULL;
return rec;
return TRUE;
return FALSE;
return NULL;