Mercurial > dovecot > core-2.2
annotate src/lib/istream-failure-at.c @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
1 /* Copyright (c) 2015-2017 Dovecot authors, see the included COPYING file */ |
18865
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "istream-private.h" |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "istream-failure-at.h" |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 struct failure_at_istream { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 struct istream_private istream; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 char *error_string; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 uoff_t failure_offset; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 }; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 static void i_stream_failure_at_destroy(struct iostream_private *stream) |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 struct failure_at_istream *fstream = |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 (struct failure_at_istream *)stream; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 i_free(fstream->error_string); |
19362
28f088e237d9
lib: fix memory leaks in failure-at streams
Phil Carmody <phil@dovecot.fi>
parents:
19115
diff
changeset
|
19 i_stream_unref(&fstream->istream.parent); |
18865
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 } |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 static ssize_t |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 i_stream_failure_at_read(struct istream_private *stream) |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct failure_at_istream *fstream = (struct failure_at_istream *)stream; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 uoff_t new_offset; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 ssize_t ret; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 i_stream_seek(stream->parent, stream->parent_start_offset + |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 stream->istream.v_offset); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 ret = i_stream_read_copy_from_parent(&stream->istream); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 new_offset = stream->istream.v_offset + (stream->pos - stream->skip); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 if (ret >= 0 && new_offset >= fstream->failure_offset) { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 if (stream->istream.v_offset >= fstream->failure_offset) { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 /* we already passed the wanted failure offset, |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 return error immediately. */ |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 stream->pos = stream->skip; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 stream->istream.stream_errno = errno = EIO; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 io_stream_set_error(&stream->iostream, "%s", |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 fstream->error_string); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 ret = -1; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 } else { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 /* return data up to the wanted failure offset and |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 on the next read() call return failure */ |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 size_t new_pos = fstream->failure_offset - |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 stream->istream.v_offset + stream->skip; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 i_assert(new_pos >= stream->skip && |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 stream->pos >= new_pos); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 ret -= stream->pos - new_pos; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 stream->pos = new_pos; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } else if (ret < 0 && stream->istream.stream_errno == 0 && |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 fstream->failure_offset == (uoff_t)-1) { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 /* failure at EOF */ |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 stream->istream.stream_errno = errno = EIO; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 io_stream_set_error(&stream->iostream, "%s", |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 fstream->error_string); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 } |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 return ret; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 } |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 struct istream * |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 i_stream_create_failure_at(struct istream *input, uoff_t failure_offset, |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 const char *error_string) |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 struct failure_at_istream *fstream; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 fstream = i_new(struct failure_at_istream, 1); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 fstream->istream.max_buffer_size = input->real_stream->max_buffer_size; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 fstream->istream.stream_size_passthrough = TRUE; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 fstream->istream.read = i_stream_failure_at_read; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 fstream->istream.iostream.destroy = i_stream_failure_at_destroy; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
19115
bb80b907a116
Various passthrough istreams didn't preserve readable_fd.
Timo Sirainen <tss@iki.fi>
parents:
18865
diff
changeset
|
76 fstream->istream.istream.readable_fd = input->readable_fd; |
18865
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 fstream->istream.istream.blocking = input->blocking; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 fstream->istream.istream.seekable = input->seekable; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 fstream->error_string = i_strdup(error_string); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 fstream->failure_offset = failure_offset; |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 return i_stream_create(&fstream->istream, input, |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 i_stream_get_fd(input)); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 struct istream * |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 i_stream_create_failure_at_eof(struct istream *input, const char *error_string) |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 { |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 return i_stream_create_failure_at(input, (uoff_t)-1, error_string); |
99827acc1888
lib: Added i_stream_create_failure_at() to inject EIO at given offset in istream.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |