while (rename(src, dest) < 0 && count < 2) {
if (errno != EEXIST) {
rename can never return EEXIST in errno. maildir-save.c, line 124.
/* move the file into new/ directory - syncing will pick it
up from there */
if (rename(tmp_path, new_path) == 0)
failed = FALSE;
Here you can lose emails if the new/ folder contains a message whose base name is equal. The only way to avoid this is:
- use link and unlink, not rename
- leave messages that have a time_t part equal to or higher than time(NULL).
Anyway, Maildir has a strict consistency criteria which says that all messages that are linked from tmp/ into new/ _must_ use time(NULL) plus a number that is guaranteed not to lapse within one second, and which does not collide with other messages in new/. new/ is the single entry point into cur/, and messages in new/ can not be "older" than the messages in cur/.
The simple reasoning for this is that you can never guarantee that there is no message in cur/ that has the same base name, but perhaps different flags. It follows that when moving a message from new/ to cur/, it is required that the server only picks messages that are older than one second.
Andy
-- Andreas Aardal Hanssen http://www.andreas.hanssen.name/gpg