Mercurial > dovecot > core-2.2
annotate src/lib-fs/ostream-cmp.c @ 15715:36ef72481934
Oops :) Update copyrights to 2013 without breaking all .c files.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 02 Feb 2013 17:02:55 +0200 |
parents | 90710c6c3beb |
children | 6cabb95d32ec |
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 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 static void o_stream_cmp_close(struct iostream_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
|
16 { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 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
|
18 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
19 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
|
20 return; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 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
|
23 (void)o_stream_flush(&cstream->ostream.ostream); |
12309
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 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
|
27 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
|
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 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
|
30 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
|
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 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
|
33 (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
|
34 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
|
35 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
|
36 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
|
37 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
|
38 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
|
39 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
|
40 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 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
|
42 } |
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 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
|
45 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
|
46 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
|
47 { |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 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
|
49 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
|
50 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
|
51 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 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
|
53 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
|
54 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
|
55 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
|
56 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
|
57 break; |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
62 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
|
63 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
|
64 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
|
65 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 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
|
68 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
|
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 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 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
|
72 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
|
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 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
|
75 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 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
|
77 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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 |
14851 | 83 return o_stream_create(&cstream->ostream, output, |
84 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
|
85 } |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
e3fe87b855ef
Added lib-fs for simple filesystem accessing. Implemented POSIX, SiS and SiS-queue backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 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
|
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 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
|
90 (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
|
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 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
|
93 } |