[Dovecot] mbox format and UIDVALIDITY

Axel Luttgens AxelLuttgens at swing.be
Thu Jul 2 16:44:19 EEST 2009


Going further with my question... ;-)

It stemmed from that consideration (and related ones) of RFC3501:

    2.3.1.1.        Unique Identifier (UID) Message Attribute

       A 32-bit value assigned to each message, which when used with the
       unique identifier validity value (see below) forms a 64-bit value
       that MUST NOT refer to any other message in the mailbox or any
       subsequent mailbox with the same name forever. [...]

Assuming the behavior shown by Dovecot isn't related to a bad config  
of mine (see my previous post) but really indicates a slight  
oversight, I quickly and dirtily added some lines in the code of  
function mbox_mailbox_create().
The resulting binary seems to behave correctly (this is with  
dovecot-1.2.0).
But I must sure be overlooking something, or? Not only because I  
perhaps dangerously make use of some functions beyond what they are  
intended for, but also wrt the overall logics of Dovecot.
Anyway, here's my attempt:


     /* create the mailbox file */
     fd = open(path, O_RDWR | O_CREAT | O_EXCL, 0660);
     if (fd != -1) {

         /* A shameless adaptation of mbox_write_pseudo() from:
                 src/lib-storage/index/mbox/mbox-storage.c */

#include "str.h"
#include "mbox-from.h"
#include "message-date.h"
#include "write-full.h"
#include "hostpid.h"

         string_t *str;

         /* Let's prepare the pseudo message, without trying to be  
clever wrt the
            uidvalidity value: just make use of the current time. */
         str = t_str_new(1024);
         str_printfa(str,
             "%s"
             "Date: %s\n"
             "From: Mail System Internal Data <MAILER-DAEMON@%s>\n"
             "Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL  
DATA"
             "\nMessage-ID: <%s@%s>\n"
             "X-IMAP: %u  %010u\n"
             "Status: RO\n"
             "\n"
             "This text is part of the internal format of your mail  
folder, and is not\n"
             "a real message.  It is created automatically by the mail  
system software.\n"
             "If deleted, important folder data will be lost, and it  
will be re-created\n"
             "with the data reset to initial values.\n"
             "\n",
             mbox_from_create("MAILER_DAEMON", ioloop_time),
             message_date_create(ioloop_time),
             my_hostname,
             dec2str(ioloop_time), my_hostname,
             (uint32_t)ioloop_time, 0
         );

         /* Write the message to the mailbox file; in case of problem,  
just try
            to revert to the original behavior by truncating the file  
(i.e. no
            pseudo message at all). */
         if (pwrite_full(fd, str_data(str), str_len(str), 0) < 0) {
             i_info("mbox_mailbox_create(): failed to write pseudo  
message to %s(%d)", path, errno);
             /* Should a failure here be considered fatal? */
             if (ftruncate(fd, 0) < 0)
                 i_info("mbox_mailbox_create(): failed to truncate  
file %s(%d)", path, errno);
         }

         /* OK, it should now be safe to rely on Dovecot's ability to  
build the
            indexes and to correctly recognize the pseudo message. */

         (void)close(fd);
         return 0;
     }

In the hope this may prove useful as a skeleton for a better code,  
should a better handling of the UIDVALIDITY with the mbox format be  
considered useful,
Axel





More information about the dovecot mailing list