annotate src/lib/istream.c @ 12415:236ed6d5b391

istream: Exported i_stream_default_seek()
author Timo Sirainen <tss@iki.fi>
date Mon, 15 Nov 2010 15:31:02 +0000
parents 0c82fe7ce578
children fdb79a873e37
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10582
615eef3139c2 Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9777
diff changeset
1 /* Copyright (c) 2002-2010 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
10847
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
8 void i_stream_set_name(struct istream *stream, const char *name)
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
9 {
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
10 i_free(stream->real_stream->iostream.name);
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
11 stream->real_stream->iostream.name = i_strdup(name);
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
12 }
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
13
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
14 const char *i_stream_get_name(struct istream *stream)
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
15 {
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
16 while (stream->real_stream->iostream.name == NULL) {
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
17 stream = stream->real_stream->parent;
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
18 if (stream == NULL)
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
19 return "";
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
20 }
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
21 return stream->real_stream->iostream.name;
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
22 }
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
23
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
24 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
25 {
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
26 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
27 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
28 }
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
29
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
30 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
31 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
32 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
33 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
35 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
36 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
37 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
38
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
39 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
40 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
41 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
42 }
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
43 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
44 *stream = NULL;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
7023
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
47 #undef i_stream_set_destroy_callback
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
48 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
49 istream_callback_t *callback, void *context)
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
50 {
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
51 struct iostream_private *iostream = &stream->real_stream->iostream;
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
52
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
53 iostream->destroy_callback = callback;
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
54 iostream->destroy_context = context;
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
55 }
56a5a00e490c Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents: 6825
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 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
58 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
59 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
60
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 return _stream->fd;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
64 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
65 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
66 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
67 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
68
32d555a08443 If stream is closed without stream_errno set, change it to ECONNRESET so if
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
69 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
70 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
71 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
9777
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
73 void i_stream_set_init_buffer_size(struct istream *stream, size_t size)
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
74 {
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
75 stream->real_stream->init_buffer_size = size;
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
76 }
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
77
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
78 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
79 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
80 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
81 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
11992
136ce9b2e039 Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 10847
diff changeset
83 size_t i_stream_get_max_buffer_size(struct istream *stream)
136ce9b2e039 Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 10847
diff changeset
84 {
136ce9b2e039 Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 10847
diff changeset
85 return stream->real_stream->max_buffer_size;
136ce9b2e039 Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 10847
diff changeset
86 }
136ce9b2e039 Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 10847
diff changeset
87
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
88 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
89 {
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
90 stream->real_stream->return_nolf_line = set;
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
91 }
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
92
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
93 static void i_stream_update(struct istream_private *stream)
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
94 {
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
95 if (stream->parent == NULL)
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
96 stream->access_counter++;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
97 else {
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
98 stream->access_counter =
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
99 stream->parent->real_stream->access_counter;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
100 stream->parent_expected_offset = stream->parent->v_offset;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
101 }
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
102 }
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
103
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
104 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
105 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
106 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
107 size_t old_size;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
108 ssize_t ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
110 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
111 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
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
113 stream->eof = FALSE;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
114 stream->stream_errno = 0;
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
115
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
116 if (_stream->parent != NULL)
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
117 i_stream_seek(_stream->parent, _stream->parent_expected_offset);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
118
8885
5e513d6612e0 istream: Added one more assert to make sure return value is correct.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
119 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
120 ret = _stream->read(_stream);
8277
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
121 switch (ret) {
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
122 case -2:
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
123 i_assert(_stream->skip != _stream->pos);
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
124 break;
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
125 case -1:
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
126 if (stream->stream_errno != 0) {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
127 /* 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
128 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
129 stream->eof = TRUE;
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
130 } else {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
131 i_assert(stream->eof);
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
132 }
8277
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
133 break;
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
134 case 0:
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
135 i_assert(!stream->blocking);
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
136 break;
8721
3d8e70cbf224 i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
137 default:
3d8e70cbf224 i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
138 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
139 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
140 break;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
141 }
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
142
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
143 i_stream_update(_stream);
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
144 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
9196
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
147 ssize_t i_stream_read_copy_from_parent(struct istream *istream)
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
148 {
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
149 struct istream_private *stream = istream->real_stream;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
150 size_t pos;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
151 ssize_t ret;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
152
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
153 stream->pos -= stream->skip;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
154 stream->skip = 0;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
155
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
156 stream->buffer = i_stream_get_data(stream->parent, &pos);
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
157 if (pos > stream->pos)
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
158 ret = 0;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
159 else do {
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
160 if ((ret = i_stream_read(stream->parent)) == -2)
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
161 return -2;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
162
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
163 stream->istream.stream_errno = stream->parent->stream_errno;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
164 stream->istream.eof = stream->parent->eof;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
165 stream->buffer = i_stream_get_data(stream->parent, &pos);
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
166 /* check again, in case the parent stream had been seeked
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
167 backwards and the previous read() didn't get us far
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
168 enough. */
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
169 } while (pos <= stream->pos && ret > 0);
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
170
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
171 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
172 (ret == 0 ? 0 : -1);
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
173 stream->pos = pos;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
174 i_assert(ret != -1 || stream->istream.eof ||
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
175 stream->istream.stream_errno != 0);
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
176 return ret;
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
diff changeset
177 }
ef0c861608d9 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 9001
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_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
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 size_t data_size;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183
1853
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
184 data_size = _stream->pos - _stream->skip;
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
185 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
186 /* within buffer */
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 stream->v_offset += count;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 _stream->skip += count;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 return;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
192 /* have to seek forward */
1853
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
193 count -= data_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 _stream->skip = _stream->pos;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 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
196
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
197 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
198 return;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
199
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
200 stream->stream_errno = 0;
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
201 _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
202 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
204 static bool i_stream_can_optimize_seek(struct istream_private *stream)
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
205 {
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
206 if (stream->parent == NULL)
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
207 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
208
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
209 /* use the fast route only if the parent stream hasn't been changed */
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
210 if (stream->access_counter !=
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
211 stream->parent->real_stream->access_counter)
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
212 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
213
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
214 return i_stream_can_optimize_seek(stream->parent->real_stream);
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
215 }
e527ac1a7b4b i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents: 7032
diff changeset
216
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
217 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
218 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
219 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
220
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
221 if (v_offset >= stream->v_offset &&
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
222 i_stream_can_optimize_seek(_stream))
1874
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
223 i_stream_skip(stream, v_offset - stream->v_offset);
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
224 else {
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
225 if (unlikely(stream->closed))
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
226 return;
1874
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
227
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
228 stream->eof = FALSE;
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
229 _stream->seek(_stream, v_offset, FALSE);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
230 }
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
231 i_stream_update(_stream);
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
232 }
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
233
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
234 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
235 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
236 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
237
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
238 if (unlikely(stream->closed))
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
239 return;
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
240
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
241 stream->eof = FALSE;
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
242 _stream->seek(_stream, v_offset, TRUE);
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
243 i_stream_update(_stream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
246 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
247 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
248 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
249
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
250 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
251 return;
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
252
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
253 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
254 _stream->sync(_stream);
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
255 i_stream_update(_stream);
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
256 }
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
257 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
258
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
259 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
260 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
261 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
262
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
263 if (unlikely(stream->closed))
3630
7a9ae11167de i_stream_stat() should return NULL for closed istreams
Timo Sirainen <tss@iki.fi>
parents: 3629
diff changeset
264 return NULL;
7a9ae11167de i_stream_stat() should return NULL for closed istreams
Timo Sirainen <tss@iki.fi>
parents: 3629
diff changeset
265
3647
7af5162d934c Added exact parameter to i_stream_stat()
Timo Sirainen <tss@iki.fi>
parents: 3630
diff changeset
266 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
267 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
268
8922
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
269 int i_stream_get_size(struct istream *stream, bool exact, uoff_t *size_r)
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
270 {
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
271 struct istream_private *_stream = stream->real_stream;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
272
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
273 if (unlikely(stream->closed))
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
274 return -1;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
275
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
276 return _stream->get_size(_stream, exact, size_r);
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
277 }
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
278
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
279 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
280 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
281 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
282
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
283 return !stream->eof || _stream->skip != _stream->pos;
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
284 }
f322b24da429 Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents: 2626
diff changeset
285
8969
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
286 bool i_stream_is_eof(struct istream *stream)
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
287 {
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
288 const struct istream_private *_stream = stream->real_stream;
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
289
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
290 if (_stream->skip == _stream->pos)
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
291 (void)i_stream_read(stream);
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
292 return !i_stream_have_bytes_left(stream);
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
293 }
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
294
12225
0c82fe7ce578 Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents: 12057
diff changeset
295 uoff_t i_stream_get_absolute_offset(struct istream *stream)
0c82fe7ce578 Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents: 12057
diff changeset
296 {
0c82fe7ce578 Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents: 12057
diff changeset
297 return stream->real_stream->abs_start_offset + stream->v_offset;
0c82fe7ce578 Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents: 12057
diff changeset
298 }
0c82fe7ce578 Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents: 12057
diff changeset
299
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
300 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
301 {
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
302 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
303 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
304
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
305 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
306 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
307 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
308 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
309
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
310 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
311 /* 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
312 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
313 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
314 } 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
315 /* 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
316 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
317 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
318 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
319 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
320 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
321 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
322 }
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
323
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
324 if (i < stream->pos)
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
325 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
326 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
327 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
328 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
329 }
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
330
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
331 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
332 {
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
333 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
334 _stream->return_nolf_line) {
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
335 /* 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
336 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
337 }
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
338 return NULL;
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
339 }
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
340
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
341 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
342 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
343 struct istream_private *_stream = stream->real_stream;
12053
e9358064c45e istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents: 11992
diff changeset
344 const unsigned char *pos;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345
1846
f5d7407d33a0 reset stream_errno
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
346 if (_stream->skip >= _stream->pos) {
f5d7407d33a0 reset stream_errno
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
347 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
348 return NULL;
1846
f5d7407d33a0 reset stream_errno
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
349 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6720
diff changeset
351 if (unlikely(_stream->w_buffer == NULL)) {
10847
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
352 i_error("i_stream_next_line(%s) called for unmodifiable stream",
5f16e488e7f6 i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents: 10810
diff changeset
353 i_stream_get_name(stream));
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 return NULL;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356
12053
e9358064c45e istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents: 11992
diff changeset
357 pos = memchr(_stream->buffer + _stream->skip, '\n',
e9358064c45e istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents: 11992
diff changeset
358 _stream->pos - _stream->skip);
12057
0c73829cd1f8 i_stream_next_line(): Fix for the previous optimization.
Timo Sirainen <tss@iki.fi>
parents: 12053
diff changeset
359 if (pos != NULL) {
12053
e9358064c45e istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents: 11992
diff changeset
360 return i_stream_next_line_finish(_stream,
e9358064c45e istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents: 11992
diff changeset
361 pos - _stream->buffer);
e9358064c45e istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents: 11992
diff changeset
362 } else {
e9358064c45e istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents: 11992
diff changeset
363 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
364 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366
1293
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
367 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
368 {
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
369 char *line;
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
370
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
371 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
372 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
373 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
374 break;
1293
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
375
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
376 if (i_stream_read(stream) <= 0)
8438
1baa595093f5 Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents: 8277
diff changeset
377 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
378 }
1293
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
379 return line;
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
380 }
2f2c6335ed6d Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents: 1027
diff changeset
381
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
382 const unsigned char *
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
383 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
384 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
385 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
386
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 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
388 *size_r = 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 return NULL;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391
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
392 *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
393 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
394 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
396 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
397 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
398 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7348
diff changeset
399 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
400
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 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
402 *size_r = 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 return NULL;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405
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
406 *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
407 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
408 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409
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
410 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
411 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
412 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 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
414 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
415
2165
4c5732a9e2bc i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
416 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
417 *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
418 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
419 return 1;
4c5732a9e2bc i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
420
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 /* 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
422 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
423 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
424 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
425 } while (ret > 0);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426
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
427 *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
428 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
429 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
430
8194
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
431 if (ret == 0) {
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
432 /* need to read more */
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
433 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
434 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
435 }
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
436 if (stream->eof) {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
437 if (read_more) {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
438 /* 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
439 return 0;
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
440 }
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
441 } else {
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8194
diff changeset
442 i_assert(stream->stream_errno != 0);
8194
1ee313158639 i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 7925
diff changeset
443 }
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
444 return -1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
447 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
448 {
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
449 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
450 stream->pos - stream->skip);
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
451 stream->pos -= stream->skip;
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
452
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
453 stream->skip = 0;
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
454 }
460d6aeee7af Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents: 5479
diff changeset
455
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
456 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
457 {
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
458 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
459
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
460 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
461
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
462 stream->buffer_size = stream->pos + bytes;
9777
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
463 if (stream->buffer_size <= stream->init_buffer_size)
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
464 stream->buffer_size = stream->init_buffer_size;
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
465 else
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
466 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
467
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
468 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
469 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
470 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
471
10691
fe70069debcb i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
472 if (stream->buffer_size <= old_size)
fe70069debcb i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
473 stream->buffer_size = old_size;
fe70069debcb i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
474 else {
fe70069debcb i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
475 stream->w_buffer = i_realloc(stream->w_buffer, old_size,
fe70069debcb i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
476 stream->buffer_size);
fe70069debcb i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
477 stream->buffer = stream->w_buffer;
fe70069debcb i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
478 }
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
479 }
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
480
6558
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
481 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
482 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
483 {
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
484 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
485
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
486 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
487 if (stream->skip > 0) {
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
488 /* 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
489 i_stream_compress(stream);
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
490 } 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
491 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
492 /* 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
493 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
494 }
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
495 }
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
496
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
497 if (size_r != NULL)
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
498 *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
499 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
500 }
4a1caf69ca14 Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
501
7925
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
502 bool i_stream_add_data(struct istream *_stream, const unsigned char *data,
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
503 size_t size)
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
504 {
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
505 struct istream_private *stream = _stream->real_stream;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
506 size_t size2;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
507
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
508 (void)i_stream_get_buffer_space(stream, size, &size2);
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
509 if (size > size2)
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
510 return FALSE;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
511
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
512 memcpy(stream->w_buffer + stream->pos, data, size);
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
513 stream->pos += size;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
514 return TRUE;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
515 }
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
516
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
517 static void
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
518 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
519 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
520 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
521 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
522
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
523 _stream->max_buffer_size = max_size;
9519
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
524 if (_stream->parent != NULL)
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
525 i_stream_set_max_buffer_size(_stream->parent, max_size);
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
526 }
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
527
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
528 static void i_stream_default_destroy(struct iostream_private *stream)
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
529 {
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
530 struct istream_private *_stream = (struct istream_private *)stream;
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
531
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
532 i_free(_stream->w_buffer);
9525
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9522
diff changeset
533 if (_stream->parent != NULL)
9519
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
534 i_stream_unref(&_stream->parent);
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
535 }
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
536
12415
236ed6d5b391 istream: Exported i_stream_default_seek()
Timo Sirainen <tss@iki.fi>
parents: 12225
diff changeset
537 void i_stream_default_seek(struct istream_private *stream,
236ed6d5b391 istream: Exported i_stream_default_seek()
Timo Sirainen <tss@iki.fi>
parents: 12225
diff changeset
538 uoff_t v_offset, bool mark ATTR_UNUSED)
9522
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
539 {
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
540 size_t available;
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
541
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
542 if (stream->istream.v_offset > v_offset)
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
543 i_panic("stream doesn't support seeking backwards");
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
544
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
545 while (stream->istream.v_offset < v_offset) {
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
546 (void)i_stream_read(&stream->istream);
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
547
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
548 available = stream->pos - stream->skip;
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
549 if (available == 0) {
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
550 stream->istream.stream_errno = ESPIPE;
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
551 return;
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
552 }
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
553 if (available <= v_offset - stream->istream.v_offset)
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
554 i_stream_skip(&stream->istream, available);
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
555 else {
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
556 i_stream_skip(&stream->istream,
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
557 v_offset - stream->istream.v_offset);
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
558 }
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
559 }
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
560 }
12415
236ed6d5b391 istream: Exported i_stream_default_seek()
Timo Sirainen <tss@iki.fi>
parents: 12225
diff changeset
561
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
562 static const struct stat *
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
563 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
564 {
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
565 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
566 }
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
567
8922
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
568 static int
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
569 i_stream_default_get_size(struct istream_private *stream,
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
570 bool exact, uoff_t *size_r)
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
571 {
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
572 const struct stat *st;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
573
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
574 st = stream->stat(stream, exact);
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
575 if (st == NULL)
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
576 return -1;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
577 if (st->st_size == -1)
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
578 return 0;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
579
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
580 *size_r = st->st_size;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
581 return 1;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
582 }
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
583
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5675
diff changeset
584 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
585 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
586 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 _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
588 if (parent != NULL) {
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
589 _stream->access_counter = parent->real_stream->access_counter;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
590 _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
591 _stream->parent_start_offset = parent->v_offset;
10810
de2798fbbae6 istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents: 10808
diff changeset
592 _stream->parent_expected_offset = parent->v_offset;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
593 _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
594 parent->real_stream->abs_start_offset;
9519
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
595 i_stream_ref(parent);
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7023
diff changeset
596 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 _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
598
9519
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
599 if (_stream->iostream.destroy == NULL)
c0c3dcb5a6f0 Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents: 9196
diff changeset
600 _stream->iostream.destroy = i_stream_default_destroy;
9522
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
601 if (_stream->seek == NULL) {
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
602 i_assert(!_stream->istream.seekable);
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
603 _stream->seek = i_stream_default_seek;
85912a6031a0 istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
604 }
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
605 if (_stream->stat == NULL)
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
606 _stream->stat = i_stream_default_stat;
8922
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
607 if (_stream->get_size == NULL)
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8721
diff changeset
608 _stream->get_size = i_stream_default_get_size;
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
609 if (_stream->iostream.set_max_buffer_size == NULL) {
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
610 _stream->iostream.set_max_buffer_size =
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
611 i_stream_default_set_max_buffer_size;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
612 }
9777
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
613 if (_stream->init_buffer_size == 0)
85abd99007c3 Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
614 _stream->init_buffer_size = I_STREAM_MIN_SIZE;
5479
b3999af65adb If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents: 5106
diff changeset
615
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3240
diff changeset
616 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
617 _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
618 _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
619 _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
620 _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
621
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
622 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
623 return &_stream->istream;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 }