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 <g...@gnu.org.ua> 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 _______________________________________________ Commit-mailutils mailing list Commit-mailutils@gnu.org http://lists.gnu.org/mailman/listinfo/commit-mailutils