Mercurial > dovecot > core-2.2
annotate src/lib/istream-file.c @ 23007:36e01285b5b8
lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 18 Mar 2019 00:52:37 +0100 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2002-2018 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 |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
781
diff
changeset
|
3 /* @UNSAFE: whole file */ |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
781
diff
changeset
|
4 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "lib.h" |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
6 #include "ioloop.h" |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
7 #include "istream-file-private.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
8 #include "net.h" |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include <time.h> |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include <unistd.h> |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
12 #include <fcntl.h> |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include <sys/stat.h> |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
15 void i_stream_file_close(struct iostream_private *stream, |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
16 bool close_parent ATTR_UNUSED) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
18 struct file_istream *fstream = (struct file_istream *)stream; |
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
19 struct istream_private *_stream = (struct istream_private *)stream; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 if (fstream->autoclose_fd && _stream->fd != -1) { |
10847
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10809
diff
changeset
|
22 if (close(_stream->fd) < 0) { |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10809
diff
changeset
|
23 i_error("file_istream.close(%s) failed: %m", |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10809
diff
changeset
|
24 i_stream_get_name(&_stream->istream)); |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10809
diff
changeset
|
25 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 } |
4766
b96086a311a9
When i/ostream is closed, change the fd to be -1 so it won't be accidentally
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
27 _stream->fd = -1; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
30 static int i_stream_file_open(struct istream_private *stream) |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
31 { |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
32 const char *path = i_stream_get_name(&stream->istream); |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
33 |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
34 stream->fd = open(path, O_RDONLY); |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
35 if (stream->fd == -1) { |
16773
76d5e3c8cec3
iostreams: Set stream error string when it provides extra information.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
36 io_stream_set_error(&stream->iostream, |
76d5e3c8cec3
iostreams: Set stream error string when it provides extra information.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
37 "open(%s) failed: %m", path); |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
38 stream->istream.stream_errno = errno; |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
39 return -1; |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
40 } |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
41 return 0; |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
42 } |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
43 |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
44 ssize_t i_stream_file_read(struct istream_private *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
46 struct file_istream *fstream = (struct file_istream *) stream; |
17849
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
47 uoff_t offset; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 size_t size; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 ssize_t ret; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
14693
d7d1f24dde34
istreams: Renamed i_stream_get_buffer_space() to i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
51 if (!i_stream_try_alloc(stream, 1, &size)) |
6558
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
52 return -2; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
54 if (stream->fd == -1) { |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
55 if (i_stream_file_open(stream) < 0) |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
56 return -1; |
20735
ad61b4f88130
Added asserts to make static analyzer happier.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
57 i_assert(stream->fd != -1); |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
58 } |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
59 |
17849
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
60 offset = stream->istream.v_offset + (stream->pos - stream->skip); |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
61 do { |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
62 if (fstream->file) { |
2463
46765dafc6e7
_read() never returns 0 for files.
Timo Sirainen <tss@iki.fi>
parents:
2431
diff
changeset
|
63 ret = pread(stream->fd, stream->w_buffer + stream->pos, |
17849
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
64 size, offset); |
7188
febb2592e616
If EOF is triggered with keyboard (^D), make sure to return EOF for future
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
65 } else if (fstream->seen_eof) { |
febb2592e616
If EOF is triggered with keyboard (^D), make sure to return EOF for future
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
66 /* don't try to read() again. EOF from keyboard (^D) |
febb2592e616
If EOF is triggered with keyboard (^D), make sure to return EOF for future
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
67 requires this to work right. */ |
febb2592e616
If EOF is triggered with keyboard (^D), make sure to return EOF for future
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
68 ret = 0; |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
69 } else { |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
70 ret = read(stream->fd, stream->w_buffer + stream->pos, |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
71 size); |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
72 } |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
73 } while (unlikely(ret < 0 && errno == EINTR && |
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
74 stream->istream.blocking)); |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
75 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
76 if (ret == 0) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
77 /* EOF */ |
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
|
78 stream->istream.eof = TRUE; |
7188
febb2592e616
If EOF is triggered with keyboard (^D), make sure to return EOF for future
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
79 fstream->seen_eof = TRUE; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
80 return -1; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
81 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
82 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
83 if (unlikely(ret < 0)) { |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
84 if (errno == EINTR || errno == EAGAIN) { |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
85 i_assert(!stream->istream.blocking); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
86 ret = 0; |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
87 } else { |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
7188
diff
changeset
|
88 i_assert(errno != 0); |
16774
28df180ec3ab
istream-file: Assert-crash if read() fails with EBADF.
Timo Sirainen <tss@iki.fi>
parents:
16773
diff
changeset
|
89 /* if we get EBADF for a valid fd, it means something's |
28df180ec3ab
istream-file: Assert-crash if read() fails with EBADF.
Timo Sirainen <tss@iki.fi>
parents:
16773
diff
changeset
|
90 really wrong and we'd better just crash. */ |
28df180ec3ab
istream-file: Assert-crash if read() fails with EBADF.
Timo Sirainen <tss@iki.fi>
parents:
16773
diff
changeset
|
91 i_assert(errno != EBADF); |
17849
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
92 if (fstream->file) { |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
93 io_stream_set_error(&stream->iostream, |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
94 "pread(size=%"PRIuSIZE_T |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
95 " offset=%"PRIuUOFF_T") failed: %m", |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
96 size, offset); |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
97 } else { |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
98 io_stream_set_error(&stream->iostream, |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
99 "read(size=%"PRIuSIZE_T") failed: %m", |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
100 size); |
18fc72a4a318
lib: Improved istream-file's failing read()/pread() error message.
Timo Sirainen <tss@iki.fi>
parents:
17479
diff
changeset
|
101 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
102 stream->istream.stream_errno = errno; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
103 return -1; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
105 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
107 if (ret > 0 && fstream->skip_left > 0) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
108 i_assert(!fstream->file); |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
109 i_assert(stream->skip == stream->pos); |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
110 |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
111 if (fstream->skip_left >= (size_t)ret) { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
112 fstream->skip_left -= ret; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
113 ret = 0; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
114 } else { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
115 ret -= fstream->skip_left; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
116 stream->pos += fstream->skip_left; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
117 stream->skip += fstream->skip_left; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
118 fstream->skip_left = 0; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
120 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 stream->pos += ret; |
2463
46765dafc6e7
_read() never returns 0 for files.
Timo Sirainen <tss@iki.fi>
parents:
2431
diff
changeset
|
123 i_assert(ret != 0 || !fstream->file); |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
7188
diff
changeset
|
124 i_assert(ret != -1); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 return ret; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
128 static void i_stream_file_seek(struct istream_private *stream, uoff_t v_offset, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
129 bool mark ATTR_UNUSED) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
131 struct file_istream *fstream = (struct file_istream *) stream; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 |
3239
904a268921af
Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents:
3234
diff
changeset
|
133 if (!stream->istream.seekable) { |
10809
6e32dbc4cd8f
file istream: If trying to seek backwards in unseekable stream, panic.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
134 if (v_offset < stream->istream.v_offset) |
6e32dbc4cd8f
file istream: If trying to seek backwards in unseekable stream, panic.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
135 i_panic("stream doesn't support seeking backwards"); |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
136 fstream->skip_left += v_offset - stream->istream.v_offset; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 |
1847
920307c42b17
Changed to use pread() with files.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
139 stream->istream.v_offset = v_offset; |
920307c42b17
Changed to use pread() with files.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
140 stream->skip = stream->pos = 0; |
7188
febb2592e616
If EOF is triggered with keyboard (^D), make sure to return EOF for future
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
141 fstream->seen_eof = FALSE; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
144 static void i_stream_file_sync(struct istream_private *stream) |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
145 { |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
146 if (!stream->istream.seekable) { |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
147 /* can't do anything or data would be lost */ |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
148 return; |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
149 } |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
150 |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
151 stream->skip = stream->pos = 0; |
15751
45c39743f406
i_stream_sync() for file should reset eof flag immediately.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
152 stream->istream.eof = FALSE; |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
153 } |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
154 |
14964 | 155 static int |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
156 i_stream_file_stat(struct istream_private *stream, bool exact ATTR_UNUSED) |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
157 { |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
158 struct file_istream *fstream = (struct file_istream *) stream; |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
159 const char *name = i_stream_get_name(&stream->istream); |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
160 |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
161 if (!fstream->file) { |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
162 /* return defaults */ |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
163 } else if (stream->fd != -1) { |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
164 if (fstat(stream->fd, &stream->statbuf) < 0) { |
18895
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
165 stream->istream.stream_errno = errno; |
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
166 io_stream_set_error(&stream->iostream, |
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
167 "file_istream.fstat(%s) failed: %m", name); |
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
168 i_error("%s", i_stream_get_error(&stream->istream)); |
14964 | 169 return -1; |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
170 } |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
171 } else { |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
172 if (stat(name, &stream->statbuf) < 0) { |
18895
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
173 stream->istream.stream_errno = errno; |
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
174 io_stream_set_error(&stream->iostream, |
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
175 "file_istream.stat(%s) failed: %m", name); |
d4422b0560fe
lib: istream_file.stat() fails, set stream_errno and error string.
Timo Sirainen <tss@iki.fi>
parents:
18481
diff
changeset
|
176 i_error("%s", i_stream_get_error(&stream->istream)); |
14964 | 177 return -1; |
5238
0f1208e2df7b
Removed caching from i_stream_stat(). The changes could be important in mbox
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
178 } |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
179 } |
14964 | 180 return 0; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
181 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
182 |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
183 struct istream * |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
184 i_stream_create_file_common(struct file_istream *fstream, |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
185 int fd, const char *path, |
16773
76d5e3c8cec3
iostreams: Set stream error string when it provides extra information.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
186 size_t max_buffer_size, bool autoclose_fd) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 { |
14697
69334bf138cf
istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents:
14693
diff
changeset
|
188 struct istream *input; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 struct stat st; |
11986
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
190 bool is_file; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 fstream->autoclose_fd = autoclose_fd; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
194 fstream->istream.iostream.close = i_stream_file_close; |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5238
diff
changeset
|
195 fstream->istream.max_buffer_size = max_buffer_size; |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
196 fstream->istream.read = i_stream_file_read; |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
197 fstream->istream.seek = i_stream_file_seek; |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
198 fstream->istream.sync = i_stream_file_sync; |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
199 fstream->istream.stat = i_stream_file_stat; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
201 /* if it's a file, set the flags properly */ |
11986
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
202 if (fd == -1) |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
203 is_file = TRUE; |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
204 else if (fstat(fd, &st) < 0) |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
205 is_file = FALSE; |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
206 else if (S_ISREG(st.st_mode)) |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
207 is_file = TRUE; |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
208 else if (!S_ISDIR(st.st_mode)) |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
209 is_file = FALSE; |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
210 else { |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
211 /* we're trying to open a directory. |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
212 we're not designed for it. */ |
16773
76d5e3c8cec3
iostreams: Set stream error string when it provides extra information.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
213 io_stream_set_error(&fstream->istream.iostream, |
76d5e3c8cec3
iostreams: Set stream error string when it provides extra information.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
214 "%s is a directory, can't read it as file", |
76d5e3c8cec3
iostreams: Set stream error string when it provides extra information.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
215 path != NULL ? path : t_strdup_printf("<fd %d>", fd)); |
11986
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
216 fstream->istream.istream.stream_errno = EISDIR; |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
217 is_file = FALSE; |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
218 } |
faac0d16d141
i_stream_create_fd(): If opening a directory, set stream_errno=EISDIR
Timo Sirainen <tss@iki.fi>
parents:
11829
diff
changeset
|
219 if (is_file) { |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 fstream->file = TRUE; |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4766
diff
changeset
|
221 fstream->istream.istream.blocking = TRUE; |
3239
904a268921af
Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents:
3234
diff
changeset
|
222 fstream->istream.istream.seekable = TRUE; |
904a268921af
Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents:
3234
diff
changeset
|
223 } |
9540
622509c562e8
Added struct istream.readable_fd, which is used to determine if sendfile() can be used.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
224 fstream->istream.istream.readable_fd = TRUE; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 |
14697
69334bf138cf
istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents:
14693
diff
changeset
|
226 input = i_stream_create(&fstream->istream, NULL, fd); |
69334bf138cf
istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents:
14693
diff
changeset
|
227 i_stream_set_name(input, is_file ? "(file)" : "(fd)"); |
69334bf138cf
istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents:
14693
diff
changeset
|
228 return input; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
230 |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
231 struct istream *i_stream_create_fd(int fd, size_t max_buffer_size, |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
232 bool autoclose_fd) |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
233 { |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
234 struct file_istream *fstream; |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
235 |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
236 i_assert(fd != -1); |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
237 |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
238 fstream = i_new(struct file_istream, 1); |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
239 return i_stream_create_file_common(fstream, fd, NULL, |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
240 max_buffer_size, autoclose_fd); |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
241 } |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
242 |
17479
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
243 struct istream *i_stream_create_fd_autoclose(int *fd, size_t max_buffer_size) |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
244 { |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
245 struct istream *input; |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
246 |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
247 input = i_stream_create_fd(*fd, max_buffer_size, TRUE); |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
248 *fd = -1; |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
249 return input; |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
250 } |
0bcb43692d91
lib: Added [io]_stream_create_fd_*autoclose()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
251 |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
252 struct istream *i_stream_create_file(const char *path, size_t max_buffer_size) |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
253 { |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
254 struct file_istream *fstream; |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
255 struct istream *input; |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
256 |
18481
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
257 fstream = i_new(struct file_istream, 1); |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
258 input = i_stream_create_file_common(fstream, -1, path, |
21a2ce6f8f37
lib: Added istream-unix for reading fd sockets via istream.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
259 max_buffer_size, TRUE); |
11829
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
260 i_stream_set_name(input, path); |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
261 return input; |
b7d98c5db865
Added i_stream_create_file() for creating istream from lazily opened file.
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
262 } |