Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 81 switch (ret) { |
82 case -2: | |
83 i_assert(_stream->skip != _stream->pos); | |
84 break; | |
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 | 93 break; |
94 case 0: | |
95 i_assert(!stream->blocking); | |
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 | 142 data_size = _stream->pos - _stream->skip; |
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 | 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 | 185 i_stream_skip(stream, v_offset - stream->v_offset); |
186 return; | |
187 } | |
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 | 282 if (_stream->skip >= _stream->pos) { |
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 | 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 | 436 bool i_stream_add_data(struct istream *_stream, const unsigned char *data, |
437 size_t size) | |
438 { | |
439 struct istream_private *stream = _stream->real_stream; | |
440 size_t size2; | |
441 | |
442 (void)i_stream_get_buffer_space(stream, size, &size2); | |
443 if (size > size2) | |
444 return FALSE; | |
445 | |
446 memcpy(stream->w_buffer + stream->pos, data, size); | |
447 stream->pos += size; | |
448 return TRUE; | |
449 } | |
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 |