diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-02-13 16:31:09 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-02-13 16:31:09 +0000 |
commit | 5ccdea07bf2b7f97d015b8010774c567a22edfc7 (patch) | |
tree | 9c1c4b325709bbe573e88990d45c4f76a288fa53 /mailbox | |
parent | 100ab145052321cf5807783921cdc603581910fc (diff) | |
download | mailutils-5ccdea07bf2b7f97d015b8010774c567a22edfc7.tar.gz mailutils-5ccdea07bf2b7f97d015b8010774c567a22edfc7.tar.bz2 |
(stream_seek): New function.
Diffstat (limited to 'mailbox')
-rw-r--r-- | mailbox/stream.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/mailbox/stream.c b/mailbox/stream.c index 5ca33e108..166ae924e 100644 --- a/mailbox/stream.c +++ b/mailbox/stream.c @@ -110,6 +110,9 @@ stream_close (stream_t stream) { if (stream == NULL) return EINVAL; + if (stream->state == MU_STREAM_STATE_CLOSE) + return 0; + stream->state = MU_STREAM_STATE_CLOSE; /* Clear the buffer of any residue left. */ if (stream->rbuffer.base) @@ -704,6 +707,41 @@ stream_sequential_write (stream_t stream, char *buf, size_t size) } int +stream_seek (stream_t stream, off_t off, int whence) +{ + size_t size = 0; + size_t pos; + int rc; + + if ((rc = stream_size (stream, &size))) + return rc; + + switch (whence) + { + case SEEK_SET: + pos = off; + break; + + case SEEK_CUR: + pos = off + stream->offset; + break; + + case SEEK_END: + pos = size + off; + break; + + default: + return EINVAL; + } + + if (pos > size) + return EIO; + + stream->offset = pos; + return 0; +} + +int stream_strerror (stream_t stream, char **p) { if (stream == NULL) |