[SCM] GNU Mailutils branch, stream-cleanup, updated. rel-2_1-109-gf1625c3

"Sergey Poznyakoff" <[email protected]>
Newsgroups gmane.comp.gnu.mailutils.cvs
Message-ID <[email protected]>
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=f1625c353026c160c8db18ac9a4bd3bd35df150c

The branch, stream-cleanup has been updated
       via  f1625c353026c160c8db18ac9a4bd3bd35df150c (commit)
      from  4aa0382895299d0d773d7e6a7ee7fa12a5ca5e5d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit f1625c353026c160c8db18ac9a4bd3bd35df150c
Author: Sergey Poznyakoff <[email protected]>
Date:   Sun Aug 29 14:30:58 2010 +0300

    Bugfix.
    
    * imap4d/append.c: Add a comment.
    * imap4d/imap4d.h (imap4d_child_signal_setup): New proto.
    * libmu_sieve/extensions/pipe.c (sieve_action_pipe): Use
    mu_stream_copy, rewrite error handling.
    * libmu_sieve/extensions/spamd.c (spamd_send_message): se
    mu_stream_copy.
    (spamd_test): Honor dry-run mode.
    * libmu_sieve/extensions/vacation.c (build_mime): Remove
    misleading FIXME. Use mu_stream_copy.
    * libmu_sieve/extensions/moderator.c (moderator_message_get_part): Use
    mu_body_get_streamref.
    * examples/header.c (hstream): New global.
    (cmd_load, cmd_free, cmd_remove, cmd_insert): Discard hstream.
    (cmd_readline): Use hstream. Obtain it using mu_stream_readline.
    * libproto/mbox/mbox.c (mbox_envelope_date): Remove trailing
    newline from the obtained envelope line.
    * mailbox/amd.c (amd_body_stream_seek): Allow for off == size
    (imprtant for empty bodies).

-----------------------------------------------------------------------

Summary of changes:
 examples/header.c                  |   17 +++-
 imap4d/append.c                    |    1 +
 imap4d/imap4d.h                    |    1 +
 libmu_sieve/extensions/moderator.c |    3 +-
 libmu_sieve/extensions/pipe.c      |  147 +++++++++++++++++------------------
 libmu_sieve/extensions/spamd.c     |   40 ++++++-----
 libmu_sieve/extensions/vacation.c  |   48 ++++++++----
 libproto/mbox/mbox.c               |    3 +-
 mailbox/amd.c                      |    2 +-
 9 files changed, 146 insertions(+), 116 deletions(-)

diff --git a/examples/header.c b/examples/header.c
index 90cce65..63733f8 100644
--- a/examples/header.c
+++ b/examples/header.c
@@ -28,6 +28,7 @@
 char *file;
 mu_header_t header;
 mu_iterator_t iterator;
+mu_stream_t hstream;
 
 char *ps[] = { "> ", ". " };
 int interactive;
@@ -124,6 +125,7 @@ cmd_load (int argc, char **argv)
 {
   if (check_args (argv[0], argc, 2, 2))
     return;
+  mu_stream_destroy (&hstream);
   mu_header_destroy (&header);
   load_file (argv[1]);
 }
@@ -134,6 +136,7 @@ cmd_free (int argc, char **argv)
   if (check_args (argv[0], argc, 1, 1))
     return;
   mu_iterator_destroy (&iterator);
+  mu_stream_destroy (&hstream);
   mu_header_destroy (&header);
 }
 
@@ -211,6 +214,7 @@ cmd_remove (int argc, char **argv)
   status = mu_header_remove (header, fn, num);
   if (status)
     mu_error ("%u: %s: %s", line_num, argv[0], mu_strerror (status));
+  mu_stream_destroy (&hstream);
 }
 
 /* insert header value [ref [num] [before|after] [replace]] */
@@ -260,6 +264,7 @@ cmd_insert (int argc, char **argv)
     }
   status = mu_header_insert (header, argv[1], argv[2],
 			     ref, num, flags);
+  mu_stream_destroy (&hstream);
   if (status)
     mu_error ("%u: %s: %s", line_num, argv[0], mu_strerror (status));
 }
@@ -289,6 +294,7 @@ cmd_write (int argc, char **argv)
 	break;
     }
   mu_stream_destroy (&str);
+  mu_stream_destroy (&hstream);
 }
 
 void
@@ -341,18 +347,19 @@ void
 cmd_readline (int argc, char **argv)
 {
   char *buf;
-  size_t size;
-  mu_stream_t stream;
+  size_t size = 128;
   size_t nbytes;
   
   if (check_args (argv[0], argc, 1, 2))
     return;
-  size = atoi (argv[1]);
+  if (argc == 2)
+    size = atoi (argv[1]);
   buf = malloc (size);
   if (!buf)
     abort ();
-  mu_header_get_stream (header, &stream);
-  mu_stream_readline (stream, buf, size, &nbytes);
+  if (!hstream)
+    mu_header_get_streamref (header, &hstream);
+  mu_stream_readline (hstream, buf, size, &nbytes);
   printf ("\"%*.*s\"", (int) nbytes, (int) nbytes, buf);
   free (buf);
 }
diff --git a/imap4d/append.c b/imap4d/append.c
index c8d5722..e549b59 100644
--- a/imap4d/append.c
+++ b/imap4d/append.c
@@ -45,6 +45,7 @@ _append_sender (mu_envelope_t envelope, char *buf, size_t len, size_t *pnwrite)
   return 0;
 }
 
+/* FIXME: Why not use mu_message_size instead? */
 static int
 _append_size (mu_message_t msg, size_t *psize)
 {
diff --git a/imap4d/imap4d.h b/imap4d/imap4d.h
index 6a01e46..17e7ef6 100644
--- a/imap4d/imap4d.h
+++ b/imap4d/imap4d.h
@@ -322,6 +322,7 @@ extern char *namespace_checkfullpath (const char *name, const char *pattern,
 				       const char *delim, int *pns);
 int imap4d_session_setup (char *username);
 int imap4d_session_setup0 (void);
+void imap4d_child_signal_setup (RETSIGTYPE (*handler) (int signo));
   
 /* Capability functions */
 extern void imap4d_capability_add (const char *str);
diff --git a/libmu_sieve/extensions/moderator.c b/libmu_sieve/extensions/moderator.c
index 9e0aecb..f3dc8c4 100644
--- a/libmu_sieve/extensions/moderator.c
+++ b/libmu_sieve/extensions/moderator.c
@@ -213,7 +213,7 @@ moderator_message_get_part (mu_sieve_machine_t mach,
 
       free (value);
       mu_message_get_body (tmp, &body);
-      mu_body_get_stream (body, &str);
+      mu_body_get_streamref (body, &str);
 
       rc = mu_stream_to_message (str, pmsg);
       if (rc)
@@ -223,6 +223,7 @@ moderator_message_get_part (mu_sieve_machine_t mach,
 			  mu_strerror (rc));
 	  return 1;
 	}
+      mu_stream_destroy (&str);
     }
   else if (value)
     {
diff --git a/libmu_sieve/extensions/pipe.c b/libmu_sieve/extensions/pipe.c
index 420fa40..717706a 100644
--- a/libmu_sieve/extensions/pipe.c
+++ b/libmu_sieve/extensions/pipe.c
@@ -21,9 +21,9 @@
    The pipe action executes a shell command specified by its
    argument and pipes the entire message to its standard input.
    The envelope of the message is included, if the :envelope tag is given.
-   
+
    Notes/FIXME: 1. it would be nice to implement meta-variables in
-                <program call> which would expand to various
+		<program call> which would expand to various
 		items from the message being handled.
 		2. :mime tag could be useful too.
 */
@@ -41,38 +41,6 @@
 #include <regex.h>
 #include <mailutils/sieve.h>
 
-#define ASSERT(expr, diag, ec)                                                \
- if (!(expr))                                                                 \
-   {                                                                          \
-     if (ec)                                                                  \
-       mu_sieve_error (mach, "%lu: %s: %s",                                   \
-	 	       (unsigned long) mu_sieve_get_message_num (mach),	      \
-		       diag,                                                  \
-		       mu_strerror (ec));                                     \
-     else                                                                     \
-       mu_sieve_error (mach, "%lu: %s",                                       \
-	 	       (unsigned long) mu_sieve_get_message_num (mach),	      \
-		       diag);                                                 \
-     mu_sieve_abort (mach);                                                   \
-   }
-    
-#define ASSERT2(expr, diag, arg, ec)                                          \
- if (!(expr))                                                                 \
-   {                                                                          \
-     if (ec)                                                                  \
-       mu_sieve_error (mach, "%lu: `%s': %s: %s",                             \
-	 	       (unsigned long) mu_sieve_get_message_num (mach),	      \
-		       arg,                                                   \
-		       diag,                                                  \
-		       mu_strerror (ec));                                     \
-     else                                                                     \
-       mu_sieve_error (mach, "%lu: `%s': %s",                                 \
-		       (unsigned long) mu_sieve_get_message_num (mach),	      \
-		       arg,                                                   \
-		       diag);                                                 \
-     mu_sieve_abort (mach);                                                   \
-   }
-
 int
 sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
 {
@@ -81,12 +49,25 @@ sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
   mu_sieve_value_t *val;
   char *cmd;
   mu_stream_t mstr, pstr;
-  char buf[512];
-  size_t n;
   mu_envelope_t env;
-  
+  const char *error_diag = NULL;
+  const char *error_arg = NULL;
+#define ONERR(rc, diag, arg)						\
+  if (rc)								\
+    {									\
+      error_diag = diag;						\
+      error_arg = arg;							\
+      break;								\
+    }
+
   val = mu_sieve_value_get (args, 0);
-  ASSERT (val, _("cannot get command!"), 0);
+  if (!val)
+    {
+      mu_sieve_error (mach, "%lu: %s",
+		      (unsigned long) mu_sieve_get_message_num (mach),
+		      _("cannot get command!"));
+      mu_sieve_abort (mach);
+    }
   cmd = val->v.string;
 
   mu_sieve_log_action (mach, "PIPE", NULL);
@@ -104,49 +85,64 @@ sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
 
   msg = mu_sieve_get_message (mach);
   mu_message_get_envelope (msg, &env);
-  
-  rc = mu_message_get_stream (msg, &mstr);
-  ASSERT (rc == 0, _("cannot get message stream"), rc);
-  
-  rc = mu_prog_stream_create (&pstr, cmd, MU_STREAM_WRITE);
-  ASSERT2 (rc == 0, _("cannot create command stream"), cmd, rc);
 
-  rc = mu_stream_open (pstr);
-  ASSERT2 (rc == 0, _("cannot open command stream"), cmd, rc);
-
-  if (mu_sieve_tag_lookup (tags, "envelope", &val))
+  do
     {
-      char *p;
-
-      rc = mu_envelope_aget_sender (env, &p);
-      ASSERT (rc == 0, _("cannot get envelope sender"), rc);
-      rc = mu_stream_write (pstr, "From ", 5, NULL);
-      ASSERT (rc == 0, _("stream write failed"), rc);
-      mu_stream_write (pstr, p, strlen (p), NULL);
-      free (p);
-      rc = mu_stream_write (pstr, " ", 1, NULL);
-      ASSERT (rc == 0, _("stream write failed"), rc);
-      rc = mu_envelope_aget_date (env, &p);
-      ASSERT (rc == 0, _("cannot get envelope date"), rc);
-      rc = mu_stream_write (pstr, p, strlen (p), NULL);
-      ASSERT (rc == 0, _("stream write failed"), rc);
-      free (p);
-      rc = mu_stream_write (pstr, "\n", 1, NULL);
-      ASSERT (rc == 0, _("stream write failed"), rc);
+      rc = mu_message_get_streamref (msg, &mstr);
+      ONERR (rc, _("cannot get message stream"), NULL);
+
+      rc = mu_prog_stream_create (&pstr, cmd, MU_STREAM_WRITE);
+      ONERR (rc, _("cannot create command stream"), cmd);
+
+      rc = mu_stream_open (pstr);
+      ONERR (rc, _("cannot open command stream"), cmd);
+
+      if (mu_sieve_tag_lookup (tags, "envelope", &val))
+	{
+	  char *p;
+
+	  rc = mu_envelope_aget_sender (env, &p);
+	  ONERR (rc, _("cannot get envelope sender"), NULL);
+	  rc = mu_stream_write (pstr, "From ", 5, NULL);
+	  ONERR (rc, _("stream write failed"), NULL);
+	  mu_stream_write (pstr, p, strlen (p), NULL);
+	  free (p);
+	  rc = mu_stream_write (pstr, " ", 1, NULL);
+	  ONERR (rc, _("stream write failed"), NULL);
+	  rc = mu_envelope_aget_date (env, &p);
+	  ONERR (rc, _("cannot get envelope date"), NULL);
+	  rc = mu_stream_write (pstr, p, strlen (p), NULL);
+	  ONERR (rc, _("stream write failed"), NULL);
+	  free (p);
+	  rc = mu_stream_write (pstr, "\n", 1, NULL);
+	  ONERR (rc, _("stream write failed"), NULL);
+	}
+
+      rc = mu_stream_copy (pstr, mstr, 0);
+      ONERR (rc, _("command failed"), cmd);
     }
-  
-  rc = mu_stream_seek (mstr, 0, SEEK_SET, NULL);
-  while (rc == 0
-	 && mu_stream_read (mstr, buf, sizeof buf, &n) == 0
-	 && n > 0)
-    rc = mu_stream_write (pstr, buf, n, NULL);
+  while (0);
 
+  mu_stream_destroy (&mstr);
   mu_stream_close (pstr);
   mu_stream_destroy (&pstr);
 
+  if (rc)
+    {
+      if (error_arg)
+	mu_sieve_error (mach, "%lu: %s: %s: %s",
+			(unsigned long) mu_sieve_get_message_num (mach),
+			error_diag,
+			error_arg,
+			mu_strerror (rc));
+      else
+	mu_sieve_error (mach, "%lu: %s: %s",
+			(unsigned long) mu_sieve_get_message_num (mach),
+			error_diag,
+			mu_strerror (rc));
+      mu_sieve_abort (mach);
+    }
 
-  ASSERT2 (rc == 0, _("command failed"), cmd, rc);
-  
   return 0;
 }
 
@@ -155,9 +151,9 @@ static mu_sieve_tag_def_t pipe_tags[] = {
   { "envelope", SVT_VOID },
   { NULL }
 };
-  
+
 static mu_sieve_tag_group_t pipe_tag_groups[] = {
-  { pipe_tags, NULL }, 
+  { pipe_tags, NULL },
   { NULL }
 };
 
@@ -173,4 +169,3 @@ SIEVE_EXPORT (pipe, init) (mu_sieve_machine_t mach)
   return mu_sieve_register_action (mach, "pipe", sieve_action_pipe,
 				   pipe_args, pipe_tag_groups, 1);
 }
-
diff --git a/libmu_sieve/extensions/spamd.c b/libmu_sieve/extensions/spamd.c
index e2aef4a..f31809e 100644
--- a/libmu_sieve/extensions/spamd.c
+++ b/libmu_sieve/extensions/spamd.c
@@ -34,6 +34,8 @@
 #include <mailutils/sieve.h>
 #include <mailutils/mu_auth.h>
 #include <mailutils/nls.h>
+#include <mailutils/filter.h>
+#include <mailutils/stream.h>
 
 #define DEFAULT_SPAMD_PORT 783
 
@@ -98,29 +100,28 @@ spamd_send_command (mu_stream_t stream, const char *fmt, ...)
   mu_stream_writeline (stream, buf, n);
 }
 
-static void
+static int
 spamd_send_message (mu_stream_t stream, mu_message_t msg)
 {
-  size_t size;
-  char buf[512];
-  mu_stream_t mstr;
+  int rc;
+  mu_stream_t mstr, flt;
 
-  mu_message_get_stream (msg, &mstr);
-  mu_stream_seek (mstr, 0, SEEK_SET, NULL);
-  while (mu_stream_readline (mstr, buf, sizeof (buf), &size) == 0
-	 && size > 0)
+  rc = mu_message_get_streamref (msg, &mstr);
+  if (rc)
+    return rc;
+  rc = mu_filter_create (&flt, mstr, "rfc822", MU_FILTER_ENCODE,
+			 MU_STREAM_READ|MU_STREAM_SEEK|MU_STREAM_NO_CLOSE);
+  if (rc)
     {
-      char *nl = NULL;
-      
-      if (buf[size-1] == '\n')
-	{
-	  size--;
-	  nl = "\r\n";
-	}
-      mu_stream_write (stream, buf, size, NULL);
-      if (nl)
-	mu_stream_write (stream, nl, 2, NULL);
+      mu_stream_destroy (&mstr);
+      return rc;
     }
+
+  rc = mu_stream_copy (stream, flt, 0);
+
+  mu_stream_destroy (&mstr);
+  mu_stream_destroy (&flt);
+  return rc;
 }
 
 static size_t
@@ -284,6 +285,9 @@ spamd_test (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
 		   (u_long) mu_sieve_get_message_num (mach));
     }
   
+  if (mu_sieve_is_dry_run (mach))
+    return 0;
+  
   if (mu_sieve_tag_lookup (tags, "host", &arg))
     host = arg->v.string;
   else
diff --git a/libmu_sieve/extensions/vacation.c b/libmu_sieve/extensions/vacation.c
index 753c4b9..2b19e23 100644
--- a/libmu_sieve/extensions/vacation.c
+++ b/libmu_sieve/extensions/vacation.c
@@ -42,7 +42,6 @@
 
 /* Build a mime response message from original message MSG. TEXT
    is the message text.
-   FIXME: This is for future use, when I add :mime tag
 */
 static int
 build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
@@ -50,25 +49,25 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
 {
   mu_mime_t mime = NULL;
   mu_message_t newmsg;
-  mu_stream_t stream, input, save_input = NULL;
+  mu_stream_t stream, input;
   mu_header_t hdr;
   mu_body_t body;
-  char buf[512];
-  char *header = "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n"
- 	       "Content-Transfer-Encoding: 8bit\n\n";
+  const char *header =
+    "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n"
+    "Content-Transfer-Encoding: 8bit\n\n";
   int rc;
-  size_t n;
   
   mu_mime_create (&mime, NULL, 0);
   mu_message_create (&newmsg, NULL);
   mu_message_get_body (newmsg, &body);
-  mu_body_get_stream (body, &stream);
 
   if ((rc = mu_memory_stream_create (&input, MU_STREAM_RDWR)))
     {
       mu_sieve_error (mach,
 		      _("cannot create temporary stream: %s"),
 		      mu_strerror (rc));
+      mu_mime_destroy (&mime);
+      mu_message_destroy (&newmsg, NULL);
       return 1;
     }
 
@@ -77,6 +76,9 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
       mu_sieve_error (mach,
 		      _("cannot open temporary stream: %s"),
 		      mu_strerror (rc));
+      mu_mime_destroy (&mime);
+      mu_message_destroy (&newmsg, NULL);
+      mu_stream_destroy (&input);
       return 1;
     }
   
@@ -91,19 +93,37 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
 	{
 	  header = "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n"
 	           "Content-Transfer-Encoding: base64\n\n";
-	  save_input = input;
 	  input = fstr;
 	}
     }
 
-  while (rc == 0
-	 && mu_stream_read (input, buf, sizeof buf, &n) == 0
-	 && n > 0)
-    rc = mu_stream_write (stream, buf, n, NULL);
+  rc = mu_body_get_streamref (body, &stream);
+  if (rc)
+    {
+      mu_sieve_error (mach,
+		      _("cannot get input body stream: %s"),
+		      mu_strerror (rc));
+      mu_mime_destroy (&mime);
+      mu_message_destroy (&newmsg, NULL);
+      mu_stream_destroy (&input);
+      return 1;
+    }
+
+  mu_stream_seek (input, 0, MU_SEEK_SET, NULL);
+  rc = mu_stream_copy (stream, input, 0);
+  if (rc)
+    {
+      mu_sieve_error (mach,
+		      _("stream copy failed: %s"),
+		      mu_strerror (rc));
+      mu_mime_destroy (&mime);
+      mu_message_destroy (&newmsg, NULL);
+      mu_stream_destroy (&input);
+      mu_stream_destroy (&stream);
+      return 1;
+    }
 
   mu_stream_destroy (&input);
-  if (save_input)
-    mu_stream_destroy (&save_input);
   
   mu_header_create (&hdr, header, strlen (header));
   mu_message_set_header (newmsg, hdr, NULL);
diff --git a/libproto/mbox/mbox.c b/libproto/mbox/mbox.c
index c81701e..51da14e 100644
--- a/libproto/mbox/mbox.c
+++ b/libproto/mbox/mbox.c
@@ -382,7 +382,8 @@ mbox_envelope_date (mu_envelope_t envelope, char *buf, size_t len,
 			       &n);
   if (status)
     return status;
-
+  mu_rtrim_cset (buffer, "\r\n");
+  
   /* Format:  "From [sender] [date]" */
   /* strlen ("From ") == 5 */
   if (n > 5 && (s = strchr (buffer + 5, ' ')) != NULL)
diff --git a/mailbox/amd.c b/mailbox/amd.c
index 450c7c0..6d1d855 100644
--- a/mailbox/amd.c
+++ b/mailbox/amd.c
@@ -1710,7 +1710,7 @@ amd_body_stream_seek (mu_stream_t str, mu_off_t off, mu_off_t *presult)
   
   amd_body_size (amdstr->body, &size);
 
-  if (off < 0 || off >= size)
+  if (off < 0 || off > size)
     return ESPIPE;
 
   amdstr->off = off;


hooks/post-receive
-- 
GNU Mailutils
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.