]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Several fixes for updating mbox. Recent changes also made it corrupt
authorTimo Sirainen <tss@iki.fi>
Mon, 28 Jun 2004 21:32:29 +0000 (00:32 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 28 Jun 2004 21:32:29 +0000 (00:32 +0300)
headers.

--HG--
branch : HEAD

src/lib-storage/index/mbox/mbox-sync-parse.c
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

index 9705bef060e1615c915c8351b5f1337f40affc7d..6f9cfbc701512d4a6d5e3e50de430aa8482be8b9 100644 (file)
@@ -398,9 +398,12 @@ void mbox_sync_parse_next_mail(struct istream *input,
 
                func = header_func_find(hdr->name);
                if (func != NULL) {
-                       if (hdr->continues)
+                       if (hdr->continues) {
                                hdr->use_full_value = TRUE;
-                       else if (!func->func(ctx, hdr)) {
+                               continue;
+                       }
+
+                       if (!func->func(ctx, hdr)) {
                                /* this header is broken, remove it */
                                ctx->need_rewrite = TRUE;
                                str_truncate(ctx->header, line_start_pos);
index 24306384270a0be6ace95807bd5903b87dacbfe9..a61ed4eea7b654acd8653aa4f9818b4fdb703505 100644 (file)
@@ -120,5 +120,7 @@ int mbox_sync_rewrite(struct mbox_sync_context *sync_ctx, uoff_t extra_space,
 int mbox_sync_seek(struct mbox_sync_context *sync_ctx, uoff_t from_offset);
 int mbox_move(struct mbox_sync_context *sync_ctx,
              uoff_t dest, uoff_t source, uoff_t size);
+void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
+                          size_t pos, size_t need, size_t have);
 
 #endif
index 71139cc54e2fe3a678154bce09aefb531fb64e0e..498e8ab911956725d2b7b44a7bb6949c20a1c74e 100644 (file)
@@ -148,7 +148,7 @@ static void mbox_sync_header_remove_space(struct mbox_sync_mail_context *ctx,
 
        if (data_size - start_pos <= *size) {
                /* remove it all */
-               str_delete(ctx->header, start_pos, data_size - start_pos);
+               mbox_sync_move_buffer(ctx, start_pos, 0, data_size - start_pos);
                *size -= data_size - start_pos;
                return;
        }
@@ -156,7 +156,7 @@ static void mbox_sync_header_remove_space(struct mbox_sync_mail_context *ctx,
        /* we have more space than needed. since we're removing from
           the beginning of header instead of end, we don't have to
           worry about multiline-headers. */
-       str_delete(ctx->header, start_pos, *size);
+       mbox_sync_move_buffer(ctx, start_pos, 0, *size);
        if (last_line_pos <= start_pos + *size)
                last_line_pos = start_pos;
        else
index 519f534385649c2580e56d5376a3350f0665098d..3a9b36c16d1d37fa0104adfb16ca33f84eb4730a 100644 (file)
@@ -17,8 +17,8 @@ static void status_flags_append(struct mbox_sync_mail_context *ctx,
        }
 }
 
-static void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
-                                 size_t pos, size_t need, size_t have)
+void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
+                          size_t pos, size_t need, size_t have)
 {
        ssize_t diff = (ssize_t)need - (ssize_t)have;
        int i;
@@ -126,8 +126,9 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx)
                                ctx->sync_ctx->hdr->uid_validity;
                }
 
+               str_append(ctx->header, "X-IMAPbase: ");
                ctx->hdr_pos[MBOX_HDR_X_IMAPBASE] = str_len(ctx->header);
-               str_printfa(ctx->header, "X-IMAPbase: %u %010u",
+               str_printfa(ctx->header, "%u %010u",
                            ctx->sync_ctx->base_uid_validity,
                            ctx->sync_ctx->next_uid-1);
                //FIXME:keywords_append(ctx, all_keywords);
@@ -135,24 +136,25 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx)
        }
 
        if (ctx->hdr_pos[MBOX_HDR_X_UID] == (size_t)-1) {
+               str_append(ctx->header, "X-UID: ");
                ctx->hdr_pos[MBOX_HDR_X_UID] = str_len(ctx->header);
-               str_printfa(ctx->header, "X-UID: %u\n", ctx->mail.uid);
+               str_printfa(ctx->header, "%u\n", ctx->mail.uid);
        }
 
        if (ctx->hdr_pos[MBOX_HDR_STATUS] == (size_t)-1 &&
            (ctx->mail.flags & STATUS_FLAGS_MASK) != 0) {
                if (!ctx->sync_ctx->ibox->keep_recent)
                         ctx->mail.flags |= MBOX_NONRECENT;
-               ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header);
                str_append(ctx->header, "Status: ");
+               ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header);
                status_flags_append(ctx, mbox_status_flags);
                str_append_c(ctx->header, '\n');
        }
 
        if (ctx->hdr_pos[MBOX_HDR_X_STATUS] == (size_t)-1 &&
            (ctx->mail.flags & XSTATUS_FLAGS_MASK) != 0) {
-               ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header);
                str_append(ctx->header, "X-Status: ");
+               ctx->hdr_pos[MBOX_HDR_X_STATUS] = str_len(ctx->header);
                status_flags_append(ctx, mbox_xstatus_flags);
                str_append_c(ctx->header, '\n');
        }
@@ -166,8 +168,8 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx)
        }
 
        if (ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] == (size_t)-1 && have_keywords) {
-               ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] = str_len(ctx->header);
                str_append(ctx->header, "X-Keywords: ");
+               ctx->hdr_pos[MBOX_HDR_X_KEYWORDS] = str_len(ctx->header);
                keywords_append(ctx, ctx->mail.keywords);
                str_append_c(ctx->header, '\n');
        }