Mercurial > dovecot > core-2.2
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 |
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 | 121 switch (ret) { |
122 case -2: | |
123 i_assert(_stream->skip != _stream->pos); | |
124 break; | |
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 | 133 break; |
134 case 0: | |
135 i_assert(!stream->blocking); | |
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 | 184 data_size = _stream->pos - _stream->skip; |
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 | 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 | 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 | 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 | 286 bool i_stream_is_eof(struct istream *stream) |
287 { | |
288 const struct istream_private *_stream = stream->real_stream; | |
289 | |
290 if (_stream->skip == _stream->pos) | |
291 (void)i_stream_read(stream); | |
292 return !i_stream_have_bytes_left(stream); | |
293 } | |
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 | 346 if (_stream->skip >= _stream->pos) { |
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 | 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 | 502 bool i_stream_add_data(struct istream *_stream, const unsigned char *data, |
503 size_t size) | |
504 { | |
505 struct istream_private *stream = _stream->real_stream; | |
506 size_t size2; | |
507 | |
508 (void)i_stream_get_buffer_space(stream, size, &size2); | |
509 if (size > size2) | |
510 return FALSE; | |
511 | |
512 memcpy(stream->w_buffer + stream->pos, data, size); | |
513 stream->pos += size; | |
514 return TRUE; | |
515 } | |
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 } |