[dovecot-cvs] dovecot/src/lib istream-file.c,1.9,1.10
cras at procontrol.fi
cras at procontrol.fi
Wed Oct 29 15:37:04 EET 2003
Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv16742/lib
Modified Files:
istream-file.c
Log Message:
Changed to use pread() with files.
Index: istream-file.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/istream-file.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- istream-file.c 26 Aug 2003 21:18:16 -0000 1.9
+++ istream-file.c 29 Oct 2003 13:37:02 -0000 1.10
@@ -2,6 +2,8 @@
/* @UNSAFE: whole file */
+#define _XOPEN_SOURCE 500 /* for pread() / Linux */
+
#include "lib.h"
#include "alarm-hup.h"
#include "istream-internal.h"
@@ -113,18 +115,6 @@
if (stream->istream.closed)
return -1;
- if (fstream->skip_left > 0) {
- i_assert(stream->skip == stream->pos);
-
- if (fstream->file) {
- /* we're a file, so we can lseek() */
- i_stream_seek(&stream->istream,
- stream->istream.v_offset);
- if (stream->istream.closed)
- return -1;
- }
- }
-
stream->istream.stream_errno = 0;
if (stream->pos == stream->buffer_size) {
@@ -169,7 +159,15 @@
return -1;
}
- ret = read(stream->fd, stream->w_buffer + stream->pos, size);
+ if (fstream->file) {
+ ret = pread(stream->fd,
+ stream->w_buffer + stream->pos, size,
+ stream->istream.start_offset +
+ stream->istream.v_offset);
+ } else {
+ ret = read(stream->fd,
+ stream->w_buffer + stream->pos, size);
+ }
if (ret == 0) {
/* EOF */
stream->istream.stream_errno = 0;
@@ -192,6 +190,7 @@
}
if (ret > 0 && fstream->skip_left > 0) {
+ i_assert(!fstream->file);
if (fstream->skip_left >= (size_t)ret) {
fstream->skip_left -= ret;
ret = 0;
@@ -212,40 +211,24 @@
{
struct file_istream *fstream = (struct file_istream *) stream;
- fstream->skip_left += count - (stream->pos - stream->skip);
- stream->skip = stream->pos = 0;
+ if (!fstream->file)
+ fstream->skip_left += count - (stream->pos - stream->skip);
stream->istream.v_offset += count;
+ stream->skip = stream->pos = 0;
}
static void _seek(struct _istream *stream, uoff_t v_offset)
{
struct file_istream *fstream = (struct file_istream *) stream;
- uoff_t real_offset;
- off_t ret;
- real_offset = stream->istream.start_offset + v_offset;
- if (real_offset > OFF_T_MAX) {
- stream->istream.stream_errno = EOVERFLOW;
- ret = -1;
- } else {
- ret = lseek(stream->fd, (off_t)real_offset, SEEK_SET);
- if (ret < 0)
- stream->istream.stream_errno = errno;
- else if (ret != (off_t)real_offset) {
- stream->istream.stream_errno = EINVAL;
- ret = -1;
- } else {
- stream->skip = stream->pos = 0;
- fstream->skip_left = 0;
- }
+ if (!fstream->file) {
+ stream->istream.stream_errno = ESPIPE;
+ return;
}
- if (ret < 0)
- i_stream_close(&stream->istream);
- else {
- stream->istream.stream_errno = 0;
- stream->istream.v_offset = v_offset;
- }
+ stream->istream.stream_errno = 0;
+ stream->istream.v_offset = v_offset;
+ stream->skip = stream->pos = 0;
}
struct istream *i_stream_create_file(int fd, pool_t pool,
More information about the dovecot-cvs
mailing list