[dovecot-cvs] dovecot/src/lib ostream-file.c,1.14,1.15
cras at procontrol.fi
cras at procontrol.fi
Mon Mar 17 07:09:30 EET 2003
Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv28546/src/lib
Modified Files:
ostream-file.c
Log Message:
file offset wasn't kept right.
Index: ostream-file.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/ostream-file.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- ostream-file.c 24 Feb 2003 18:15:18 -0000 1.14
+++ ostream-file.c 17 Mar 2003 05:09:28 -0000 1.15
@@ -486,7 +486,7 @@
{
struct file_ostream *fstream = (struct file_ostream *) stream;
struct iovec iov;
- ssize_t ret;
+ ssize_t ret = 0;
i_assert(size <= SSIZE_T_MAX);
@@ -498,7 +498,11 @@
(!fstream->corked || !_have_space(stream, size))) {
iov.iov_base = (void *) data;
iov.iov_len = size;
+
ret = o_stream_writev(fstream, &iov, 1);
+ if (ret > 0)
+ stream->ostream.offset += ret;
+
if (ret < 0 || (size_t)ret == size)
return ret;
@@ -510,10 +514,10 @@
/* send it blocking */
if (o_stream_send_blocking(fstream, data, size) < 0)
return -1;
- ret = (ssize_t)size;
+ ret += (ssize_t)size;
} else {
/* buffer it, at least partly */
- ret = (ssize_t)o_stream_add(fstream, data, size);
+ ret += (ssize_t)o_stream_add(fstream, data, size);
}
stream->ostream.offset += ret;
@@ -595,13 +599,17 @@
struct iovec iov[3];
int iov_len;
const unsigned char *data;
- size_t size;
+ size_t size, skip_size;
ssize_t ret;
int pos;
timeout_time = GET_TIMEOUT_TIME(foutstream);
iov_len = o_stream_fill_iovec(foutstream, iov);
+ skip_size = 0;
+ for (pos = 0; pos < iov_len; pos++)
+ skip_size += iov[pos].iov_len;
+
i_assert(!overlapping || iov_len == 0);
start_offset = instream->v_offset;
@@ -631,12 +639,22 @@
/* error */
return -1;
}
- outstream->ostream.offset += ret;
if (ret == 0 && !STREAM_IS_BLOCKING(foutstream)) {
/* don't block */
break;
}
+
+ if (skip_size > 0) {
+ if ((size_t)ret < skip_size) {
+ skip_size -= ret;
+ ret = 0;
+ } else {
+ ret -= skip_size;
+ skip_size = 0;
+ }
+ }
+ outstream->ostream.offset += ret;
if (timeout_time > 0 && time(NULL) > timeout_time) {
/* timeouted */
More information about the dovecot-cvs
mailing list