mail-transaction-log-view.c revision ccb77e2f63626ec46e5745ef4f38baa8e8e504fc
/* Copyright (C) 2003-2004 Timo Sirainen */
#include "lib.h"
#include "array.h"
#include "mail-index-private.h"
#include "mail-transaction-log-private.h"
#include "mail-transaction-util.h"
struct mail_transaction_log_view {
struct mail_transaction_log *log;
struct mail_transaction_log_view *next;
struct mail_transaction_header tmp_hdr;
/* a list of log files we've referenced. we have to keep this list
explicitly because more files may be added into the linked list
at any time. */
unsigned int broken:1;
};
struct mail_transaction_log_view *
{
struct mail_transaction_log_view *view;
return view;
}
static void
{
struct mail_transaction_log_file *const *files;
unsigned int i, count;
for (i = 0; i < count; i++)
}
{
struct mail_transaction_log_view **p;
if (*p == view) {
break;
}
}
}
{
struct mail_transaction_log_view *view;
}
int
{
int ret;
/* transaction log is closed already. this log view shouldn't
be used anymore. */
return -1;
}
if (min_file_seq == 0) {
/* new index, transaction file not synced yet */
min_file_seq = 1;
min_file_offset = 0;
if (max_file_seq == 0) {
}
}
/* we can skip this */
min_file_offset = 0;
if (min_file_seq > max_file_seq) {
/* empty view */
}
}
/* find the oldest log file first. */
if (ret <= 0)
return ret;
if (min_file_offset == 0) {
/* this could happen if internal transactions haven't yet been
committed but external are. just assume we're at the
beginning. */
}
/* log file offset is probably corrupted in the index file. */
"file_seq=%u, min_file_offset (%"PRIuUOFF_T
return -1;
}
if (ret <= 0)
return ret;
/* see if we could find the missing file */
if (ret <= 0) {
if (ret < 0)
return -1;
/* not found / corrupted */
}
}
/* we just wanted to sync everything */
break;
}
/* missing files in the middle */
return 0;
}
if (ret <= 0)
return ret;
}
/* we have all of them. update refcounts. */
/* reference all used files */
}
view->prev_file_seq = 0;
view->prev_file_offset = 0;
return 1;
}
void
{
}
void
const char *fmt, ...)
{
t_push();
t_pop();
}
bool
{
}
static int
const struct mail_transaction_header **hdr_r,
const void **data_r)
{
const struct mail_transaction_header *hdr;
struct mail_transaction_log_file *file;
const struct mail_transaction_type_map *type_rec;
const void *data;
unsigned int record_size;
return 0;
/* prev_file_offset should point to beginning of previous log record.
when we reach EOF, it should be left there, not to beginning of the
next file. */
/* last file */
/* we're all finished */
return 0;
}
/* end of file, go to next one */
return 0;
}
"offset points outside file "
return -1;
}
record_size = 0;
} else {
else {
"unknown record type 0x%x",
return -1;
}
}
"record size too small (type=0x%x, "
return -1;
}
"record size wrong (type 0x%x, "
return -1;
}
"record size too large (type=0x%x, "
return -1;
}
"found expunge without protection mask");
return -1;
}
"extra bits in header type: 0x%x",
return -1;
const struct mail_transaction_ext_intro *intro;
uint32_t i;
for (i = 0; i < hdr_size; ) {
/* should be just extra padding */
break;
}
"extension intro: name_size too large");
return -1;
}
}
}
return 1;
}
const struct mail_transaction_header **hdr_r,
{
const struct mail_transaction_header *hdr;
const void *data;
int ret = 0;
return -1;
/* looks like this is within our mask, but expunge
protection may mess up the check. */
break;
}
/* we don't want this record */
append isn't in mask */
}
if (ret < 0) {
return -1;
}
if (ret == 0)
return 0;
/* hide expunge protection */
}
return 1;
}