-static notmuch_bool_t
-insert_message (void *ctx, notmuch_database_t *notmuch, int fdin,
- const char *dir, tag_op_list_t *tag_ops,
- notmuch_bool_t synchronize_flags)
-{
- char *tmppath;
- char *newpath;
- char *newdir;
- int fdout;
- char *cleanup_path;
-
- fdout = maildir_open_tmp_file (ctx, dir, &tmppath, &newpath, &newdir);
- if (fdout < 0)
- return FALSE;
-
- cleanup_path = tmppath;
-
- if (! copy_stdin (fdin, fdout))
- goto FAIL;
-
- if (fsync (fdout) != 0) {
- fprintf (stderr, "Error: fsync failed: %s\n", strerror (errno));
- goto FAIL;
- }
-
- close (fdout);
- fdout = -1;
-
- /* Atomically move the new message file from the Maildir 'tmp' directory
- * to the 'new' directory. We follow the Dovecot recommendation to
- * simply use rename() instead of link() and unlink().
- * See also: http://wiki.dovecot.org/MailboxFormat/Maildir#Mail_delivery
- */
- if (rename (tmppath, newpath) != 0) {
- fprintf (stderr, "Error: rename() failed: %s\n", strerror (errno));
- goto FAIL;
- }
-
- cleanup_path = newpath;
-
- if (! sync_dir (newdir))
- goto FAIL;
-
- /* Even if adding the message to the notmuch database fails,
- * the message is on disk and we consider the delivery completed. */
- add_file_to_database (notmuch, newpath, tag_ops, synchronize_flags);
-
- return TRUE;
-
- FAIL:
- if (fdout >= 0)
- close (fdout);
- unlink (cleanup_path);
- return FALSE;
-}
-