]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
some fixes for handling pseudo headers.
authorTimo Sirainen <tss@iki.fi>
Mon, 28 Jun 2004 22:03:24 +0000 (01:03 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 28 Jun 2004 22:03:24 +0000 (01:03 +0300)
--HG--
branch : HEAD

src/lib-storage/index/mbox/mbox-sync-private.h
src/lib-storage/index/mbox/mbox-sync-rewrite.c
src/lib-storage/index/mbox/mbox-sync-update.c
src/lib-storage/index/mbox/mbox-sync.c

index a61ed4eea7b654acd8653aa4f9818b4fdb703505..0bbb1b2434f33f7f757a9106e3ccdc0e9a9e6028 100644 (file)
@@ -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)
index 498e8ab911956725d2b7b44a7bb6949c20a1c74e..d504599a85ac26d8a8900b909aacea01a91507d4 100644 (file)
@@ -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 */
index 3a9b36c16d1d37fa0104adfb16ca33f84eb4730a..782859153fd8f05ce8463e47067b5c7a956e6aac 100644 (file)
@@ -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);
index 3f07b3d94f5f71b84559748e73eccf8980444211..3e0867a7445c5ecab59d5c47ef94c7414c937bc3 100644 (file)
@@ -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);