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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14697
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14697
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14697
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14697
diff changeset
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 }