[PATCH 04/18] insert: copy stdin to Maildir tmp file

Peter Wang novalazy at gmail.com
Wed Jul 25 06:42:33 PDT 2012


Read the new message from standard input into the Maildir tmp file.
---
 notmuch-insert.c |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/notmuch-insert.c b/notmuch-insert.c
index f01a6f2..340f7e4 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -75,21 +75,68 @@ maildir_open_tmp (void *ctx, const char *dir, char **tmppath, char **newpath)
 }
 
 static notmuch_bool_t
+copy_fd_data (int fdin, int fdout)
+{
+    char buf[4096];
+    char *p;
+    ssize_t remain;
+    ssize_t written;
+
+    for (;;) {
+	remain = read (fdin, buf, sizeof(buf));
+	if (remain == 0)
+	    break;
+	if (remain < 0) {
+	    if (errno == EINTR)
+		continue;
+	    fprintf (stderr, "Error: reading from standard input: %s\n",
+		     strerror (errno));
+	    return FALSE;
+	}
+
+	p = buf;
+	do {
+	    written = write (fdout, p, remain);
+	    if (written == 0)
+		return FALSE;
+	    if (written < 0) {
+		if (errno == EINTR)
+		    continue;
+		fprintf (stderr, "Error: writing to temporary file: %s",
+			 strerror (errno));
+		return FALSE;
+	    }
+	    p += written;
+	    remain -= written;
+	} while (remain > 0);
+    }
+
+    return TRUE;
+}
+
+static notmuch_bool_t
 insert_message (void *ctx, notmuch_database_t *notmuch, int fdin,
 		const char *dir)
 {
     char *tmppath;
     char *newpath;
     int fdout;
+    notmuch_bool_t ret;
 
     fdout = maildir_open_tmp (ctx, dir, &tmppath, &newpath);
     if (fdout < 0) {
 	return FALSE;
     }
 
+    ret = copy_fd_data (fdin, fdout);
+
     close (fdout);
-    unlink (tmppath);
-    return FALSE;
+
+    if (!ret) {
+	unlink (tmppath);
+    }
+
+    return ret;
 }
 
 int
-- 
1.7.4.4



More information about the notmuch mailing list