/src/dovecot/src/lib/buffer-istream.c
Line | Count | Source |
1 | | /* Copyright (c) 2020 Dovecot authors, see the included COPYING file */ |
2 | | |
3 | | #include "lib.h" |
4 | | #include "buffer.h" |
5 | | #include "eacces-error.h" |
6 | | #include "istream.h" |
7 | | |
8 | | enum buffer_append_result |
9 | | buffer_append_full_istream(buffer_t *buf, struct istream *is, size_t max_read_size, |
10 | | const char **error_r) |
11 | 0 | { |
12 | 0 | const unsigned char *data; |
13 | 0 | size_t size; |
14 | 0 | ssize_t ret; |
15 | |
|
16 | 0 | while ((ret = i_stream_read_more(is, &data, &size)) > 0) { |
17 | 0 | if (max_read_size == 0) |
18 | 0 | return BUFFER_APPEND_READ_MAX_SIZE; |
19 | 0 | size = I_MIN(max_read_size, size); |
20 | 0 | buffer_append(buf, data, size); |
21 | 0 | i_stream_skip(is, size); |
22 | 0 | max_read_size -= size; |
23 | 0 | } |
24 | | |
25 | 0 | if (ret == 0) |
26 | 0 | return BUFFER_APPEND_READ_MORE; |
27 | | |
28 | 0 | i_assert(is->eof); |
29 | | |
30 | 0 | if (is->stream_errno != 0) { |
31 | 0 | *error_r = t_strdup(i_stream_get_error(is)); |
32 | 0 | return BUFFER_APPEND_READ_ERROR; |
33 | 0 | } |
34 | 0 | return BUFFER_APPEND_OK; |
35 | 0 | } |
36 | | |
37 | | enum buffer_append_result |
38 | | buffer_append_full_file(buffer_t *buf, const char *file, size_t max_read_size, |
39 | | const char **error_r) |
40 | 0 | { |
41 | 0 | struct istream *is = i_stream_create_file(file, IO_BLOCK_SIZE); |
42 | 0 | enum buffer_append_result res = |
43 | 0 | buffer_append_full_istream(buf, is, max_read_size, error_r); |
44 | 0 | if (is->stream_errno == EACCES) |
45 | 0 | *error_r = eacces_error_get("open", file); |
46 | 0 | i_stream_unref(&is); |
47 | 0 | i_assert(res != BUFFER_APPEND_READ_MORE); |
48 | 0 | return res; |
49 | 0 | } |