[dovecot-cvs] dovecot/src/lib-storage/index/mbox Makefile.am, 1.5,
1.6 mbox-md5.c, NONE, 1.1 mbox-md5.h, NONE,
1.1 mbox-sync-parse.c, 1.32, 1.33 mbox-sync-md5.c, 1.1,
NONE mbox-sync-private.h, 1.39, 1.40
cras at dovecot.org
cras at dovecot.org
Wed Dec 15 20:43:42 EET 2004
Update of /var/lib/cvs/dovecot/src/lib-storage/index/mbox
In directory talvi:/tmp/cvs-serv23500
Modified Files:
Makefile.am mbox-sync-parse.c mbox-sync-private.h
Added Files:
mbox-md5.c mbox-md5.h
Removed Files:
mbox-sync-md5.c
Log Message:
Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Index: Makefile.am
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/mbox/Makefile.am,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- Makefile.am 14 Dec 2004 02:44:33 -0000 1.5
+++ Makefile.am 15 Dec 2004 18:43:40 -0000 1.6
@@ -16,8 +16,8 @@
mbox-list.c \
mbox-lock.c \
mbox-mail.c \
+ mbox-md5.c \
mbox-save.c \
- mbox-sync-md5.c \
mbox-sync-parse.c \
mbox-sync-rewrite.c \
mbox-sync-update.c \
@@ -30,5 +30,6 @@
mbox-file.h \
mbox-from.h \
mbox-lock.h \
+ mbox-md5.h \
mbox-storage.h \
mbox-sync-private.h
--- NEW FILE: mbox-md5.c ---
/* Copyright (C) 2004 Timo Sirainen */
#include "lib.h"
#include "md5.h"
#include "message-parser.h"
#include "mbox-md5.h"
#include <stdlib.h>
struct mbox_md5_context {
struct md5_context hdr_md5_ctx;
int seen_received_hdr;
};
struct mbox_md5_header_func {
const char *header;
int (*func)(struct mbox_md5_context *ctx,
struct message_header_line *hdr);
};
static int parse_date(struct mbox_md5_context *ctx,
struct message_header_line *hdr)
{
if (!ctx->seen_received_hdr) {
/* Received-header contains date too, and more trusted one */
md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
}
return TRUE;
}
static int parse_delivered_to(struct mbox_md5_context *ctx,
struct message_header_line *hdr)
{
md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
return TRUE;
}
static int parse_message_id(struct mbox_md5_context *ctx,
struct message_header_line *hdr)
{
if (!ctx->seen_received_hdr) {
/* Received-header contains unique ID too,
and more trusted one */
md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
}
return TRUE;
}
static int parse_received(struct mbox_md5_context *ctx,
struct message_header_line *hdr)
{
if (!ctx->seen_received_hdr) {
/* get only the first received-header */
md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
if (!hdr->continues)
ctx->seen_received_hdr = TRUE;
}
return TRUE;
}
static int parse_x_delivery_id(struct mbox_md5_context *ctx,
struct message_header_line *hdr)
{
/* Let the local delivery agent help generate unique ID's but don't
blindly trust this header alone as it could just as easily come from
the remote. */
md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
return TRUE;
}
static struct mbox_md5_header_func md5_header_funcs[] = {
{ "Date", parse_date },
{ "Delivered-To", parse_delivered_to },
{ "Message-ID", parse_message_id },
{ "Received", parse_received },
{ "X-Delivery-ID", parse_x_delivery_id }
};
#define MD5_HEADER_FUNCS_COUNT \
(sizeof(md5_header_funcs) / sizeof(*md5_header_funcs))
static int bsearch_header_func_cmp(const void *p1, const void *p2)
{
const char *key = p1;
const struct mbox_md5_header_func *func = p2;
return strcasecmp(key, func->header);
}
struct mbox_md5_context *mbox_md5_init(void)
{
struct mbox_md5_context *ctx;
ctx = i_new(struct mbox_md5_context, 1);
md5_init(&ctx->hdr_md5_ctx);
return ctx;
}
void mbox_md5_continue(struct mbox_md5_context *ctx,
struct message_header_line *hdr)
{
struct mbox_md5_header_func *func;
func = bsearch(hdr->name, md5_header_funcs,
MD5_HEADER_FUNCS_COUNT, sizeof(*md5_header_funcs),
bsearch_header_func_cmp);
if (func != NULL)
(void)func->func(ctx, hdr);
}
void mbox_md5_finish(struct mbox_md5_context *ctx,
unsigned char result[16])
{
md5_final(&ctx->hdr_md5_ctx, result);
i_free(ctx);
}
--- NEW FILE: mbox-md5.h ---
#ifndef __MBOX_MD5_H
#define __MBOX_MD5_H
struct mbox_md5_context *mbox_md5_init(void);
void mbox_md5_continue(struct mbox_md5_context *ctx,
struct message_header_line *hdr);
void mbox_md5_finish(struct mbox_md5_context *ctx,
unsigned char result[16]);
#endif
Index: mbox-sync-parse.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/mbox/mbox-sync-parse.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- mbox-sync-parse.c 14 Dec 2004 03:03:35 -0000 1.32
+++ mbox-sync-parse.c 15 Dec 2004 18:43:40 -0000 1.33
@@ -11,12 +11,19 @@
#include "message-parser.h"
#include "mail-index.h"
#include "mbox-storage.h"
+#include "mbox-md5.h"
#include "mbox-sync-private.h"
#include <stdlib.h>
#define IS_LWSP_LF(c) (IS_LWSP(c) || (c) == '\n')
+struct mbox_sync_header_func {
+ const char *header;
+ int (*func)(struct mbox_sync_mail_context *ctx,
+ struct message_header_line *hdr);
+};
+
struct mbox_flag_type mbox_status_flags[] = {
{ 'R', MAIL_SEEN },
{ 'O', MBOX_NONRECENT },
@@ -292,7 +299,7 @@
};
#define HEADER_FUNCS_COUNT (sizeof(header_funcs) / sizeof(*header_funcs))
-int mbox_sync_bsearch_header_func_cmp(const void *p1, const void *p2)
+static int mbox_sync_bsearch_header_func_cmp(const void *p1, const void *p2)
{
const char *key = p1;
const struct mbox_sync_header_func *func = p2;
@@ -307,6 +314,7 @@
struct message_header_parser_ctx *hdr_ctx;
struct message_header_line *hdr;
struct mbox_sync_header_func *func;
+ struct mbox_md5_context *mbox_md5_ctx;
size_t line_start_pos;
int i, ret;
@@ -321,7 +329,7 @@
ctx->content_length = (uoff_t)-1;
str_truncate(ctx->header, 0);
- md5_init(&ctx->hdr_md5_ctx);
+ mbox_md5_ctx = mbox_md5_init();
line_start_pos = 0;
hdr_ctx = message_parse_header_init(input, NULL, FALSE);
@@ -360,7 +368,7 @@
buffer_append(ctx->header, hdr->full_value,
hdr->full_value_len);
} else {
- mbox_sync_md5(ctx, hdr);
+ mbox_md5_continue(mbox_md5_ctx, hdr);
buffer_append(ctx->header, hdr->value,
hdr->value_len);
}
@@ -370,7 +378,7 @@
i_assert(ret != 0);
message_parse_header_deinit(hdr_ctx);
- md5_final(&ctx->hdr_md5_ctx, ctx->hdr_md5_sum);
+ mbox_md5_finish(mbox_md5_ctx, ctx->hdr_md5_sum);
if ((ctx->seq == 1 && sync_ctx->base_uid_validity == 0) ||
(ctx->seq > 1 && sync_ctx->dest_first_mail)) {
@@ -393,6 +401,7 @@
struct message_header_parser_ctx *hdr_ctx;
struct message_header_line *hdr;
struct header_func *func;
+ struct mbox_md5_context *mbox_md5_ctx;
const void *data;
uint32_t uid;
int ret;
@@ -402,7 +411,7 @@
the MD5 sum. */
memset(&ctx, 0, sizeof(ctx));
- md5_init(&ctx.hdr_md5_ctx);
+ mbox_md5_ctx = mbox_md5_init();
hdr_ctx = message_parse_header_init(ibox->mbox_stream, NULL, FALSE);
while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0) {
@@ -424,13 +433,13 @@
break;
}
} else {
- mbox_sync_md5(&ctx, hdr);
+ mbox_md5_continue(mbox_md5_ctx, hdr);
}
}
i_assert(ret != 0);
message_parse_header_deinit(hdr_ctx);
- md5_final(&ctx.hdr_md5_ctx, ctx.hdr_md5_sum);
+ mbox_md5_finish(mbox_md5_ctx, ctx.hdr_md5_sum);
if (ctx.mail.uid != 0) {
/* match by X-UID header */
--- mbox-sync-md5.c DELETED ---
Index: mbox-sync-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/mbox/mbox-sync-private.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- mbox-sync-private.h 14 Dec 2004 02:44:33 -0000 1.39
+++ mbox-sync-private.h 15 Dec 2004 18:43:40 -0000 1.40
@@ -67,7 +67,6 @@
size_t header_first_change, header_last_change;
string_t *header, *uidl;
- struct md5_context hdr_md5_ctx;
unsigned char hdr_md5_sum[16];
uoff_t content_length;
@@ -82,7 +81,6 @@
unsigned int updated:1;
unsigned int recent:1;
unsigned int dirty:1;
- unsigned int seen_received_hdr:1;
unsigned int uid_broken:1;
};
@@ -118,12 +116,6 @@
unsigned int delay_writes:1;
};
-struct mbox_sync_header_func {
- const char *header;
- int (*func)(struct mbox_sync_mail_context *ctx,
- struct message_header_line *hdr);
-};
-
int mbox_sync(struct index_mailbox *ibox, enum mbox_sync_flags flags);
int mbox_sync_has_changed(struct index_mailbox *ibox, int leave_dirty);
@@ -147,9 +139,4 @@
void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
size_t pos, size_t need, size_t have);
-int mbox_sync_bsearch_header_func_cmp(const void *p1, const void *p2);
-
-void mbox_sync_md5(struct mbox_sync_mail_context *ctx,
- struct message_header_line *hdr);
-
#endif
More information about the dovecot-cvs
mailing list