[patch] Re: [Dovecot] Test migration (IMAP copy) and INTERNALDATE?]

Apps Lists appslists at neonova.net
Wed Apr 19 20:00:43 EEST 2006


I haven't been able to find what is responsible for altering the time on
APPENDed mail, but was able to come up with a temporary workaround ...
simply calling utime() later on in the process resolves it.

Below is my patch.

Steve


--- dovecot-1.0.beta7-orig/src/lib-storage/index/maildir/maildir-save.c
2006-03-25 05:53:43.000000000 -0500
+++ dovecot-1.0.beta7/src/lib-storage/index/maildir/maildir-save.c
2006-04-19 09:47:32.000000000 -0400
@@ -70,9 +70,20 @@
                t_strconcat(ctx->newdir, "/", basename, NULL) :
                t_strconcat(ctx->curdir, "/", dest, NULL);

-       if (link(tmp_path, new_path) == 0)
+       if (link(tmp_path, new_path) == 0) {
                ret = 0;
-       else {
+               if (ctx->received_date != (time_t)-1) {
+                       struct utimbuf buf;
+                       /* set the received_date by modifying mtime */ +
                      buf.actime = ioloop_time;
+                       buf.modtime = ctx->received_date;
+                       if (utime(new_path, &buf) < 0) {
+                               ctx->failed = TRUE;
+
mail_storage_set_critical(STORAGE(ctx->mbox->storage),
+                                                       "utime(%s)
failed: %m", new_path);
+                       }
+               }
+       } else {
                ret = -1;
                if (ENOSPACE(errno)) {
                        mail_storage_set_error(STORAGE(ctx->mbox->storage),
@@ -332,18 +343,6 @@
        t_push();
        path = t_strconcat(ctx->tmpdir, "/", ctx->files->basename,
NULL);

-       if (ctx->received_date != (time_t)-1) {
-               /* set the received_date by modifying mtime */
-               buf.actime = ioloop_time;
-               buf.modtime = ctx->received_date;
-
-               if (utime(path, &buf) < 0) {
-                       ctx->failed = TRUE;
-
mail_storage_set_critical(STORAGE(ctx->mbox->storage),
-                                                 "utime(%s) failed:
%m", path);
-               }
-       }
-
        output_errno = ctx->output->stream_errno;
        o_stream_destroy(&ctx->output);


> Ok, this is looking less like a feature request and more like a bug
> report.
>
> The function maildir_save_finish() in
> lib-storage/index/maildir/maildir-save.c is being passed the correct
> time information, and is setting the mtime properly with a call to
> utime().
>
> It is doing this operation on a file that lives in /tmp.
>
> For example:
>
> -rw-------  1 121030 mail 26548 Mar 15 03:22
> /var/mailstore/94/6d/121030/Maildir/.Deleted
> Messages/tmp/1145379992.P26598Q0M182281.dev3.neonova.net
>
> Perfect.  March 15th.
>
> Something then happens... what, I haven't yet found... but the message
> gets moved from /tmp/:
>
> /var/mailstore/94/6d/121030/Maildir/.Deleted
> Messages/cur/1145379992.P26598Q0M182281.dev3.neonova.net:2,S
>
> and then loses the timestamp of March 15th ... it picks up the current
> date.
>
> Steve
>
>
>
>> We're trying some migration tests ... from CommuniGate to Dovecot.
>> The migration program does an APPEND into the new mailbox:
>>
>> src>: a0 FETCH 2900 (FLAGS INTERNALDATE RFC822.PEEK)
>> src<: * 2900 FETCH (FLAGS (\Seen) INTERNALDATE "29-Aug-2005 18:36:54
>> +0000" RFC822 {1194157}
>> src<: )
>> dst>: bAPP APPEND "INBOX" (\Seen) "29-Aug-2005 18:36:54 +0000"
>> {1194157} dst<: + OK
>>
>> It appears to be trying to set the message date... in this example,
>> to 29 Aug 2005.
>>
>> Dovecot seems to be ignoring it.
>>
>> Am I doing something wrong, or does Dovecot not allow this?
>>
>> Steve





More information about the dovecot mailing list