commit-mailutils
[Top][All Lists]
Advanced

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

[SCM] GNU Mailutils branch, stream-cleanup, updated. rel-2_1-74-g2613500


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, stream-cleanup, updated. rel-2_1-74-g2613500
Date: Thu, 29 Apr 2010 21:57:28 +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=2613500d4a50cf7d36e30eea6d7af915a38c8f7d

The branch, stream-cleanup has been updated
       via  2613500d4a50cf7d36e30eea6d7af915a38c8f7d (commit)
      from  9a6b436ab0a2f2567cdbd25ab15f037c178404c4 (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 2613500d4a50cf7d36e30eea6d7af915a38c8f7d
Author: Sergey Poznyakoff <address@hidden>
Date:   Thu Apr 29 23:24:12 2010 +0300

    Bugfixes.
    
    * examples/sfrom.c (main): Check return from mu_mailbox_messages_count.
    * include/mailutils/sys/stream.h (_MU_STR_WRT): New constant.
    * libproto/mbox/mbox.c (_msg_stream_setup): Fix 3rd argument to
    mu_streamref_create_abridged.
    * libproto/mbox/mboxscan.c (mbox_scan_internal): Don't use mailbox->stream
    directly, because its offsets may get shifted by observers. Use streamref
    instead.
    * mailbox/argcv.c (argcv_get): Do nothing if argc <= 0.
    * mailbox/mapfile_stream.c (_mapfile_seek): Fill the *presult.
    * mailbox/memory_stream.c (_memory_done): Remove leftover free.
    * mailbox/stream.c: Reorder functions.
    (_mu_stream_create): Increase reference count (i.e. set it to 1)
    before returning.
    (mu_stream_seek): Call _stream_flush_buffer instead of
    mu_stream_flush.
    (mu_stream_read_unbuffered): Return 0 on EOF.
    (mu_stream_write_unbuffered): Set _MU_STR_WRT bit.
    (mu_stream_readline, mu_stream_getdelim): Check the actual
    number of bytes read.
    (mu_stream_flush): Call flush method only if _MU_STR_WRT is set.
    Clear it.
    * mailbox/streamref.c (_streamref_seek): Optimization for off==0 and
    whence == MU_SEEK_CUR.
    (_streamref_seek): Return new offset in ppos.
    (mu_streamref_create_abridged): Set MU_STREAM_NO_CLOSE.
    * mailbox/memory_stream.c (_memory_seek) : Return new offset in presult.
    * mailbox/message_stream.c (_message_seek): Likewise.
    * mailbox/stdio_stream.c (stdio_seek): Fix prototype.

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

Summary of changes:
 examples/sfrom.c               |    7 +-
 include/mailutils/sys/stream.h |    5 +-
 libproto/mbox/mbox.c           |    2 +-
 libproto/mbox/mboxscan.c       |   10 +-
 mailbox/argcv.c                |    2 +
 mailbox/mapfile_stream.c       |    1 +
 mailbox/memory_stream.c        |    3 +-
 mailbox/message_stream.c       |    5 +-
 mailbox/stdio_stream.c         |    5 +-
 mailbox/stream.c               |  299 ++++++++++++++++++++--------------------
 mailbox/streamref.c            |   18 ++-
 11 files changed, 190 insertions(+), 167 deletions(-)

diff --git a/examples/sfrom.c b/examples/sfrom.c
index 3a79cef..8e6384c 100644
--- a/examples/sfrom.c
+++ b/examples/sfrom.c
@@ -53,7 +53,12 @@ main (int argc, const char **argv)
       exit (EXIT_FAILURE);
     }
 
-  mu_mailbox_messages_count (mbox, &total);
+  status = mu_mailbox_messages_count (mbox, &total);
+  if (status != 0)
+    {
+      mu_error ("mu_mailbox_messages_count: %s", mu_strerror (status));
+      exit (EXIT_FAILURE);
+    }
 
   for (msgno = 1; msgno <= total; msgno++)
     {
diff --git a/include/mailutils/sys/stream.h b/include/mailutils/sys/stream.h
index 07249aa..2800341 100644
--- a/include/mailutils/sys/stream.h
+++ b/include/mailutils/sys/stream.h
@@ -18,8 +18,9 @@
 #define _MAILUTILS_SYS_STREAM_H
 
 #define _MU_STR_DIRTY         0x1000    /* Buffer dirty */
-#define _MU_STR_ERR           0x2000    /* Permanent error state */
-#define _MU_STR_EOF           0x4000    /* EOF encountered */
+#define _MU_STR_WRT           0x2000    /* Unflushed write pending */
+#define _MU_STR_ERR           0x4000    /* Permanent error state */
+#define _MU_STR_EOF           0x8000    /* EOF encountered */
 
 #define _MU_STR_INTERN_MASK   0xf000
 
diff --git a/libproto/mbox/mbox.c b/libproto/mbox/mbox.c
index 7b167a0..7e16f4f 100644
--- a/libproto/mbox/mbox.c
+++ b/libproto/mbox/mbox.c
@@ -297,7 +297,7 @@ _msg_stream_setup (mu_message_t msg, mbox_message_t mum)
   
   status = mu_streamref_create_abridged (&stream,
                                         mum->mud->mailbox->stream,
-                                        mum->header_from_end,
+                                        mum->header_from_end + 1,
                                         mum->body);
   if (status == 0)
     status = mu_message_set_stream (msg, stream, mum);
diff --git a/libproto/mbox/mboxscan.c b/libproto/mbox/mboxscan.c
index dbbe316..127a360 100644
--- a/libproto/mbox/mboxscan.c
+++ b/libproto/mbox/mboxscan.c
@@ -302,7 +302,12 @@ mbox_scan_internal (mu_mailbox_t mailbox, mbox_message_t 
mum,
   newline = 1;
   errno = lines = inheader = inbody = 0;
 
-  stream = mailbox->stream;
+  status = mu_streamref_create (&stream, mailbox->stream);
+  if (status)
+    return status;
+  status = mu_stream_seek (stream, total, MU_SEEK_SET, NULL);
+  if (status)
+    return status;
   while ((status = mu_stream_readline (stream, buf, sizeof (buf), &n)) == 0
         && n != 0)
     {
@@ -396,7 +401,8 @@ mbox_scan_internal (mu_mailbox_t mailbox, mbox_message_t 
mum,
          DISPATCH_PROGRESS (mailbox, mud);
 
     } /* while */
-
+  mu_stream_destroy (&stream);
+  
   if (mum)
     {
       mum->body_end = total - newline;
diff --git a/mailbox/argcv.c b/mailbox/argcv.c
index c31836c..636b9af 100644
--- a/mailbox/argcv.c
+++ b/mailbox/argcv.c
@@ -447,6 +447,8 @@ argcv_get (const char *command, const char *delim, const 
char *cmnt,
 void
 argcv_free (int argc, char **argv)
 {
+  if (argc <= 0)
+    return;
   while (--argc >= 0)
     if (argv[argc])
       free (argv[argc]);
diff --git a/mailbox/mapfile_stream.c b/mailbox/mapfile_stream.c
index f0e18ce..66bcca4 100644
--- a/mailbox/mapfile_stream.c
+++ b/mailbox/mapfile_stream.c
@@ -334,6 +334,7 @@ _mapfile_seek (struct _mu_stream *str, mu_off_t off, int 
whence, mu_off_t *presu
   if (off < 0 || off > mfs->size)
     return EINVAL;
   mfs->offset = off;
+  *presult = off;
   return 0;
 }
 
diff --git a/mailbox/memory_stream.c b/mailbox/memory_stream.c
index dc83a55..1f388fb 100644
--- a/mailbox/memory_stream.c
+++ b/mailbox/memory_stream.c
@@ -38,7 +38,6 @@ _memory_done (mu_stream_t stream)
   struct _mu_memory_stream *mfs = (struct _mu_memory_stream *) stream;
   if (mfs && mfs->ptr != NULL)
     free (mfs->ptr);
-  free (mfs);
 }
 
 static int
@@ -189,7 +188,7 @@ _memory_seek (struct _mu_stream *stream, mu_off_t off, int 
whence,
   if (off < 0 || off > mfs->size)
     return EINVAL;
   mfs->offset = off;
-  
+  *presult = off;
   return 0;
 }
 
diff --git a/mailbox/message_stream.c b/mailbox/message_stream.c
index 93844ee..f5c3cc4 100644
--- a/mailbox/message_stream.c
+++ b/mailbox/message_stream.c
@@ -303,8 +303,8 @@ _message_done (mu_stream_t stream)
 }
 
 static int
-_message_seek (struct _mu_stream *stream, off_t off, int whence,
-              off_t *presult)
+_message_seek (struct _mu_stream *stream, mu_off_t off, int whence,
+              mu_off_t *presult)
 { 
   struct _mu_message_stream *s = (struct _mu_message_stream*) stream;
   mu_off_t size;
@@ -327,6 +327,7 @@ _message_seek (struct _mu_stream *stream, off_t off, int 
whence,
   if (off < 0 || off >= size)
     return s->stream.last_err = EINVAL;
   s->offset = off;
+  *presult = off;
   return 0;
 }
 
diff --git a/mailbox/stdio_stream.c b/mailbox/stdio_stream.c
index b35b796..d401270 100644
--- a/mailbox/stdio_stream.c
+++ b/mailbox/stdio_stream.c
@@ -128,7 +128,7 @@ stdio_size (struct _mu_stream *str, off_t *psize)
 }
 
 static int
-stdio_seek (struct _mu_stream *str, off_t off, int whence, off_t *presult)
+stdio_seek (struct _mu_stream *str, mu_off_t off, int whence, mu_off_t 
*presult)
 { 
   struct _mu_stdio_stream *fs = (struct _mu_stdio_stream *) str;
   /* FIXME */
@@ -150,8 +150,7 @@ stdio_seek (struct _mu_stream *str, off_t off, int whence, 
off_t *presult)
     return EINVAL;
 
   fs->offset = off;
-  if (presult)
-    *presult = fs->offset;
+  *presult = fs->offset;
   return 0;
 }
 
diff --git a/mailbox/stream.c b/mailbox/stream.c
index fdee5c4..8d9e1f9 100644
--- a/mailbox/stream.c
+++ b/mailbox/stream.c
@@ -50,6 +50,138 @@ _stream_seterror (struct _mu_stream *stream, int code, int 
perm)
   return code;
 }
 
+#define _stream_cleareof(s) ((s)->flags &= ~_MU_STR_EOF)
+#define _stream_advance_buffer(s,n) ((s)->cur += n, (s)->level -= n)
+#define _stream_buffer_offset(s) ((s)->cur - (s)->buffer)
+#define _stream_orig_level(s) ((s)->level + _stream_buffer_offset(s))
+
+static int
+_stream_fill_buffer (struct _mu_stream *stream)
+{
+  size_t n;
+  size_t rdn;
+  int rc = 0;
+  char c;
+    
+  switch (stream->buftype)
+    {
+    case mu_buffer_none:
+      return 0;
+       
+    case mu_buffer_full:
+      if (mu_stream_read_unbuffered (stream,
+                                    stream->buffer, stream->bufsize,
+                                    0,
+                                    &stream->level))
+       return 1;
+      break;
+       
+    case mu_buffer_line:
+      for (n = 0;
+          n < stream->bufsize
+            && (rc = mu_stream_read_unbuffered (stream,
+                                                &c, 1, 0, &rdn)) == 0
+            && rdn; n++)
+       {
+         stream->buffer[n] = c;
+         if (c == '\n')
+           break;
+       }
+      stream->level = n;
+      break;
+    }
+  stream->cur = stream->buffer;
+  return rc;
+}
+
+#define BUFFER_FULL_P(s) \
+  ((s)->cur + (s)->level == (s)->buffer + (s)->bufsize)
+
+static int
+_stream_buffer_full_p (struct _mu_stream *stream)
+{
+    switch (stream->buftype)
+      {
+      case mu_buffer_none:
+       break;
+       
+      case mu_buffer_line:
+       return BUFFER_FULL_P (stream)
+              || memchr (stream->cur, '\n', stream->level) != NULL;
+
+      case mu_buffer_full:
+       return BUFFER_FULL_P (stream);
+      }
+    return 0;
+}
+
+static int
+_stream_flush_buffer (struct _mu_stream *stream, int all)
+{
+  int rc;
+  char *end;
+                 
+  if (stream->flags & _MU_STR_DIRTY)
+    {
+      if ((stream->flags & MU_STREAM_SEEK)
+         && (rc = mu_stream_seek (stream,
+                                  - _stream_orig_level (stream),
+                                  MU_SEEK_CUR, NULL)))
+       return rc;
+
+      switch (stream->buftype)
+       {
+       case mu_buffer_none:
+           abort(); /* should not happen */
+           
+       case mu_buffer_full:
+         if ((rc = mu_stream_write_unbuffered (stream, stream->cur,
+                                               stream->level, 1, NULL)))
+           return rc;
+         break;
+           
+       case mu_buffer_line:
+         if (stream->level == 0)
+           break;
+         for (end = memchr (stream->cur, '\n', stream->level);
+              end;
+              end = memchr (stream->cur, '\n', stream->level))
+           {
+             size_t size = end - stream->cur + 1;
+             rc = mu_stream_write_unbuffered (stream,
+                                              stream->cur,
+                                              size, 1, NULL);
+             if (rc)
+               return rc;
+             _stream_advance_buffer (stream, size);
+           }
+         if ((all && stream->level) || BUFFER_FULL_P (stream))
+           {
+             rc = mu_stream_write_unbuffered (stream,
+                                              stream->cur,
+                                              stream->level,
+                                              1, NULL);
+             if (rc)
+               return rc;
+             _stream_advance_buffer (stream, stream->level);
+           }
+       }
+    }
+  if (stream->level)
+    {
+      if (stream->cur > stream->buffer)
+       memmove (stream->buffer, stream->cur, stream->level);
+    }
+  else
+    {
+      stream->flags &= ~_MU_STR_DIRTY;
+      stream->level = 0;
+    }
+  stream->cur = stream->buffer;
+  return 0;
+}
+
+
 mu_stream_t
 _mu_stream_create (size_t size, int flags)
 {
@@ -58,6 +190,7 @@ _mu_stream_create (size_t size, int flags)
     abort ();
   str = mu_zalloc (size);
   str->flags = flags;
+  mu_stream_ref (str);
   return str;
 }
 
@@ -137,11 +270,6 @@ mu_stream_eof (mu_stream_t stream)
   return stream->flags & _MU_STR_EOF;
 }
 
-#define _stream_cleareof(s) ((s)->flags &= ~_MU_STR_EOF)
-#define _stream_advance_buffer(s,n) ((s)->cur += n, (s)->level -= n)
-#define _stream_buffer_offset(s) ((s)->cur - (s)->buffer)
-#define _stream_orig_level(s) ((s)->level + _stream_buffer_offset(s))
-
 int
 mu_stream_seek (mu_stream_t stream, mu_off_t offset, int whence,
                mu_off_t *pres)
@@ -162,7 +290,7 @@ mu_stream_seek (mu_stream_t stream, mu_off_t offset, int 
whence,
       break;
 
     case MU_SEEK_CUR:
-       break;
+      break;
 
     case MU_SEEK_END: 
       bpos = _stream_buffer_offset (stream);
@@ -183,8 +311,8 @@ mu_stream_seek (mu_stream_t stream, mu_off_t offset, int 
whence,
       return _stream_seterror (stream, EINVAL, 1);
     }
 
-  if (mu_stream_flush (stream))
-    return -1;
+  if ((rc = _stream_flush_buffer (stream, 1)))
+    return rc;
   rc = stream->seek (stream, offset, whence, &res);
   if (rc)
     return _stream_seterror (stream, rc, 1);
@@ -247,15 +375,8 @@ mu_stream_read_unbuffered (mu_stream_t stream, void *buf, 
size_t size,
   if ((stream->flags & _MU_STR_EOF) || size == 0)
     {
       if (pnread)
-       {
-         *pnread = 0;
-         return 0;
-       }
-      else
-       {
-         _stream_seterror (stream, EIO, 0);
-         return EIO;
-       }
+       *pnread = 0;
+      return 0;
     }
     
     if (full_read)
@@ -277,8 +398,8 @@ mu_stream_read_unbuffered (mu_stream_t stream, void *buf, 
size_t size,
            stream->bytes_in += rdbytes;
            
          }
-       if (size)
-         rc = _stream_seterror (stream, EIO, 0);
+       if (size && rc)
+         rc = _stream_seterror (stream, rc, 0);
       }
     else
       {
@@ -349,136 +470,13 @@ mu_stream_write_unbuffered (mu_stream_t stream,
       if (rc == 0)
        stream->bytes_out += nwritten;
     }
+  stream->flags |= _MU_STR_WRT;
   if (pnwritten)
     *pnwritten = nwritten;
   _stream_seterror (stream, rc, rc != 0);
   return rc;
 }
 
-static int
-_stream_fill_buffer (struct _mu_stream *stream)
-{
-  size_t n;
-  int rc = 0;
-  char c;
-    
-  switch (stream->buftype)
-    {
-    case mu_buffer_none:
-      return 0;
-       
-    case mu_buffer_full:
-      if (mu_stream_read_unbuffered (stream,
-                                    stream->buffer, stream->bufsize,
-                                    0,
-                                    &stream->level))
-       return 1;
-      break;
-       
-    case mu_buffer_line:
-      for (n = 0;
-          n < stream->bufsize
-            && (rc = mu_stream_read_unbuffered (stream,
-                                                &c, 1, 0, NULL)) == 0; n++)
-       {
-         stream->buffer[n] = c;
-         if (c == '\n')
-           break;
-       }
-      stream->level = n;
-      break;
-    }
-  stream->cur = stream->buffer;
-  return rc;
-}
-
-#define BUFFER_FULL_P(s) \
-  ((s)->cur + (s)->level == (s)->buffer + (s)->bufsize)
-
-static int
-_stream_buffer_full_p (struct _mu_stream *stream)
-{
-    switch (stream->buftype)
-      {
-      case mu_buffer_none:
-       break;
-       
-      case mu_buffer_line:
-       return BUFFER_FULL_P (stream)
-              || memchr (stream->cur, '\n', stream->level) != NULL;
-
-      case mu_buffer_full:
-       return BUFFER_FULL_P (stream);
-      }
-    return 0;
-}
-
-static int
-_stream_flush_buffer (struct _mu_stream *stream, int all)
-{
-  int rc;
-  char *end;
-                 
-  if (stream->flags & _MU_STR_DIRTY)
-    {
-      if ((stream->flags & MU_STREAM_SEEK)
-         && (rc = mu_stream_seek (stream,
-                                  - _stream_orig_level (stream),
-                                  MU_SEEK_CUR, NULL)))
-       return rc;
-
-      switch (stream->buftype)
-       {
-       case mu_buffer_none:
-           abort(); /* should not happen */
-           
-       case mu_buffer_full:
-         if ((rc = mu_stream_write_unbuffered (stream, stream->cur,
-                                               stream->level, 1, NULL)))
-           return rc;
-         break;
-           
-       case mu_buffer_line:
-         if (stream->level == 0)
-           break;
-         for (end = memchr(stream->cur, '\n', stream->level);
-              end;
-              end = memchr(stream->cur, '\n', stream->level))
-           {
-             size_t size = end - stream->cur + 1;
-             rc = mu_stream_write_unbuffered (stream,
-                                              stream->cur,
-                                              size, 1, NULL);
-             if (rc)
-               return rc;
-             _stream_advance_buffer (stream, size);
-           }
-         if ((all && stream->level) || BUFFER_FULL_P (stream))
-           {
-             rc = mu_stream_write_unbuffered (stream,
-                                              stream->cur,
-                                              stream->level,
-                                              1, NULL);
-             if (rc)
-               return rc;
-             _stream_advance_buffer (stream, stream->level);
-           }
-       }
-    }
-  if (stream->level)
-    {
-      if (stream->cur > stream->buffer)
-       memmove (stream->buffer, stream->cur, stream->level);
-    }
-  else
-    {
-      stream->flags &= ~_MU_STR_DIRTY;
-      stream->level = 0;
-    }
-  stream->cur = stream->buffer;
-  return 0;
-}
-
 int
 mu_stream_read (mu_stream_t stream, void *buf, size_t size, size_t *pread)
 {
@@ -530,16 +528,17 @@ mu_stream_readline (mu_stream_t stream, char *buf, size_t 
size, size_t *pread)
 {
   int rc;
   char c;
-  size_t n = 0;
+  size_t n = 0, rdn;
     
   if (size == 0)
     return EIO;
     
   size--;
-  for (n = 0; n < size && (rc = mu_stream_read (stream, &c, 1, NULL)) == 0;
-       n++)
+  for (n = 0;
+       n < size && (rc = mu_stream_read (stream, &c, 1, &rdn)) == 0 && rdn;)
     {
       *buf++ = c;
+      n++;
       if (c == '\n')
        break;
     }
@@ -571,9 +570,10 @@ mu_stream_getdelim (mu_stream_t stream, char **pbuf, 
size_t *psize,
   for (;;)
     {
       char c;
+      size_t rdn;
 
-      rc = mu_stream_read (stream, &c, 1, NULL);
-      if (rc)
+      rc = mu_stream_read (stream, &c, 1, &rdn);
+      if (rc || rdn == 0)
        break;
        
       /* Make enough space for len+1 (for final NUL) bytes.  */
@@ -686,8 +686,9 @@ mu_stream_flush (mu_stream_t stream)
   rc = _stream_flush_buffer (stream, 1);
   if (rc)
     return rc;
-  if (stream->flush)
+  if ((stream->flags & _MU_STR_WRT) && stream->flush)
     return stream->flush (stream);
+  stream->flags &= ~_MU_STR_WRT;
   return 0;
 }
 
diff --git a/mailbox/streamref.c b/mailbox/streamref.c
index 6b9fad0..75d2209 100644
--- a/mailbox/streamref.c
+++ b/mailbox/streamref.c
@@ -129,6 +129,11 @@ _streamref_seek (struct _mu_stream *str, mu_off_t off, int 
whence,
       break;
 
     case MU_SEEK_CUR:
+      if (off == 0)
+       {
+         *ppos = sp->offset - sp->start;
+         return 0;
+       }
       off += cur;
       break;
 
@@ -139,10 +144,12 @@ _streamref_seek (struct _mu_stream *str, mu_off_t off, 
int whence,
 
   if (off < 0 || off >= size)
     return sp->stream.last_err = EINVAL;
-  return streamref_return (sp,
-                          mu_stream_seek (sp->transport,
-                                          sp->start + off, MU_SEEK_SET,
-                                          &sp->offset));
+  rc = mu_stream_seek (sp->transport, sp->start + off, MU_SEEK_SET,
+                      &sp->offset);
+  if (rc)
+    return streamref_return (sp, rc);
+  *ppos = sp->offset - sp->start;
+  return 0;
 }
 
 static int
@@ -223,7 +230,8 @@ mu_streamref_create_abridged (mu_stream_t *pref, 
mu_stream_t str,
   if (rc)
     return rc;
   mu_stream_get_flags (str, &flags);
-  sp = (struct _mu_streamref *) _mu_stream_create (sizeof (*sp), flags);
+  sp = (struct _mu_streamref *) _mu_stream_create (sizeof (*sp),
+                                                  flags | MU_STREAM_NO_CLOSE);
   if (!sp)
     return ENOMEM;
   mu_stream_ref (str);


hooks/post-receive
-- 
GNU Mailutils




reply via email to

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