From: Timo Sirainen Date: Sat, 24 May 2008 23:52:39 +0000 (+0300) Subject: dbox: Don't write message UID to u.* files' header, since the filename X-Git-Tag: 1.1.rc6~33 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3fb647ed90efb95d52956d86bf0671868c4a4aef;p=thirdparty%2Fdovecot%2Fcore.git dbox: Don't write message UID to u.* files' header, since the filename itself specifies the UID already. When reading u.* files ignore the UID field completely. This would allow hard linking u.* files, but the metadata will then contain only a single mailbox's flags+keywords. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/dbox/dbox-file.c b/src/lib-storage/index/dbox/dbox-file.c index ad030b95ea..95dd3d4e99 100644 --- a/src/lib-storage/index/dbox/dbox-file.c +++ b/src/lib-storage/index/dbox/dbox-file.c @@ -600,7 +600,10 @@ static int dbox_file_read_mail_header(struct dbox_file *file, uint32_t *uid_r, return 0; } - *uid_r = hex2dec(hdr.uid_hex, sizeof(hdr.uid_hex)); + /* Ignore the UID header with UID files */ + *uid_r = (file->file_id & DBOX_FILE_ID_FLAG_UID) != 0 ? + (file->file_id & ~DBOX_FILE_ID_FLAG_UID) : + hex2dec(hdr.uid_hex, sizeof(hdr.uid_hex)); *physical_size_r = hex2dec(hdr.message_size_hex, sizeof(hdr.message_size_hex)); return 1; diff --git a/src/lib-storage/index/dbox/dbox-save.c b/src/lib-storage/index/dbox/dbox-save.c index b3dbdcb047..9f9ac58b94 100644 --- a/src/lib-storage/index/dbox/dbox-save.c +++ b/src/lib-storage/index/dbox/dbox-save.c @@ -218,6 +218,23 @@ static void dbox_save_write_metadata(struct dbox_save_context *ctx) o_stream_send(ctx->cur_output, "\n", 1); } +static int dbox_save_mail_write_header(struct dbox_save_mail *mail) +{ + struct dbox_message_header dbox_msg_hdr; + + i_assert(mail->file->msg_header_size == sizeof(dbox_msg_hdr)); + + mail->file->last_append_uid = mail->uid; + dbox_msg_header_fill(&dbox_msg_hdr, mail->uid, mail->message_size); + + if (pwrite_full(mail->file->fd, &dbox_msg_hdr, + sizeof(dbox_msg_hdr), mail->append_offset) < 0) { + dbox_file_set_syscall_error(mail->file, "write"); + return -1; + } + return 0; +} + int dbox_save_finish(struct mail_save_context *_ctx) { struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx; @@ -250,12 +267,6 @@ int dbox_save_finish(struct mail_save_context *_ctx) i_stream_unref(&ctx->input); count = array_count(&ctx->mails); - if (count >= ctx->mbox->max_open_files) { - /* too many open files, close one of them */ - save_mail = array_idx_modifiable(&ctx->mails, count - - ctx->mbox->max_open_files); - dbox_file_close(save_mail->file); - } save_mail = array_idx_modifiable(&ctx->mails, count - 1); if (ctx->failed) { dbox_file_cancel_append(save_mail->file, @@ -267,6 +278,12 @@ int dbox_save_finish(struct mail_save_context *_ctx) dbox_file_finish_append(save_mail->file); save_mail->message_size = offset - save_mail->append_offset - save_mail->file->msg_header_size; + + if (save_mail->file->append_count == 1 && + !dbox_file_can_append(save_mail->file, 0)) { + dbox_save_mail_write_header(save_mail); + dbox_file_close(save_mail->file); + } return 0; } } @@ -279,23 +296,6 @@ void dbox_save_cancel(struct mail_save_context *_ctx) (void)dbox_save_finish(_ctx); } -static int dbox_save_mail_write_header(struct dbox_save_mail *mail) -{ - struct dbox_message_header dbox_msg_hdr; - - i_assert(mail->file->msg_header_size == sizeof(dbox_msg_hdr)); - - mail->file->last_append_uid = mail->uid; - dbox_msg_header_fill(&dbox_msg_hdr, mail->uid, mail->message_size); - - if (pwrite_full(mail->file->fd, &dbox_msg_hdr, - sizeof(dbox_msg_hdr), mail->append_offset) < 0) { - dbox_file_set_syscall_error(mail->file, "write"); - return -1; - } - return 0; -} - static int dbox_save_file_write_append_offset(struct dbox_file *file, uoff_t append_offset) { @@ -359,6 +359,14 @@ static int dbox_save_commit(struct dbox_save_context *ctx, uint32_t first_uid) /* update headers */ qsort(mails, count, sizeof(*mails), dbox_save_mail_file_cmp); for (i = 0; i < count; i++) { + mails[i].file->last_append_uid = mails[i].uid; + if (mails[i].file->append_count == 1 && + !dbox_file_can_append(mails[i].file, 0)) { + /* UID file - there's no need to write it to the + header */ + continue; + } + if (dbox_file_open_if_needed(mails[i].file) < 0 || dbox_save_mail_write_header(&mails[i]) < 0) { ret = -1;