+ return 0;
+}
+
+static int
+save_maildir(int fdin, const char *dir, int auto_create, char **path)
+{
+ int fdout, ret;
+ struct maildir_tmpcreate_info info;
+
+ maildir_tmpcreate_init(&info);
+ info.openmode = 0666;
+ info.maildir = dir;
+ info.doordie = 1;
+
+ while ((fdout = maildir_tmpcreate_fd(&info)) < 0)
+ {
+ if (errno == ENOENT && auto_create && maildir_mkdir(dir) == 0)
+ {
+ auto_create = 0;
+ continue;
+ }
+
+ g_critical("Failed to create temporary file `%s': %s",
+ info.tmpname, g_strerror(errno));
+ return EX_TEMPFAIL;
+ }
+
+ g_debug("Reading from standard input and writing to `%s'", info.tmpname);
+#ifdef HAVE_SPLICE
+ ret = g_getenv("NOTMUCH_DELIVER_NO_SPLICE")
+ ? save_readwrite(fdin, fdout)
+ : save_splice(fdin, fdout);
+#else
+ ret = save_readwrite(fdin, fdout);
+#endif /* HAVE_SPLICE */
+ if (ret)
+ goto fail;
+
+ close(fdout);