doveadm-dump-log.c revision de9d79337eca11a7f9c1cd476c74dfe4f09a4bd7
/* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "hex-binary.h"
#include "mail-index-private.h"
#include "mail-transaction-log.h"
#include "doveadm-dump.h"
#include <stdio.h>
static struct mail_transaction_ext_intro prev_intro;
{
struct mail_transaction_log_header hdr;
}
}
printf("initial modseq = %llu\n",
(unsigned long long)hdr.initial_modseq);
}
static bool
{
/* ignore expunge requests */
break;
}
case MAIL_TRANSACTION_APPEND:
/* these changes increase modseq */
return TRUE;
}
return FALSE;
}
static const char *log_record_type(unsigned int type)
{
const char *name;
switch (type & MAIL_TRANSACTION_TYPE_MASK) {
name = "expunge";
break;
name = "expunge-guid";
break;
case MAIL_TRANSACTION_APPEND:
name = "append";
break;
name = "flag-update";
break;
name = "header-update";
break;
name = "ext-intro";
break;
name = "ext-reset";
break;
name = "ext-hdr";
break;
name = "ext-hdr32";
break;
name = "ext-rec";
break;
name = "keyword-update";
break;
name = "keyword-reset";
break;
name = "ext-atomic-inc";
break;
name = "modseq-update";
break;
name = "index-deleted";
break;
name = "index-undeleted";
break;
default:
break;
}
if (type & MAIL_TRANSACTION_EXTERNAL)
return name;
}
{
size_t i;
for (i = 0; i < size; i++)
if (size == 4) {
printf(" (dec=%u)", *n);
}
}
{
size_t i;
switch (size) {
case 1: {
printf("%u", *n);
break;
}
case 2: {
break;
}
case 4: {
break;
}
case 8: {
break;
}
default:
for (i = 0; i < size; i++)
}
}
sizeof(((struct mail_index_header *)0)->field) }
static struct {
const char *name;
} header_fields[] = {
};
static void log_header_update(const struct mail_transaction_header_update *u)
{
const void *data = u + 1;
unsigned int i;
while (size > 0) {
/* don't bother trying to handle header updates that include
unknown/unexpected fields offsets/sizes */
for (i = 0; i < N_ELEMENTS(header_fields); i++) {
break;
}
if (i == N_ELEMENTS(header_fields)) {
printf("\n");
break;
}
printf("\n");
}
}
{
printf(" - uids=");
}
printf("\n");
break;
}
printf(")\n");
}
break;
}
case MAIL_TRANSACTION_APPEND: {
printf(" - uids=");
printf(",");
}
printf("\n");
break;
}
case MAIL_TRANSACTION_FLAG_UPDATE: {
const struct mail_transaction_flag_update *u = data;
printf(" - uids=%u-%u (flags +%x-%x)\n",
}
break;
}
case MAIL_TRANSACTION_HEADER_UPDATE: {
const struct mail_transaction_header_update *u = data;
break;
}
case MAIL_TRANSACTION_EXT_INTRO: {
prev_intro = *intro;
*modseq = 1;
}
break;
}
case MAIL_TRANSACTION_EXT_RESET: {
break;
}
case MAIL_TRANSACTION_EXT_HDR_UPDATE: {
const struct mail_transaction_ext_hdr_update *u = data;
printf("\n");
break;
}
const struct mail_transaction_ext_hdr_update32 *u = data;
printf("\n");
break;
}
case MAIL_TRANSACTION_EXT_REC_UPDATE: {
printf("\n");
}
break;
}
case MAIL_TRANSACTION_EXT_ATOMIC_INC: {
else
}
break;
}
case MAIL_TRANSACTION_KEYWORD_UPDATE: {
const struct mail_transaction_keyword_update *u = data;
unsigned int uid_offset;
printf(" - modify=%d, name=%.*s, uids=",
uid_offset = sizeof(*u) + u->name_size +
size -= uid_offset;
}
printf("\n");
break;
}
case MAIL_TRANSACTION_KEYWORD_RESET: {
const struct mail_transaction_keyword_reset *u = data;
printf(" - uids=");
}
printf("\n");
break;
}
case MAIL_TRANSACTION_MODSEQ_UPDATE: {
rec->modseq_low32);
}
break;
}
break;
default:
break;
}
}
{
struct mail_transaction_header hdr;
unsigned int orig_size;
if (ret == 0)
return 0;
}
"type=%s, size=broken (%x)\n",
return 0;
}
*modseq += 1;
}
printf("\n");
}
} else {
}
return 1;
}
{
if (fd < 0)
do {
T_BEGIN {
} T_END;
} while (ret > 0);
}
static bool test_dump_log(const char *path)
{
struct mail_transaction_log_header hdr;
const char *p;
int fd;
if (p == NULL)
p = path;
p = strstr(p, ".log");
return FALSE;
if (fd == -1)
return FALSE;
return ret;
}
struct doveadm_cmd_dump doveadm_cmd_dump_log = {
"log",
};