From: Timo Sirainen Date: Mon, 28 Jun 2004 22:03:24 +0000 (+0300) Subject: some fixes for handling pseudo headers. X-Git-Tag: 1.1.alpha1~3856 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=907723f35f4d3dfc774ca42d00a8a7b8ef90dd5d;p=thirdparty%2Fdovecot%2Fcore.git some fixes for handling pseudo headers. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/mbox/mbox-sync-private.h b/src/lib-storage/index/mbox/mbox-sync-private.h index a61ed4eea7..0bbb1b2434 100644 --- a/src/lib-storage/index/mbox/mbox-sync-private.h +++ b/src/lib-storage/index/mbox/mbox-sync-private.h @@ -20,6 +20,7 @@ enum header_position { }; #define MBOX_NONRECENT MAIL_RECENT /* kludgy */ +#define MBOX_EXPUNGED 0x40 #define STATUS_FLAGS_MASK (MAIL_SEEN|MBOX_NONRECENT) #define XSTATUS_FLAGS_MASK (MAIL_ANSWERED|MAIL_FLAGGED|MAIL_DRAFT|MAIL_DELETED) diff --git a/src/lib-storage/index/mbox/mbox-sync-rewrite.c b/src/lib-storage/index/mbox/mbox-sync-rewrite.c index 498e8ab911..d504599a85 100644 --- a/src/lib-storage/index/mbox/mbox-sync-rewrite.c +++ b/src/lib-storage/index/mbox/mbox-sync-rewrite.c @@ -80,11 +80,16 @@ static void mbox_sync_headers_add_space(struct mbox_sync_mail_context *ctx, i_assert(size < SSIZE_T_MAX); - /* Append at the end of X-Keywords header, - or X-UID if it doesn't exist */ - start_pos = ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] != (size_t)-1 ? - ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] : - ctx->hdr_pos[MBOX_HDR_X_UID]; + if (ctx->pseudo) + start_pos = ctx->hdr_pos[MBOX_HDR_X_IMAPBASE]; + else { + /* Append at the end of X-Keywords header, + or X-UID if it doesn't exist */ + start_pos = ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] != (size_t)-1 ? + ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] : + ctx->hdr_pos[MBOX_HDR_X_UID]; + } + i_assert(start_pos != (size_t)-1); data = str_data(ctx->header); data_size = str_len(ctx->header); @@ -298,7 +303,7 @@ static int mbox_sync_read_and_move(struct mbox_sync_context *sync_ctx, /* mbox_sync_parse_next_mail() checks that UIDs are growing, so we have to fool it. */ old_prev_msg_uid = sync_ctx->prev_msg_uid; - sync_ctx->prev_msg_uid = mails[idx].uid-1; + sync_ctx->prev_msg_uid = mails[idx].uid == 0 ? 0 : mails[idx].uid-1; sync_ctx->dest_first_mail = mails[idx].from_offset == 0; mbox_sync_parse_next_mail(sync_ctx->input, &mail_ctx); @@ -380,7 +385,7 @@ int mbox_sync_rewrite(struct mbox_sync_context *sync_ctx, uoff_t extra_space, /* after expunge the next mail must have been missing space, or we would have moved it backwards already */ - i_assert(mails[0].space < 0 || mails[0].uid == 0); + i_assert(mails[0].space < 0 || (mails[0].flags & MBOX_EXPUNGED) != 0); /* start moving backwards. */ do { @@ -396,14 +401,15 @@ int mbox_sync_rewrite(struct mbox_sync_context *sync_ctx, uoff_t extra_space, space_diff = mails[idx].space; end_offset = mails[idx].offset + mails[idx].space; - if (mails[idx].uid != 0) { + if ((mails[idx].flags & MBOX_EXPUNGED) == 0) { space_diff -= extra_per_mail; end_offset -= extra_per_mail; mails[idx].space = extra_per_mail; } idx--; - if (mails[idx].space <= 0 && mails[idx].uid != 0) { + if (mails[idx].space <= 0 && + (mails[idx].flags & MBOX_EXPUNGED) == 0) { /* offset points to beginning of headers. read the header again, update it and give enough space to fill space_diff */ diff --git a/src/lib-storage/index/mbox/mbox-sync-update.c b/src/lib-storage/index/mbox/mbox-sync-update.c index 3a9b36c16d..782859153f 100644 --- a/src/lib-storage/index/mbox/mbox-sync-update.c +++ b/src/lib-storage/index/mbox/mbox-sync-update.c @@ -135,7 +135,7 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx) str_append_c(ctx->header, '\n'); } - if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1) { + if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1 && !ctx->pseudo) { str_append(ctx->header, "X-UID: "); ctx->hdr_pos[MBOX_HDR_X_UID] = str_len(ctx->header); str_printfa(ctx->header, "%u\n", ctx->mail.uid); diff --git a/src/lib-storage/index/mbox/mbox-sync.c b/src/lib-storage/index/mbox/mbox-sync.c index 3f07b3d94f..3e0867a744 100644 --- a/src/lib-storage/index/mbox/mbox-sync.c +++ b/src/lib-storage/index/mbox/mbox-sync.c @@ -666,6 +666,7 @@ static int mbox_sync_handle_header(struct mbox_sync_mail_context *mail_ctx) struct mbox_sync_mail mail; memset(&mail, 0, sizeof(mail)); + mail.flags = MBOX_EXPUNGED; mail.offset = mail_ctx->from_offset - sync_ctx->expunged_space; mail.space = sync_ctx->expunged_space; @@ -804,13 +805,15 @@ static int mbox_sync_loop(struct mbox_sync_context *sync_ctx, while ((ret = mbox_sync_read_next_mail(sync_ctx, mail_ctx)) > 0) { uid = mail_ctx->mail.uid; + if (mail_ctx->pseudo) + uid = 0; + /* get all sync records related to this message */ if (mbox_sync_read_index_syncs(sync_ctx, uid, &expunged) < 0) return -1; rec = NULL; - if (uid != 0 && !mail_ctx->pseudo && - sync_ctx->ibox->md5hdr_extra_idx == 0) { + if (uid != 0 && sync_ctx->ibox->md5hdr_extra_idx == 0) { ret = mbox_sync_read_index_rec(sync_ctx, uid, &rec); if (ret < 0) return -1; @@ -818,7 +821,8 @@ static int mbox_sync_loop(struct mbox_sync_context *sync_ctx, uid = 0; } - if (uid == 0 && sync_ctx->ibox->mbox_readonly) { + if (uid == 0 && sync_ctx->ibox->mbox_readonly && + !mail_ctx->pseudo) { /* Use MD5 sums */ if (sync_ctx->ibox->md5hdr_extra_idx == 0) { sync_ctx->ibox->md5hdr_extra_idx = @@ -836,7 +840,7 @@ static int mbox_sync_loop(struct mbox_sync_context *sync_ctx, uid = rec->uid; } - if (uid == 0) { + if (uid == 0 && !mail_ctx->pseudo) { /* missing/broken X-UID. all the rest of the mails need new UIDs. */ while (sync_ctx->idx_seq <= messages_count) { @@ -860,12 +864,14 @@ static int mbox_sync_loop(struct mbox_sync_context *sync_ctx, return ret; } - if (!expunged && !mail_ctx->pseudo) { - if (mbox_sync_update_index(sync_ctx, mail_ctx, - rec) < 0) - return -1; + if (!mail_ctx->pseudo) { + if (!expunged) { + if (mbox_sync_update_index(sync_ctx, mail_ctx, + rec) < 0) + return -1; + } + sync_ctx->idx_seq++; } - sync_ctx->idx_seq++; istream_raw_mbox_next(sync_ctx->input, mail_ctx->mail.body_size);