Mercurial > dovecot > core-2.2
annotate src/lib-fs/ostream-cmp.c @ 16020:6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
This makes it unambiguous how things work: Unless you explicitly call
[io]_stream_close(), the parent streams won't be closed. This is what most
(hopefully all!) of the existing code expects.
I was wondering a bit if [io]_stream_destroy() should simply have been
removed and replaced with [io]_stream_unref() calls, since they would have
worked basically everywhere, but there might be some places where it's
better to have explicitly closed the stream (and where closing the parent
stream doesn't matter).
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 13 Mar 2013 22:11:39 +0200 |
parents | 36ef72481934 |
children | add8c00fb3cc |
rev | line source |
---|---|
15715
36ef72481934
Oops :) Update copyrights to 2013 without breaking all .c files.
Timo Sirainen <tss@iki.fi>
parents:
15714
diff
changeset
|
1 /* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */ |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "istream.h" |
13529
cf77e448295c
Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
5 #include "ostream-private.h" |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "ostream-cmp.h" |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 struct cmp_ostream { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 struct ostream_private ostream; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 struct istream *input; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 bool equals; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 }; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
15 static void o_stream_cmp_close(struct iostream_private *stream, |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
16 bool close_parent) |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct cmp_ostream *cstream = (struct cmp_ostream *)stream; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
20 if (cstream->input == NULL) |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 return; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 i_stream_unref(&cstream->input); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
24 (void)o_stream_flush(&cstream->ostream.ostream); |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
25 if (close_parent) |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
26 o_stream_close(cstream->ostream.parent); |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 bool stream_cmp_block(struct istream *input, |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 const unsigned char *data, size_t size) |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 const unsigned char *indata; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 size_t insize, max; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 while (size > 0) { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 (void)i_stream_read_data(input, &indata, &insize, size-1); |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 max = I_MIN(insize, size); |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 if (insize == 0 || memcmp(data, indata, max) != 0) |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 return FALSE; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 data += max; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 size -= max; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 i_stream_skip(input, max); |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 return TRUE; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 static ssize_t |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 o_stream_cmp_sendv(struct ostream_private *stream, |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 const struct const_iovec *iov, unsigned int iov_count) |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 struct cmp_ostream *cstream = (struct cmp_ostream *)stream; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 unsigned int i; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 ssize_t ret; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 if (cstream->equals) { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 for (i = 0; i < iov_count; i++) { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 if (!stream_cmp_block(cstream->input, iov[i].iov_base, |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 iov[i].iov_len)) { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 cstream->equals = FALSE; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 break; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
65 if ((ret = o_stream_sendv(stream->parent, iov, iov_count)) < 0) { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
66 o_stream_copy_error_from_parent(stream); |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 return -1; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 stream->ostream.offset += ret; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 return ret; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 struct ostream * |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 o_stream_create_cmp(struct ostream *output, struct istream *input) |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 struct cmp_ostream *cstream; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 cstream = i_new(struct cmp_ostream, 1); |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 cstream->ostream.sendv = o_stream_cmp_sendv; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 cstream->ostream.iostream.close = o_stream_cmp_close; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 cstream->input = input; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 cstream->equals = TRUE; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 i_stream_ref(input); |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
14851 | 86 return o_stream_create(&cstream->ostream, output, |
87 o_stream_get_fd(output)); | |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 bool o_stream_cmp_equals(struct ostream *_output) |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 struct cmp_ostream *cstream = |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 (struct cmp_ostream *)_output->real_stream; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 return cstream->equals; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } |