commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-2.2-522-ga4b7feb


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-522-ga4b7feb
Date: Mon, 12 Dec 2011 12:16:25 +0000

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=a4b7febbcb907b96181361824fac23e24485c023

The branch, master has been updated
       via  a4b7febbcb907b96181361824fac23e24485c023 (commit)
       via  89669008fd50fee7403d896dcdee4506f72b2eea (commit)
       via  1e4c44886b7dd9d9995f60ae038e04b08ecbd786 (commit)
      from  c42e619475166b5a6385d52fa0ed5f301d9db0b8 (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 a4b7febbcb907b96181361824fac23e24485c023
Author: Sergey Poznyakoff <address@hidden>
Date:   Mon Dec 12 14:07:26 2011 +0200

    Fix possible output buffer overflow in base64 encoder.
    
    * libmailutils/filter/base64.c (_base64_encoder): Continue after
    incrementing nbytes.
    * mh/mhn.c: Additional error checking.

commit 89669008fd50fee7403d896dcdee4506f72b2eea
Author: Sergey Poznyakoff <address@hidden>
Date:   Mon Dec 12 13:42:20 2011 +0200

    Fix declaration of mu_sieve_vlist_do in libmu_sieve.

commit 1e4c44886b7dd9d9995f60ae038e04b08ecbd786
Author: Sergey Poznyakoff <address@hidden>
Date:   Mon Dec 12 13:09:19 2011 +0200

    Initialize standard I/O streams statically.
    
    This allows programmers to use them right away, much like their stdio
    counterparts.  The mu_stdstream_setup and friends can be used to
    re-initialize them, should the need be.
    
    * include/mailutils/sys/file_stream.h
    (_MU_FILE_STREAM_STATIC_FILENAME): New flag.
    (_mu_file_stream_setup): New proto.
    * include/mailutils/sys/logstream.h (_mu_log_stream_setup): New proto.
    * include/mailutils/sys/stream.h (_MU_STR_EVENT_BOOTSTRAP): New event
    code.
    (_mu_stream) <destroy>: New method.
    * libmailutils/stdstream/basestr.c: Define the three standard streams
    statically, use bootstrap event to initialize them.
    * libmailutils/stdstream/strerr.c (mu_stdstream_strerr_create): Accept
    tag==NULL.
    * libmailutils/stream/file_stream.c (fd_done): Do not free filename if
    _MU_FILE_STREAM_STATIC_FILENAME is set.
    (_mu_file_stream_setup): New function.
    * libmailutils/stream/logstream.c (NEXT): Check size before advancing
    buffer pointer.
    (_mu_log_stream_setup): New function.
    * libmailutils/stream/stream.c (_bootstrap_event): New macro.
    (mu_stream_destroy): If .destroy is defined, use it instead of free(2).
    (mu_stream_open,mu_stream_seek,mu_stream_set_buffer)
    (mu_stream_read,mu_stream_readdelim,mu_stream_getdelim)
    (mu_stream_write,mu_stream_size,mu_stream_wait)
    (mu_stream_truncate,mu_stream_shutdown): Call _bootstrap_event at the
    beginning.
    * libmailutils/tests/.gitignore: Add strin, strout.
    * libmailutils/tests/Makefile.am (noinst_PROGRAMS): Add strin, strout.
    (TESTSUITE_AT): Add stdstream tests.
    * libmailutils/tests/testsuite.at: Include stdstream tests.
    * libmailutils/tests/strerr.at: New test case.
    * libmailutils/tests/strin.at: Likewise.
    * libmailutils/tests/strout.at: Likewise.
    * libmailutils/tests/strin.c: New test program.
    * libmailutils/tests/strout.c: Likewise.

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

Summary of changes:
 include/mailutils/sieve.h                          |    2 +-
 include/mailutils/sys/file_stream.h                |    2 +
 include/mailutils/sys/logstream.h                  |    2 +
 include/mailutils/sys/stream.h                     |    2 +
 libmailutils/filter/base64.c                       |    4 +-
 libmailutils/stdstream/basestr.c                   |  141 ++++++++++++++++++--
 libmailutils/stdstream/strerr.c                    |   10 +-
 libmailutils/stream/file_stream.c                  |   24 ++--
 libmailutils/stream/logstream.c                    |   32 +++--
 libmailutils/stream/stream.c                       |   44 ++++++-
 libmailutils/tests/.gitignore                      |    2 +
 libmailutils/tests/Makefile.am                     |    5 +
 .../lstuid00.at => libmailutils/tests/strerr.at    |   24 ++--
 .../create01.at => libmailutils/tests/strin.at     |   25 ++--
 libmailutils/tests/{fsaf.c => strin.c}             |   68 ++++------
 .../lstuid00.at => libmailutils/tests/strout.at    |   23 ++--
 libmailutils/tests/{fsaf.c => strout.c}            |   71 +++++-----
 libmailutils/tests/testsuite.at                    |    5 +
 libmu_sieve/util.c                                 |    4 +-
 mh/mhn.c                                           |   16 ++-
 20 files changed, 354 insertions(+), 152 deletions(-)
 copy testsuite/lstuid00.at => libmailutils/tests/strerr.at (78%)
 copy imap4d/tests/create01.at => libmailutils/tests/strin.at (73%)
 copy libmailutils/tests/{fsaf.c => strin.c} (53%)
 copy testsuite/lstuid00.at => libmailutils/tests/strout.at (85%)
 copy libmailutils/tests/{fsaf.c => strout.c} (52%)

diff --git a/include/mailutils/sieve.h b/include/mailutils/sieve.h
index 0acad18..d8d60c0 100644
--- a/include/mailutils/sieve.h
+++ b/include/mailutils/sieve.h
@@ -187,7 +187,7 @@ int mu_sieve_match_part_checker (const char *name, 
mu_list_t tags,
                                 mu_list_t args);
 /* Operations in value lists */
 mu_sieve_value_t *mu_sieve_value_get (mu_list_t vlist, size_t index);
-int mu_sieve_vlist_do (mu_sieve_value_t * val, mu_list_action_t * ac,
+int mu_sieve_vlist_do (mu_sieve_value_t * val, mu_list_action_t ac,
                       void *data);
 int mu_sieve_vlist_compare (mu_sieve_value_t * a, mu_sieve_value_t * b,
                            mu_sieve_comparator_t comp,
diff --git a/include/mailutils/sys/file_stream.h 
b/include/mailutils/sys/file_stream.h
index 7905606..2255591 100644
--- a/include/mailutils/sys/file_stream.h
+++ b/include/mailutils/sys/file_stream.h
@@ -24,6 +24,7 @@
 #define _MU_FILE_STREAM_TEMP        0x01
 #define _MU_FILE_STREAM_ECHO_OFF    0x02
 #define _MU_FILE_STREAM_FD_BORROWED 0x04
+#define _MU_FILE_STREAM_STATIC_FILENAME 0x08
 
 struct _mu_file_stream
 {
@@ -36,5 +37,6 @@ struct _mu_file_stream
 
 int _mu_file_stream_create (struct _mu_file_stream **pstream, size_t size,
                            const char *filename, int fd, int flags);
+void _mu_file_stream_setup (struct _mu_file_stream *str);
 
 #endif
diff --git a/include/mailutils/sys/logstream.h 
b/include/mailutils/sys/logstream.h
index e437296..720bc2c 100644
--- a/include/mailutils/sys/logstream.h
+++ b/include/mailutils/sys/logstream.h
@@ -33,4 +33,6 @@ struct _mu_log_stream
   struct mu_locus locus;   /* Location */
 };
 
+void _mu_log_stream_setup (struct _mu_log_stream *sp, mu_stream_t transport);
+  
 #endif
diff --git a/include/mailutils/sys/stream.h b/include/mailutils/sys/stream.h
index 352173c..d3e8615 100644
--- a/include/mailutils/sys/stream.h
+++ b/include/mailutils/sys/stream.h
@@ -30,6 +30,7 @@
 #define _MU_STR_EVENT_FILLBUF   2
 #define _MU_STR_EVENT_FLUSHBUF  3
 #define _MU_STR_EVENT_CLOSE     4
+#define _MU_STR_EVENT_BOOTSTRAP 5
 
 #define _MU_STR_EVMASK(n) (1<<(n))
 
@@ -58,6 +59,7 @@ struct _mu_stream
   int (*open) (struct _mu_stream *);
   int (*close) (struct _mu_stream *);
   void (*done) (struct _mu_stream *);
+  void (*destroy) (struct _mu_stream *);
   int (*seek) (struct _mu_stream *, mu_off_t, mu_off_t *);
   int (*size) (struct _mu_stream *, mu_off_t *);
   int (*ctl) (struct _mu_stream *, int, int, void *);
diff --git a/libmailutils/filter/base64.c b/libmailutils/filter/base64.c
index d99cdc5..1ad2c67 100644
--- a/libmailutils/filter/base64.c
+++ b/libmailutils/filter/base64.c
@@ -267,12 +267,14 @@ _base64_encoder (void *xd,
        {
        case base64_init:
          break;
+
        case base64_newline:
          *optr++ = '\n';
          nbytes++;
          lp->cur_len = 0;
          lp->state = base64_rollback;
-         /* Fall through */
+         continue;
+
        case base64_rollback:
          if (lp->idx < 3)
            {
diff --git a/libmailutils/stdstream/basestr.c b/libmailutils/stdstream/basestr.c
index 74247f0..ec9ae29 100644
--- a/libmailutils/stdstream/basestr.c
+++ b/libmailutils/stdstream/basestr.c
@@ -28,10 +28,127 @@
 #include <mailutils/stream.h>
 #include <mailutils/stdstream.h>
 #include <mailutils/util.h>
+#include <mailutils/io.h>
+#include <mailutils/filter.h>
+#include <mailutils/sys/stream.h>
+#include <mailutils/sys/file_stream.h>
+#include <mailutils/sys/logstream.h>
 
-mu_stream_t mu_strin;
-mu_stream_t mu_strout;
-mu_stream_t mu_strerr;
+static void stdstream_flushall_setup (void);
+
+/* This event callback bootstraps standard I/O streams mu_strin and
+   mu_strout. It is invoked when the stream core emits the bootstrap
+   event for the stream. */
+static void
+std_bootstrap (struct _mu_stream *str, int code,
+              unsigned long lval, void *pval)
+{
+  struct _mu_file_stream *fstr = (struct _mu_file_stream *) str;
+  _mu_file_stream_setup (fstr);
+  str->event_cb = NULL;
+  str->event_mask = 0;
+  str->event_cb_data = 0;
+  fstr->stream.flags |= _MU_STR_OPEN;
+  mu_stream_set_buffer ((mu_stream_t) fstr, mu_buffer_line, 0);
+  stdstream_flushall_setup ();
+}
+
+/* This event callback bootstraps standard error stream (mu_strerr).
+   It is invoked when the stream core emits the bootstrap event for
+   the stream. */
+static void
+std_log_bootstrap (struct _mu_stream *str, int code,
+                  unsigned long lval, void *pval)
+{
+  struct _mu_log_stream *logstr = (struct _mu_log_stream *) str;
+  int yes = 1;
+  mu_stream_t errstr, transport;
+  int rc;
+  
+  rc = mu_stdio_stream_create (&errstr, MU_STDERR_FD, 0);
+  if (rc)
+    {
+      fprintf (stderr, "%s: cannot open error stream: %s\n",
+              mu_program_name ? mu_program_name : "<unknown>",
+              mu_strerror (rc));
+      abort ();
+    }
+  /* Make sure 2 is not closed when errstr is destroyed. */
+  mu_stream_ioctl (errstr, MU_IOCTL_FD, MU_IOCTL_FD_SET_BORROW, &yes);
+  if (!mu_program_name)
+    transport = errstr;
+  else
+    {
+      char *fltargs[3] = { "INLINE-COMMENT", };
+      mu_asprintf (&fltargs[1], "%s: ", mu_program_name);
+      fltargs[2] = NULL;
+      rc = mu_filter_create_args (&transport, errstr,
+                                 "INLINE-COMMENT",
+                                 2, (const char**)fltargs,
+                                 MU_FILTER_ENCODE, MU_STREAM_WRITE);
+      mu_stream_unref (errstr);
+      free (fltargs[1]);
+      if (rc)
+       {
+         fprintf (stderr,
+                  "%s: cannot open output filter stream: %s",
+                  mu_program_name ? mu_program_name : "<unknown>",
+                  mu_strerror (rc));
+         abort ();
+       }
+      mu_stream_set_buffer (transport, mu_buffer_line, 0);
+    }
+
+  str->event_cb = NULL;
+  str->event_mask = 0;
+  str->event_cb_data = 0;
+
+  _mu_log_stream_setup (logstr, transport);
+  stdstream_flushall_setup ();
+}
+
+/* The noop destroy function is necessary to prevent stream core from
+   freeing the stream on mu_stream_unref. */
+static void
+bootstrap_destroy (struct _mu_stream *str)
+{
+  /* Nothing */
+}
+
+/* Standard I/O streams: */
+static struct _mu_file_stream stdstream[2] = {
+  { { ref_count: 1,
+      buftype: mu_buffer_none,
+      flags: MU_STREAM_READ,
+      destroy: bootstrap_destroy,
+      event_cb: std_bootstrap,
+      event_mask: _MU_STR_EVMASK (_MU_STR_EVENT_BOOTSTRAP)
+    }, fd: MU_STDIN_FD, filename: "<stdin>",
+    flags: _MU_FILE_STREAM_FD_BORROWED|_MU_FILE_STREAM_STATIC_FILENAME },
+  { { ref_count: 1,
+      buftype: mu_buffer_none,
+      flags: MU_STREAM_WRITE,
+      event_cb: std_bootstrap,
+      event_mask: _MU_STR_EVMASK (_MU_STR_EVENT_BOOTSTRAP)
+    }, fd: MU_STDOUT_FD, filename: "<stdout>",
+    flags: _MU_FILE_STREAM_FD_BORROWED|_MU_FILE_STREAM_STATIC_FILENAME }
+};
+
+/* Standard error stream: */
+static struct _mu_log_stream default_strerr = {
+  { ref_count: 1,
+    buftype: mu_buffer_none,
+    flags: MU_STREAM_WRITE,
+    destroy: bootstrap_destroy,
+    event_cb: std_log_bootstrap,
+    event_mask: _MU_STR_EVMASK (_MU_STR_EVENT_BOOTSTRAP)
+  }
+};
+
+/* Pointers to these: */
+mu_stream_t mu_strin  = (mu_stream_t) &stdstream[MU_STDIN_FD];
+mu_stream_t mu_strout = (mu_stream_t) &stdstream[MU_STDOUT_FD];
+mu_stream_t mu_strerr = (mu_stream_t) &default_strerr;
 
 static void
 stdstream_flushall (void *data MU_ARG_UNUSED)
@@ -41,7 +158,17 @@ stdstream_flushall (void *data MU_ARG_UNUSED)
   mu_stream_flush (mu_strerr);
 }
 
-static int stdstream_flushall_setup = 0;
+static void
+stdstream_flushall_setup (void)
+{
+  static int _setup = 0;
+
+  if (!_setup)
+    {
+      mu_onexit (stdstream_flushall, NULL);
+      _setup = 1;
+    }
+}
 
 void
 mu_stdstream_setup (int flags)
@@ -120,11 +247,7 @@ mu_stdstream_setup (int flags)
        abort ();
     }
 
-  if (!stdstream_flushall_setup)
-    {
-      mu_onexit (stdstream_flushall, NULL);
-      stdstream_flushall_setup = 1;
-    }
+  stdstream_flushall_setup ();
 }
 
 int
diff --git a/libmailutils/stdstream/strerr.c b/libmailutils/stdstream/strerr.c
index 7cc621d..cf03418 100644
--- a/libmailutils/stdstream/strerr.c
+++ b/libmailutils/stdstream/strerr.c
@@ -50,7 +50,7 @@ mu_stdstream_strerr_create (mu_stream_t *plogger, int type, 
int facility,
        if (rc)
          {
            fprintf (stderr, _("%s: cannot open error stream: %s\n"),
-                    tag, mu_strerror (rc));
+                    tag ? tag : "<unknown>", mu_strerror (rc));
            return MU_ERR_FAILURE;
          }
         /* Make sure 2 is not closed when str is destroyed.
@@ -74,7 +74,7 @@ mu_stdstream_strerr_create (mu_stream_t *plogger, int type, 
int facility,
              {
                fprintf (stderr,
                         _("%s: cannot open output filter stream: %s"),
-                        tag, mu_strerror (rc));
+                        tag ? tag : "<unknown>", mu_strerror (rc));
                return MU_ERR_FAILURE;
              }
            mu_stream_set_buffer (transport, mu_buffer_line, 0);
@@ -88,14 +88,14 @@ mu_stdstream_strerr_create (mu_stream_t *plogger, int type, 
int facility,
       if (rc)
        {
          fprintf (stderr, _("%s: cannot create syslog stream: %s\n"),
-                  tag, mu_strerror (rc));
+                  tag ? tag : "<unknown>", mu_strerror (rc));
          return MU_ERR_FAILURE;
        }
       break;
 
     default:
       fprintf (stderr, _("%s: cannot create error stream: %s\n"),
-              tag, mu_strerror (EINVAL));
+              tag ? tag : "<unknown>", mu_strerror (EINVAL));
       return EINVAL;
     }
 
@@ -104,7 +104,7 @@ mu_stdstream_strerr_create (mu_stream_t *plogger, int type, 
int facility,
   if (rc)
     {
       fprintf (stderr, _("%s: cannot open logger stream: %s\n"),
-              tag , mu_strerror (rc));
+              tag ? tag : "<unknown>", mu_strerror (rc));
       return MU_ERR_FAILURE;
     }
   return 0;
diff --git a/libmailutils/stream/file_stream.c 
b/libmailutils/stream/file_stream.c
index 9a7dc6b..2971408 100644
--- a/libmailutils/stream/file_stream.c
+++ b/libmailutils/stream/file_stream.c
@@ -153,7 +153,7 @@ fd_done (struct _mu_stream *str)
   struct _mu_file_stream *fstr = (struct _mu_file_stream *) str;
   if (fstr->fd != -1)
     fd_close (str);
-  if (fstr->filename)
+  if (fstr->filename && !(fstr->flags & _MU_FILE_STREAM_STATIC_FILENAME))
     free (fstr->filename);
   if (fstr->echo_state)
     free (fstr->echo_state);
@@ -312,15 +312,9 @@ fd_truncate (mu_stream_t stream, mu_off_t size)
   return 0;
 }
 
-int
-_mu_file_stream_create (struct _mu_file_stream **pstream, size_t size,
-                       const char *filename, int fd, int flags)
+void
+_mu_file_stream_setup (struct _mu_file_stream *str)
 {
-  struct _mu_file_stream *str =
-    (struct _mu_file_stream *) _mu_stream_create (size, flags);
-  if (!str)
-    return ENOMEM;
-
   str->stream.read = fd_read;
   str->stream.write = fd_write;
   str->stream.open = fd_open;
@@ -331,6 +325,18 @@ _mu_file_stream_create (struct _mu_file_stream **pstream, 
size_t size,
   str->stream.ctl = fd_ioctl;
   str->stream.wait = fd_wait;
   str->stream.truncate = fd_truncate;
+}  
+
+int
+_mu_file_stream_create (struct _mu_file_stream **pstream, size_t size,
+                       const char *filename, int fd, int flags)
+{
+  struct _mu_file_stream *str =
+    (struct _mu_file_stream *) _mu_stream_create (size, flags);
+  if (!str)
+    return ENOMEM;
+
+  _mu_file_stream_setup (str);
 
   if (filename)
     str->filename = mu_strdup (filename);
diff --git a/libmailutils/stream/logstream.c b/libmailutils/stream/logstream.c
index 80a8e09..94b35f5 100644
--- a/libmailutils/stream/logstream.c
+++ b/libmailutils/stream/logstream.c
@@ -103,7 +103,7 @@ _log_write (struct _mu_stream *str, const char *buf, size_t 
size,
   int rc;
   int escape_error = 0;
   
-#define NEXT do { buf++; size--; if (size == 0) return EINVAL; } while (0)
+#define NEXT do { if (size == 0) return EINVAL; buf++; size--; } while (0)
 #define READNUM(n) do {                                \
     unsigned __x = 0;                          \
     if (*buf != '<')                           \
@@ -470,17 +470,11 @@ _log_ctl (struct _mu_stream *str, int code, int opcode, 
void *arg)
   return 0;
 }
 
-int
-mu_log_stream_create (mu_stream_t *pstr, mu_stream_t transport)
+void
+_mu_log_stream_setup (struct _mu_log_stream *sp, mu_stream_t transport)
 {
-  struct _mu_log_stream *sp;
   mu_stream_t stream;
-  int rc;
   
-  sp = (struct _mu_log_stream *)
-    _mu_stream_create (sizeof (*sp), MU_STREAM_WRITE);
-  if (!sp)
-    return ENOMEM;
   sp->base.write = _log_write;
   sp->base.flush = _log_flush;
   sp->base.close = _log_close;
@@ -494,13 +488,21 @@ mu_log_stream_create (mu_stream_t *pstr, mu_stream_t 
transport)
   
   stream = (mu_stream_t) sp;
   mu_stream_set_buffer (stream, mu_buffer_line, 0);
-  rc = mu_stream_open (stream);
-  if (rc)
-    mu_stream_destroy (&stream);
-  else
-    *pstr = stream;
+}
 
-  return rc;
+int
+mu_log_stream_create (mu_stream_t *pstr, mu_stream_t transport)
+{
+  struct _mu_log_stream *sp;
+  
+  sp = (struct _mu_log_stream *)
+    _mu_stream_create (sizeof (*sp), MU_STREAM_WRITE);
+  if (!sp)
+    return ENOMEM;
+  _mu_log_stream_setup (sp, transport);
+  *pstr = (mu_stream_t) sp;
+  
+  return 0;
 }
 
 
diff --git a/libmailutils/stream/stream.c b/libmailutils/stream/stream.c
index 7078d74..2669a17 100644
--- a/libmailutils/stream/stream.c
+++ b/libmailutils/stream/stream.c
@@ -46,6 +46,19 @@ size_t mu_stream_default_buffer_size = MU_STREAM_DEFBUFSIZ;
     }                                                          \
   while (0)
 
+#define _bootstrap_event(stream)                                           \
+  do                                                                       \
+    {                                                                      \
+      if ((stream)->event_cb &&                                                
    \
+          ((stream)->event_mask & _MU_STR_EVMASK(_MU_STR_EVENT_BOOTSTRAP))) \
+       {                                                                   \
+         (stream)->event_cb (stream, _MU_STR_EVENT_BOOTSTRAP, 0, NULL);    \
+         (stream)->event_mask &= ~_MU_STR_EVMASK(_MU_STR_EVENT_BOOTSTRAP); \
+       }                                                                   \
+    }                                                                      \
+  while (0)
+  
+
 #define _stream_stat_incr(s, k, n) \
   (((s)->statmask & MU_STREAM_STAT_MASK(k)) ? ((s)->statbuf[k] += n) : 0)
 
@@ -292,7 +305,10 @@ mu_stream_destroy (mu_stream_t *pstream)
          mu_stream_close (str);
          if (str->done)
            str->done (str);
-         free (str);
+         if (str->destroy)
+           str->destroy (str);
+         else
+           free (str);
          *pstream = NULL;
        }
     }
@@ -336,6 +352,7 @@ mu_stream_open (mu_stream_t stream)
 
   if (stream->flags & _MU_STR_OPEN)
     return MU_ERR_OPEN;
+  _bootstrap_event (stream);
   if (stream->open)
     {
       if ((rc = stream->open (stream)))
@@ -399,6 +416,7 @@ mu_stream_seek (mu_stream_t stream, mu_off_t offset, int 
whence,
   int rc;
   mu_off_t size;
   
+  _bootstrap_event (stream);
   if (!(stream->flags & _MU_STR_OPEN))
     {
       if (stream->open)
@@ -551,6 +569,8 @@ int
 mu_stream_set_buffer (mu_stream_t stream, enum mu_buffer_type type,
                      size_t size)
 {
+  _bootstrap_event (stream);
+  
   if (size == 0)
     size = mu_stream_default_buffer_size;
 
@@ -717,6 +737,8 @@ _stream_write_unbuffered (mu_stream_t stream,
 int
 mu_stream_read (mu_stream_t stream, void *buf, size_t size, size_t *pread)
 {
+  _bootstrap_event (stream);
+  
   if (!(stream->flags & _MU_STR_OPEN))
     {
       if (stream->open)
@@ -857,6 +879,8 @@ mu_stream_readdelim (mu_stream_t stream, char *buf, size_t 
size,
 {
   int rc;
   
+  _bootstrap_event (stream);
+  
   if (size == 0)
     return EINVAL;
 
@@ -904,7 +928,9 @@ mu_stream_getdelim (mu_stream_t stream, char **pbuf, size_t 
*psize,
   char *lineptr = *pbuf;
   size_t n = *psize;
   size_t cur_len = 0;
-    
+
+  _bootstrap_event (stream);
+  
   if (!(stream->flags & _MU_STR_OPEN))
     {
       if (stream->open)
@@ -987,7 +1013,7 @@ int
 mu_stream_getline (mu_stream_t stream, char **pbuf, size_t *psize,
                   size_t *pread)
 {
-    return mu_stream_getdelim (stream, pbuf, psize, '\n', pread);
+  return mu_stream_getdelim (stream, pbuf, psize, '\n', pread);
 }
 
 int
@@ -995,6 +1021,8 @@ mu_stream_write (mu_stream_t stream, const void *buf, 
size_t size,
                 size_t *pnwritten)
 {
   int rc = 0;
+
+  _bootstrap_event (stream);
   
   if (!(stream->flags & _MU_STR_OPEN))
     {
@@ -1063,6 +1091,7 @@ mu_stream_flush (mu_stream_t stream)
   
   if (!stream)
     return EINVAL;
+  _bootstrap_event (stream);
   if (!(stream->flags & _MU_STR_OPEN))
     {
       if (stream->open)
@@ -1104,7 +1133,8 @@ mu_stream_size (mu_stream_t stream, mu_off_t *psize)
 {
   int rc;
   mu_off_t size;
-  
+
+  _bootstrap_event (stream);
   if (!(stream->flags & _MU_STR_OPEN))
     {
       if (stream->open)
@@ -1126,6 +1156,7 @@ mu_stream_size (mu_stream_t stream, mu_off_t *psize)
 int
 mu_stream_ioctl (mu_stream_t stream, int family, int opcode, void *ptr)
 {
+  _bootstrap_event (stream);
   if (stream->ctl == NULL)
     return ENOSYS;
   return stream->ctl (stream, family, opcode, ptr);
@@ -1138,6 +1169,7 @@ mu_stream_wait (mu_stream_t stream, int *pflags, struct 
timeval *tvp)
 
   if (stream == NULL)
     return EINVAL;
+  _bootstrap_event (stream);
 #if 0
   /* NOTE: Sometimes mu_stream_wait is called after a failed mu_stream_open.
      In particular, this is needed for a TCP stream opened with a
@@ -1181,6 +1213,8 @@ mu_stream_wait (mu_stream_t stream, int *pflags, struct 
timeval *tvp)
 int
 mu_stream_truncate (mu_stream_t stream, mu_off_t size)
 {
+  _bootstrap_event (stream);
+  
   if (!(stream->flags & _MU_STR_OPEN))
     {
       if (stream->open)
@@ -1203,6 +1237,8 @@ int
 mu_stream_shutdown (mu_stream_t stream, int how)
 {
   int rc;
+
+  _bootstrap_event (stream);
   
   if (!(stream->flags & _MU_STR_OPEN))
     {
diff --git a/libmailutils/tests/.gitignore b/libmailutils/tests/.gitignore
index aa5a1f3..d67519f 100644
--- a/libmailutils/tests/.gitignore
+++ b/libmailutils/tests/.gitignore
@@ -18,6 +18,8 @@ mailcap
 prop
 scantime
 strftime
+strin
+strout
 url-comp
 url-parse
 wicket
diff --git a/libmailutils/tests/Makefile.am b/libmailutils/tests/Makefile.am
index 01c01ac..1cb2968 100644
--- a/libmailutils/tests/Makefile.am
+++ b/libmailutils/tests/Makefile.am
@@ -53,6 +53,8 @@ noinst_PROGRAMS = \
  prop\
  scantime\
  strftime\
+ strin\
+ strout\
  tempfile\
  url-comp\
  url-parse\
@@ -85,6 +87,9 @@ TESTSUITE_AT = \
  prop.at\
  scantime.at\
  strftime.at\
+ strerr.at\
+ strin.at\
+ strout.at\
  testsuite.at\
  url.at\
  url-comp.at\
diff --git a/testsuite/lstuid00.at b/libmailutils/tests/strerr.at
similarity index 78%
copy from testsuite/lstuid00.at
copy to libmailutils/tests/strerr.at
index ee37189..1bdbe6f 100644
--- a/testsuite/lstuid00.at
+++ b/libmailutils/tests/strerr.at
@@ -14,18 +14,24 @@
 # You should have received a copy of the GNU General Public License
 # along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>.
 
-AT_SETUP([Assigning UIDs])
+AT_SETUP([strerr])
+AT_KEYWORDS([stdstream])
 
 AT_CHECK([
-MUT_MBCOPY($abs_top_srcdir/testsuite/spool/mbox1)
-lstuid mbox:mbox1
+strout -err now is the time for all good men
 ],
 [0],
-[1: 1
-2: 2
-3: 3
-4: 4
-5: 5
+[],
+[strout: now
+strout: is
+strout: the
+strout: time
+strout: for
+strout: all
+strout: good
+strout: men
 ])
 
-AT_CLEANUP
\ No newline at end of file
+AT_CLEANUP
+
+
diff --git a/imap4d/tests/create01.at b/libmailutils/tests/strin.at
similarity index 73%
copy from imap4d/tests/create01.at
copy to libmailutils/tests/strin.at
index 986eb86..ebc6e41 100644
--- a/imap4d/tests/create01.at
+++ b/libmailutils/tests/strin.at
@@ -14,25 +14,24 @@
 # You should have received a copy of the GNU General Public License
 # along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>.
 
-AT_SETUP([create])
-AT_KEYWORDS([create create00])
+AT_SETUP([strin])
+AT_KEYWORDS([stdstream])
 
-AT_CHECK([
-AT_DATA([input],[dnl
-1 create flat
-X LOGOUT
+AT_DATA([input],
+[Omnis enim res, quae dando non deficit,
+dum habetur et non datur, nondum habetur,
+quomodo habenda est.
 ])
 
-imap4d IMAP4D_OPTIONS < input | tr -d '\r'
-find . -name flat
+AT_CHECK([
+strin < input
 ],
 [0],
-[* PREAUTH IMAP4rev1 Test mode
-1 OK CREATE Completed
-* BYE Session terminating.
-X OK LOGOUT Completed
-./flat
+[Omnis enim res, quae dando non deficit,
+dum habetur et non datur, nondum habetur,
+quomodo habenda est.
 ])
 
 AT_CLEANUP
 
+
diff --git a/libmailutils/tests/fsaf.c b/libmailutils/tests/strin.c
similarity index 53%
copy from libmailutils/tests/fsaf.c
copy to libmailutils/tests/strin.c
index d548744..67fb2db 100644
--- a/libmailutils/tests/fsaf.c
+++ b/libmailutils/tests/strin.c
@@ -16,57 +16,49 @@
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
-#endif
-#include <stdio.h>
+#endif 
 #include <stdlib.h>
-#include <unistd.h>
-#include <mailutils/types.h>
-#include <mailutils/error.h>
+#include <stdio.h>
+#include <string.h>
+#include <mailutils/stream.h>
+#include <mailutils/stdstream.h>
+#include <mailutils/diag.h>
 #include <mailutils/errno.h>
-#include <mailutils/util.h>
 
 int
 main (int argc, char **argv)
 {
-  int i;
-  int mode = MU_FILE_SAFETY_OWNER_MISMATCH, rc, m;
-  mu_list_t idlist;
-  uid_t uid;
+  int i, rc;
+  int echo_state = 0;
+  size_t n;
+  char buf[80];
 
-  if (argc == 1)
-    {
-      mu_error ("usage: %s [+-]mode... file...", argv[0]);
-      exit (1);
-    }
-  
-  rc = mu_list_create (&idlist);
-  if (rc)
-    {
-      mu_error ("mu_list_create: %s", mu_strerror (rc));
-      exit (1);
-    }
-  uid = getuid ();
-  
   for (i = 1; i < argc; i++)
     {
-      if (argv[i][0] == '-' || argv[i][0] == '+')
+      char *arg = argv[i];
+      if (arg[0] == '-')
        {
-         rc = mu_file_safety_name_to_code (argv[i] + 1, &m);
-         if (rc)
+         if (strcmp (arg, "-noecho") == 0)
            {
-             mu_error ("%s: %s", argv[i], mu_strerror (rc));
-             exit (1);
+             MU_ASSERT (mu_stream_ioctl (mu_strin, MU_IOCTL_ECHO,
+                                         MU_IOCTL_OP_SET,
+                                         &echo_state));
+             echo_state = 1;
            }
-         if (argv[i][0] == '-')
-           mode &= ~m;
          else
-           mode |= m;
-       }
-      else
-       {
-         rc = mu_file_safety_check (argv[i], mode, uid, idlist);
-         printf ("%s: %s\n", argv[i], mu_strerror (rc));
+           {
+             fprintf (stderr, "usage: %s [-noecho]\n", argv[0]);
+             return 1;
+           }
        }
     }
-  exit (0);
+       
+  while ((rc = mu_stream_read (mu_strin, buf, sizeof (buf), &n) == 0) &&
+        n > 0)
+    fwrite (buf, 1, n, stdout);
+
+  if (echo_state)
+    MU_ASSERT (mu_stream_ioctl (mu_strin, MU_IOCTL_ECHO, MU_IOCTL_OP_SET,
+                               &echo_state));
+  return 0;
 }
diff --git a/testsuite/lstuid00.at b/libmailutils/tests/strout.at
similarity index 85%
copy from testsuite/lstuid00.at
copy to libmailutils/tests/strout.at
index ee37189..c58f719 100644
--- a/testsuite/lstuid00.at
+++ b/libmailutils/tests/strout.at
@@ -14,18 +14,23 @@
 # You should have received a copy of the GNU General Public License
 # along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>.
 
-AT_SETUP([Assigning UIDs])
+AT_SETUP([strout])
+AT_KEYWORDS([stdstream])
 
 AT_CHECK([
-MUT_MBCOPY($abs_top_srcdir/testsuite/spool/mbox1)
-lstuid mbox:mbox1
+strout now is the time for all good men
 ],
 [0],
-[1: 1
-2: 2
-3: 3
-4: 4
-5: 5
+[now
+is
+the
+time
+for
+all
+good
+men
 ])
 
-AT_CLEANUP
\ No newline at end of file
+AT_CLEANUP
+
+
diff --git a/libmailutils/tests/fsaf.c b/libmailutils/tests/strout.c
similarity index 52%
copy from libmailutils/tests/fsaf.c
copy to libmailutils/tests/strout.c
index d548744..d9913a5 100644
--- a/libmailutils/tests/fsaf.c
+++ b/libmailutils/tests/strout.c
@@ -16,57 +16,60 @@
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
-#endif
-#include <stdio.h>
+#endif 
 #include <stdlib.h>
-#include <unistd.h>
-#include <mailutils/types.h>
-#include <mailutils/error.h>
-#include <mailutils/errno.h>
-#include <mailutils/util.h>
+#include <stdio.h>
+#include <string.h>
+#include <mailutils/stream.h>
+#include <mailutils/stdstream.h>
+#include <mailutils/diag.h>
 
 int
 main (int argc, char **argv)
 {
+  mu_stream_t str = mu_strout;
   int i;
-  int mode = MU_FILE_SAFETY_OWNER_MISMATCH, rc, m;
-  mu_list_t idlist;
-  uid_t uid;
-
-  if (argc == 1)
-    {
-      mu_error ("usage: %s [+-]mode... file...", argv[0]);
-      exit (1);
-    }
   
-  rc = mu_list_create (&idlist);
-  if (rc)
+  if (argc == 1)
     {
-      mu_error ("mu_list_create: %s", mu_strerror (rc));
-      exit (1);
+      fprintf (stderr, "usage: %s: word|option [word|option...]\n", argv[0]);
+      fprintf (stderr, "options are: -out, -err, -reset\n");
+      return 1;
     }
-  uid = getuid ();
+
+  mu_set_program_name (argv[0]);
   
   for (i = 1; i < argc; i++)
     {
-      if (argv[i][0] == '-' || argv[i][0] == '+')
+      char *arg = argv[i];
+      if (arg[0] == '-')
        {
-         rc = mu_file_safety_name_to_code (argv[i] + 1, &m);
-         if (rc)
+         if (strcmp (arg, "-out") == 0)
+           str = mu_strout;
+         else if (strcmp (arg, "-err") == 0)
+           str = mu_strerr;
+         else if (strcmp (arg, "-reset") == 0)
            {
-             mu_error ("%s: %s", argv[i], mu_strerror (rc));
-             exit (1);
+             if (str == mu_strout)
+               {
+                 mu_stdstream_setup (MU_STDSTREAM_RESET_STROUT);
+                 str = mu_strout;
+               }
+             else
+               {
+                 mu_stdstream_setup (MU_STDSTREAM_RESET_STRERR);
+                 str = mu_strerr;
+               }
            }
-         if (argv[i][0] == '-')
-           mode &= ~m;
          else
-           mode |= m;
+           {
+             fprintf (stderr, "%s: unrecognized option %s\n", argv[0], arg);
+             return 1;
+           }
        }
       else
-       {
-         rc = mu_file_safety_check (argv[i], mode, uid, idlist);
-         printf ("%s: %s\n", argv[i], mu_strerror (rc));
-       }
+       mu_stream_printf (str, "%s\n", arg);
     }
-  exit (0);
+  
+  return 0;
 }
diff --git a/libmailutils/tests/testsuite.at b/libmailutils/tests/testsuite.at
index 9235686..888c25a 100644
--- a/libmailutils/tests/testsuite.at
+++ b/libmailutils/tests/testsuite.at
@@ -54,6 +54,11 @@ AT_CLEANUP
 
 AT_INIT
 
+AT_BANNER([Standard streams])
+m4_include([strin.at])
+m4_include([strout.at])
+m4_include([strerr.at])
+
 m4_include([list.at])
 m4_include([address.at])
 m4_include([wordsplit.at])
diff --git a/libmu_sieve/util.c b/libmu_sieve/util.c
index 6dddfb4..bb0345d 100644
--- a/libmu_sieve/util.c
+++ b/libmu_sieve/util.c
@@ -419,7 +419,7 @@ mu_sieve_tag_lookup (mu_list_t taglist, char *name, 
mu_sieve_value_t **arg)
 }
 
 int
-mu_sieve_vlist_do (mu_sieve_value_t *val, mu_list_action_t *ac, void *data)
+mu_sieve_vlist_do (mu_sieve_value_t *val, mu_list_action_t ac, void *data)
 {
   switch (val->type)
     {
@@ -428,7 +428,7 @@ mu_sieve_vlist_do (mu_sieve_value_t *val, mu_list_action_t 
*ac, void *data)
       return mu_list_foreach (val->v.list, ac, data);
       
     default:
-      return -1;
+      return EINVAL;
     }
 }
 
diff --git a/mh/mhn.c b/mh/mhn.c
index 4882fc9..ead6c83 100644
--- a/mh/mhn.c
+++ b/mh/mhn.c
@@ -2187,9 +2187,14 @@ finish_text_msg (struct compose_env *env, mu_message_t 
*msg, int ascii)
                             MU_STREAM_READ);
       if (rc == 0)
        {
-         mu_stream_copy (output, fstr, 0, NULL);
+         rc = mu_stream_copy (output, fstr, 0, NULL);
          mu_stream_destroy (&fstr);
          mu_message_unref (*msg);
+         if (rc)
+           {
+             mu_diag_funcall (MU_DIAG_ERROR, "mu_stream_copy", NULL, rc);
+             exit (1);
+           }
          *msg = newmsg;
        }
       else
@@ -2533,8 +2538,13 @@ edit_mime (char *cmd, struct compose_env *env, 
mu_message_t *msg, int level)
 
   mu_message_get_body (*msg, &body);
   mu_body_get_streamref (body, &out);
-  mu_stream_copy (out, fstr, 0, NULL);
-
+  rc = mu_stream_copy (out, fstr, 0, NULL);
+  if (rc)
+    {
+      mu_diag_funcall (MU_DIAG_ERROR, "mu_stream_copy", NULL, rc);
+      exit (1);
+    }
+  
   mu_stream_close (out);
   mu_stream_destroy (&out);
   mu_stream_destroy (&fstr);


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]