On Wed, Jul 25, 2012 at 11:42:33PM +1000, Peter Wang wrote:
>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;
>+}

LGTM. As an optimisation we can also consider using the splice(2) system
call if it is available (as notmuch-deliver does). In case splice()
fails with ENOSYS or EINVAL we can fall back to this method.

I can write the patch for it once this is accepted.
Thanks for the good work!

>+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
>
>_______________________________________________
>notmuch mailing list
>notmuch at notmuchmail.org
>http://notmuchmail.org/mailman/listinfo/notmuch
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: 
<http://notmuchmail.org/pipermail/notmuch/attachments/20121126/85770f50/attachment-0001.pgp>

Reply via email to