annotate src/lib/istream.c @ 9006:06bd1266f0c7 HEAD

istreams: Fixed some parent stream seeking issues.
author Timo Sirainen <tss@iki.fi>
date Fri, 01 May 2009 14:50:08 -0400
parents 5e513d6612e0
children 70593ef74836
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8438
diff changeset
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
4 #include "ioloop.h"
3240
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
5 #include "str.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream-internal.h"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
8 void i_stream_destroy(struct istream **stream)
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
9 {
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
10 i_stream_close(*stream);
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
11 i_stream_unref(stream);
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
12 }
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
13
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
14 void i_stream_ref(struct istream *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
16 io_stream_ref(&stream->real_stream->iostream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
19 void i_stream_unref(struct istream **stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
21 struct istream_private *_stream = (*stream)->real_stream;
3240
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
22
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
23 if (_stream->iostream.refcount == 1) {
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
24 if (_stream->line_str != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
25 str_free(&_stream->line_str);
3240
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
26 }
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
27 io_stream_unref(&(*stream)->real_stream->iostream);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
28 *stream = NULL;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
7023
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
31 #undef i_stream_set_destroy_callback
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
32 void i_stream_set_destroy_callback(struct istream *stream,
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
33 istream_callback_t *callback, void *context)
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
34 {
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
35 struct iostream_private *iostream = &stream->real_stream->iostream;
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
36
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
37 iostream->destroy_callback = callback;
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
38 iostream->destroy_context = context;
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
39 }
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
40
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
41 int i_stream_get_fd(struct istream *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
43 struct istream_private *_stream = stream->real_stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 return _stream->fd;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
48 void i_stream_close(struct istream *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
50 io_stream_close(&stream->real_stream->iostream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 stream->closed = TRUE;
7348
32d555a08443 If stream is closed without stream_errno set, change it to ECONNRESET so if
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
52
32d555a08443 If stream is closed without stream_errno set, change it to ECONNRESET so if
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
53 if (stream->stream_errno == 0)
8203
fb0691b3de71 i_stream_close(): EBADFD doesn't exist everywhere, use ENOENT instead.
Timo Sirainen <tss@iki.fi>
parents: 8196
diff changeset
54 stream->stream_errno = ENOENT;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
57 void i_stream_set_max_buffer_size(struct istream *stream, size_t max_size)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
59 io_stream_set_max_buffer_size(&stream->real_stream->iostream, max_size);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
62 void i_stream_set_return_partial_line(struct istream *stream, bool set)
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
63 {
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
64 stream->real_stream->return_nolf_line = set;
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
65 }
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
66
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
67 ssize_t i_stream_read(struct istream *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
69 struct istream_private *_stream = stream->real_stream;
8885
5e513d6612e0 istream: Added one more assert to make sure return value is correct.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
70 size_t old_size;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
71 ssize_t ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
73 if (unlikely(stream->closed))
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
2431
8e9d8cb1e674 Removed istream.disconnected, it's too much of a special case and the only
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
76 stream->eof = FALSE;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
77 stream->stream_errno = 0;
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
78
8885
5e513d6612e0 istream: Added one more assert to make sure return value is correct.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
79 old_size = _stream->pos - _stream->skip;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
80 ret = _stream->read(_stream);
8277
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
81 switch (ret) {
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
82 case -2:
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
83 i_assert(_stream->skip != _stream->pos);
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
84 break;
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
85 case -1:
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
86 if (stream->stream_errno != 0) {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
87 /* error handling should be easier if we now just
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
88 assume the stream is now at EOF */
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
89 stream->eof = TRUE;
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
90 } else {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
91 i_assert(stream->eof);
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
92 }
8277
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
93 break;
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
94 case 0:
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
95 i_assert(!stream->blocking);
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
96 break;
8721
3d8e70cbf224 i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
97 default:
3d8e70cbf224 i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
98 i_assert(ret > 0);
8885
5e513d6612e0 istream: Added one more assert to make sure return value is correct.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
99 i_assert((size_t)ret+old_size == _stream->pos - _stream->skip);
8721
3d8e70cbf224 i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
100 break;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
101 }
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
102 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
9006
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
105 ssize_t i_stream_read_copy_from_parent(struct istream *istream)
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
106 {
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
107 struct istream_private *stream = istream->real_stream;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
108 size_t pos;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
109 ssize_t ret;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
110
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
111 stream->pos -= stream->skip;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
112 stream->skip = 0;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
113
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
114 stream->buffer = i_stream_get_data(stream->parent, &pos);
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
115 if (pos > stream->pos)
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
116 ret = 0;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
117 else do {
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
118 if ((ret = i_stream_read(stream->parent)) == -2)
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
119 return -2;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
120
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
121 stream->istream.stream_errno = stream->parent->stream_errno;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
122 stream->istream.eof = stream->parent->eof;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
123 stream->buffer = i_stream_get_data(stream->parent, &pos);
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
124 /* check again, in case the parent stream had been seeked
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
125 backwards and the previous read() didn't get us far
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
126 enough. */
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
127 } while (pos <= stream->pos && ret > 0);
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
128
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
129 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
130 (ret == 0 ? 0 : -1);
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
131 stream->pos = pos;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
132 i_assert(ret != -1 || stream->istream.eof ||
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
133 stream->istream.stream_errno != 0);
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
134 return ret;
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
135 }
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8885
diff changeset
136
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
137 void i_stream_skip(struct istream *stream, uoff_t count)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
139 struct istream_private *_stream = stream->real_stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 size_t data_size;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
1853
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
142 data_size = _stream->pos - _stream->skip;
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
143 if (count <= data_size) {
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
144 /* within buffer */
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 stream->v_offset += count;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 _stream->skip += count;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 return;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
150 /* have to seek forward */
1853
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
151 count -= data_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 _stream->skip = _stream->pos;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 stream->v_offset += data_size;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
155 if (unlikely(stream->closed))
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
156 return;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
157
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
158 stream->stream_errno = 0;
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
159 _stream->seek(_stream, stream->v_offset + count, FALSE);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
7034
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
162 static bool i_stream_can_optimize_seek(struct istream *stream)
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
163 {
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
164 uoff_t expected_offset;
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
165
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
166 if (stream->real_stream->parent == NULL)
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
167 return TRUE;
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
168
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
169 /* use the fast route only if the parent stream is at the
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
170 expected offset */
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
171 expected_offset = stream->real_stream->parent_start_offset +
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
172 stream->v_offset - stream->real_stream->skip;
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
173 if (stream->real_stream->parent->v_offset != expected_offset)
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
174 return FALSE;
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
175
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
176 return i_stream_can_optimize_seek(stream->real_stream->parent);
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
177 }
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
178
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
179 void i_stream_seek(struct istream *stream, uoff_t v_offset)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
181 struct istream_private *_stream = stream->real_stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182
7034
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
183 if (v_offset >= stream->v_offset &&
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
184 i_stream_can_optimize_seek(stream)) {
1874
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
185 i_stream_skip(stream, v_offset - stream->v_offset);
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
186 return;
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
187 }
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
188
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
189 if (unlikely(stream->closed))
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 return;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
2431
8e9d8cb1e674 Removed istream.disconnected, it's too much of a special case and the only
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
192 stream->eof = FALSE;
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
193 _stream->seek(_stream, v_offset, FALSE);
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
194 }
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
195
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
196 void i_stream_seek_mark(struct istream *stream, uoff_t v_offset)
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
197 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
198 struct istream_private *_stream = stream->real_stream;
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
199
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
200 if (unlikely(stream->closed))
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
201 return;
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
202
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
203 stream->eof = FALSE;
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
204 _stream->seek(_stream, v_offset, TRUE);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
207 void i_stream_sync(struct istream *stream)
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
208 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
209 struct istream_private *_stream = stream->real_stream;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
210
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
211 if (unlikely(stream->closed))
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
212 return;
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
213
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
214 if (_stream->sync != NULL)
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
215 _stream->sync(_stream);
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
216 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
217
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3647
diff changeset
218 const struct stat *i_stream_stat(struct istream *stream, bool exact)
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
219 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
220 struct istream_private *_stream = stream->real_stream;
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
221
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
222 if (unlikely(stream->closed))
3630
7a9ae11167de i_stream_stat() should return NULL for closed istreams
Timo Sirainen <tss@iki.fi>
parents: 3629
diff changeset
223 return NULL;
7a9ae11167de i_stream_stat() should return NULL for closed istreams
Timo Sirainen <tss@iki.fi>
parents: 3629
diff changeset
224
3647
7af5162d934c Added exact parameter to i_stream_stat()
Timo Sirainen <tss@iki.fi>
parents: 3630
diff changeset
225 return _stream->stat(_stream, exact);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
226 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
227
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
228 bool i_stream_have_bytes_left(const struct istream *stream)
2788
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
229 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
230 const struct istream_private *_stream = stream->real_stream;
2788
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
231
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
232 return !stream->eof || _stream->skip != _stream->pos;
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
233 }
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
234
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
235 static char *i_stream_next_line_finish(struct istream_private *stream, size_t i)
3240
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
236 {
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
237 char *ret;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
238 size_t end;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
239
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
240 if (i > 0 && stream->buffer[i-1] == '\r')
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
241 end = i - 1;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
242 else
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
243 end = i;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
244
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
245 if (stream->w_buffer != NULL) {
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
246 /* modify the buffer directly */
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
247 stream->w_buffer[end] = '\0';
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
248 ret = (char *)stream->w_buffer + stream->skip;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
249 } else {
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
250 /* use a temporary string to return it */
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
251 if (stream->line_str == NULL)
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
252 stream->line_str = str_new(default_pool, 256);
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
253 str_truncate(stream->line_str, 0);
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
254 str_append_n(stream->line_str, stream->buffer + stream->skip,
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
255 end - stream->skip);
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
256 ret = str_c_modifiable(stream->line_str);
3240
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
257 }
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
258
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
259 if (i < stream->pos)
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
260 i++;
3240
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
261 stream->istream.v_offset += i - stream->skip;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
262 stream->skip = i;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
263 return ret;
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
264 }
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
265
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
266 static char *i_stream_last_line(struct istream_private *_stream)
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
267 {
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
268 if (_stream->istream.eof && _stream->skip != _stream->pos &&
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
269 _stream->return_nolf_line) {
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
270 /* the last line is missing LF and we want to return it. */
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
271 return i_stream_next_line_finish(_stream, _stream->pos);
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
272 }
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
273 return NULL;
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
274 }
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
275
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
276 char *i_stream_next_line(struct istream *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
278 struct istream_private *_stream = stream->real_stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 char *ret_buf;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 size_t i;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281
1846
f5d7407d33a0 reset stream_errno
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
282 if (_stream->skip >= _stream->pos) {
f5d7407d33a0 reset stream_errno
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
283 stream->stream_errno = 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 return NULL;
1846
f5d7407d33a0 reset stream_errno
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
285 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
287 if (unlikely(_stream->w_buffer == NULL)) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
288 i_error("i_stream_next_line() called for unmodifiable stream");
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 return NULL;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291
805
5ac361acb316 Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
292 /* @UNSAFE */
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 ret_buf = NULL;
918
23b42ffe8756 Removed cr_lookup_pos optimization with i_stream_next_line(). It breaks if
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
294 for (i = _stream->skip; i < _stream->pos; i++) {
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 if (_stream->buffer[i] == 10) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 /* got it */
3240
a6af023db10d i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents: 2788
diff changeset
297 ret_buf = i_stream_next_line_finish(_stream, i);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 break;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 }
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
301 if (ret_buf == NULL)
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
302 return i_stream_last_line(_stream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 return ret_buf;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305
1293
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
306 char *i_stream_read_next_line(struct istream *stream)
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
307 {
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
308 char *line;
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
309
6720
e1ec38002b2b i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents: 6558
diff changeset
310 for (;;) {
e1ec38002b2b i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents: 6558
diff changeset
311 line = i_stream_next_line(stream);
e1ec38002b2b i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents: 6558
diff changeset
312 if (line != NULL)
e1ec38002b2b i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents: 6558
diff changeset
313 break;
1293
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
314
6720
e1ec38002b2b i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents: 6558
diff changeset
315 if (i_stream_read(stream) <= 0)
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
316 return i_stream_last_line(stream->real_stream);
6720
e1ec38002b2b i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents: 6558
diff changeset
317 }
1293
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
318 return line;
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
319 }
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
320
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
321 const unsigned char *
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
322 i_stream_get_data(const struct istream *stream, size_t *size_r)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
324 const struct istream_private *_stream = stream->real_stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 if (_stream->skip >= _stream->pos) {
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
327 *size_r = 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 return NULL;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
331 *size_r = _stream->pos - _stream->skip;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 return _stream->buffer + _stream->skip;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
335 unsigned char *i_stream_get_modifiable_data(const struct istream *stream,
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
336 size_t *size_r)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
338 const struct istream_private *_stream = stream->real_stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 if (_stream->skip >= _stream->pos || _stream->w_buffer == NULL) {
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
341 *size_r = 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 return NULL;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
345 *size_r = _stream->pos - _stream->skip;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 return _stream->w_buffer + _stream->skip;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
349 int i_stream_read_data(struct istream *stream, const unsigned char **data_r,
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
350 size_t *size_r, size_t threshold)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 ssize_t ret = 0;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3647
diff changeset
353 bool read_more = FALSE;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354
2165
4c5732a9e2bc i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
355 do {
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
356 *data_r = i_stream_get_data(stream, size_r);
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
357 if (*size_r > threshold)
2165
4c5732a9e2bc i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
358 return 1;
4c5732a9e2bc i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
359
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 /* we need more data */
1312
c893ba64db07 Fixes for resetting stream limits. Should fix some APPEND problems.
Timo Sirainen <tss@iki.fi>
parents: 1293
diff changeset
361 ret = i_stream_read(stream);
2573
d10ad1e5a5aa i_stream_read_data(): return -1 if we didn't read more data, even if buffer
Timo Sirainen <tss@iki.fi>
parents: 2459
diff changeset
362 if (ret > 0)
d10ad1e5a5aa i_stream_read_data(): return -1 if we didn't read more data, even if buffer
Timo Sirainen <tss@iki.fi>
parents: 2459
diff changeset
363 read_more = TRUE;
2452
963d95591b49 i_stream_read_data(): don't loop if read() returns 0.
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
364 } while (ret > 0);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
366 *data_r = i_stream_get_data(stream, size_r);
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
367 if (ret == -2)
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
368 return -2;
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
369
8194
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
370 if (ret == 0) {
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
371 /* need to read more */
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
372 i_assert(!stream->blocking);
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
373 return 0;
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
374 }
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
375 if (stream->eof) {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
376 if (read_more) {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
377 /* we read at least some new data */
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
378 return 0;
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
379 }
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
380 } else {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
381 i_assert(stream->stream_errno != 0);
8194
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
382 }
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
383 return -1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
386 void i_stream_compress(struct istream_private *stream)
5481
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
387 {
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
388 memmove(stream->w_buffer, stream->w_buffer + stream->skip,
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
389 stream->pos - stream->skip);
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
390 stream->pos -= stream->skip;
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
391
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
392 stream->skip = 0;
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
393 }
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
394
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
395 void i_stream_grow_buffer(struct istream_private *stream, size_t bytes)
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
396 {
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
397 size_t old_size;
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
398
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
399 old_size = stream->buffer_size;
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
400
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
401 stream->buffer_size = stream->pos + bytes;
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
402 if (stream->buffer_size <= I_STREAM_MIN_SIZE)
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
403 stream->buffer_size = I_STREAM_MIN_SIZE;
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
404 else
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
405 stream->buffer_size = nearest_power(stream->buffer_size);
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
406
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
407 if (stream->max_buffer_size > 0 &&
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
408 stream->buffer_size > stream->max_buffer_size)
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
409 stream->buffer_size = stream->max_buffer_size;
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
410
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
411 stream->buffer = stream->w_buffer =
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
412 i_realloc(stream->w_buffer, old_size, stream->buffer_size);
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
413 }
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
414
6558
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
415 bool i_stream_get_buffer_space(struct istream_private *stream,
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
416 size_t wanted_size, size_t *size_r)
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
417 {
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
418 i_assert(wanted_size > 0);
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
419
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
420 if (wanted_size > stream->buffer_size - stream->pos) {
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
421 if (stream->skip > 0) {
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
422 /* remove the unused bytes from beginning of buffer */
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
423 i_stream_compress(stream);
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
424 } else if (stream->max_buffer_size == 0 ||
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
425 stream->buffer_size < stream->max_buffer_size) {
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
426 /* buffer is full - grow it */
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
427 i_stream_grow_buffer(stream, I_STREAM_MIN_SIZE);
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
428 }
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
429 }
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
430
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
431 if (size_r != NULL)
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
432 *size_r = stream->buffer_size - stream->pos;
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
433 return stream->pos != stream->buffer_size;
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
434 }
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
435
7925
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
436 bool i_stream_add_data(struct istream *_stream, const unsigned char *data,
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
437 size_t size)
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
438 {
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
439 struct istream_private *stream = _stream->real_stream;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
440 size_t size2;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
441
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
442 (void)i_stream_get_buffer_space(stream, size, &size2);
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
443 if (size > size2)
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
444 return FALSE;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
445
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
446 memcpy(stream->w_buffer + stream->pos, data, size);
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
447 stream->pos += size;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
448 return TRUE;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
449 }
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
450
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
451 static void
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
452 i_stream_default_set_max_buffer_size(struct iostream_private *stream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
453 size_t max_size)
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
454 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
455 struct istream_private *_stream = (struct istream_private *)stream;
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
456
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
457 _stream->max_buffer_size = max_size;
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
458 }
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
459
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
460 static const struct stat *
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
461 i_stream_default_stat(struct istream_private *stream, bool exact ATTR_UNUSED)
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
462 {
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
463 return &stream->statbuf;
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
464 }
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
465
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
466 struct istream *
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
467 i_stream_create(struct istream_private *_stream, struct istream *parent, int fd)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 _stream->fd = fd;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
470 if (parent != NULL) {
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
471 _stream->parent = parent;
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
472 _stream->parent_start_offset = parent->v_offset;
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
473 _stream->abs_start_offset = parent->v_offset +
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
474 parent->real_stream->abs_start_offset;
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
475 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 _stream->istream.real_stream = _stream;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
478 if (_stream->stat == NULL)
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
479 _stream->stat = i_stream_default_stat;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
480 if (_stream->iostream.set_max_buffer_size == NULL) {
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
481 _stream->iostream.set_max_buffer_size =
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
482 i_stream_default_set_max_buffer_size;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
483 }
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
484
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
485 memset(&_stream->statbuf, 0, sizeof(_stream->statbuf));
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
486 _stream->statbuf.st_size = -1;
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
487 _stream->statbuf.st_atime =
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
488 _stream->statbuf.st_mtime =
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
489 _stream->statbuf.st_ctime = ioloop_time;
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
490
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
491 io_stream_init(&_stream->iostream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 return &_stream->istream;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 }
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
494
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
495 #ifdef STREAM_TEST
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
496 /* gcc istream.c -o teststream liblib.a -Wall -DHAVE_CONFIG_H -DSTREAM_TEST -g */
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
497
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
498 #include <fcntl.h>
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
499 #include <unistd.h>
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
500 #include "ostream.h"
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
501
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
502 #define BUF_VALUE(offset) \
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
503 (((offset) % 256) ^ ((offset) / 256))
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
504
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
505 static void check_buffer(const unsigned char *data, size_t size, size_t offset)
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
506 {
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
507 size_t i;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
508
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
509 for (i = 0; i < size; i++)
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
510 i_assert(data[i] == BUF_VALUE(i+offset));
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
511 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
512
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
513 int main(void)
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
514 {
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
515 struct istream *input, *l_input;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
516 struct ostream *output1, *output2;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
517 int i, fd1, fd2;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
518 unsigned char buf[1024];
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
519 const unsigned char *data;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
520 size_t size;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
521
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
522 lib_init();
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
523
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
524 fd1 = open("teststream.1", O_RDWR | O_CREAT | O_TRUNC, 0600);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
525 if (fd1 < 0)
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
526 i_fatal("open() failed: %m");
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
527 fd2 = open("teststream.2", O_RDWR | O_CREAT | O_TRUNC, 0600);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
528 if (fd2 < 0)
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
529 i_fatal("open() failed: %m");
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
530
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
531 /* write initial data */
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
532 for (i = 0; i < sizeof(buf); i++)
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
533 buf[i] = BUF_VALUE(i);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
534 write(fd1, buf, sizeof(buf));
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
535
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
536 /* test reading */
6162
896cc473c1f0 Renamed i_stream_create_file() to i_stream_create_fd().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
537 input = i_stream_create_fd(fd1, 512, FALSE);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
538 i_assert(i_stream_get_size(input) == sizeof(buf));
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
539
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
540 i_assert(i_stream_read_data(input, &data, &size, 0) > 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
541 i_assert(size == 512);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
542 check_buffer(data, size, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
543
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
544 i_stream_seek(input, 256);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
545 i_assert(i_stream_read_data(input, &data, &size, 0) > 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
546 i_assert(size == 512);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
547 check_buffer(data, size, 256);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
548
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
549 i_stream_seek(input, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
550 i_assert(i_stream_read_data(input, &data, &size, 512) == -2);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
551 i_assert(size == 512);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
552 check_buffer(data, size, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
553
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
554 i_stream_skip(input, 900);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
555 i_assert(i_stream_read_data(input, &data, &size, 0) > 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
556 i_assert(size == sizeof(buf) - 900);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
557 check_buffer(data, size, 900);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
558
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
559 /* test moving data */
6162
896cc473c1f0 Renamed i_stream_create_file() to i_stream_create_fd().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
560 output1 = o_stream_create_fd(fd1, 512, FALSE);
896cc473c1f0 Renamed i_stream_create_file() to i_stream_create_fd().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
561 output2 = o_stream_create_fd(fd2, 512, FALSE);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
562
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
563 i_stream_seek(input, 1); size = sizeof(buf)-1;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
564 i_assert(o_stream_send_istream(output2, input) == size);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
565 o_stream_flush(output2);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
566
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
567 lseek(fd2, 0, SEEK_SET);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
568 i_assert(read(fd2, buf, sizeof(buf)) == size);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
569 check_buffer(buf, size, 1);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
570
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
571 i_stream_seek(input, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
572 o_stream_seek(output1, sizeof(buf));
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
573 i_assert(o_stream_send_istream(output1, input) == sizeof(buf));
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
574
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
575 /* test moving with limits */
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
576 l_input = i_stream_create_limit(input, sizeof(buf)/2, 512);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
577 i_stream_seek(l_input, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
578 o_stream_seek(output1, 10);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
579 i_assert(o_stream_send_istream(output1, l_input) == 512);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
580
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
581 i_stream_set_max_buffer_size(input, sizeof(buf));
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
582
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
583 i_stream_seek(input, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
584 i_assert(i_stream_read_data(input, &data, &size, sizeof(buf)-1) > 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
585 i_assert(size == sizeof(buf));
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
586 check_buffer(data, 10, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
587 check_buffer(data + 10, 512, sizeof(buf)/2);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
588 check_buffer(data + 10 + 512,
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
589 size - (10 + 512), 10 + 512);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
590
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
591 /* reading within limits */
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
592 i_stream_seek(l_input, 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
593 i_assert(i_stream_read_data(l_input, &data, &size, 511) > 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
594 i_assert(size == 512);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
595 i_assert(i_stream_read_data(l_input, &data, &size, 512) == -2);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
596 i_assert(size == 512);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
597 i_stream_skip(l_input, 511);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
598 i_assert(i_stream_read_data(l_input, &data, &size, 0) > 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
599 i_assert(size == 1);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
600 i_stream_skip(l_input, 1);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
601 i_assert(i_stream_read_data(l_input, &data, &size, 0) == -1);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
602 i_assert(size == 0);
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
603
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
604 unlink("teststream.1");
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
605 unlink("teststream.2");
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
606 return 0;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
607 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
608 #endif