[PATCH v2 05/20] insert: copy stdin to Maildir tmp file
Peter Wang
novalazy at gmail.com
Sat Nov 24 17:16:31 PST 2012
Read the new message from standard input into the Maildir tmp file.
---
notmuch-insert.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 47 insertions(+), 4 deletions(-)
diff --git a/notmuch-insert.c b/notmuch-insert.c
index 371fb47..88e8533 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -94,6 +94,47 @@ maildir_open_tmp_file (void *ctx, const char *dir,
return fd;
}
+/* Copy the contents of fdin into fdout. */
+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)
@@ -101,16 +142,18 @@ insert_message (void *ctx, notmuch_database_t *notmuch, int fdin,
char *tmppath;
char *newpath;
int fdout;
+ notmuch_bool_t ret;
fdout = maildir_open_tmp_file (ctx, dir, &tmppath, &newpath);
if (fdout < 0) {
return FALSE;
}
-
- /* For now we just delete the tmp file immediately. */
+ ret = copy_fd_data (fdin, fdout);
close (fdout);
- unlink (tmppath);
- return FALSE;
+ if (!ret) {
+ unlink (tmppath);
+ }
+ return ret;
}
int
--
1.7.12.1
More information about the notmuch
mailing list