Mercurial > dovecot > core-2.2
annotate src/lib/iostream-temp.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 |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21519
diff
changeset
|
1 /* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */ |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "buffer.h" |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "safe-mkstemp.h" |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "write-full.h" |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
8 #include "istream-private.h" |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "ostream-private.h" |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "iostream-temp.h" |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <unistd.h> |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
19835
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
14 #define IOSTREAM_TEMP_MAX_BUF_SIZE_DEFAULT (1024*128) |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 struct temp_ostream { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct ostream_private ostream; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
18 |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 char *temp_path_prefix; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
20 enum iostream_temp_flags flags; |
19835
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
21 size_t max_mem_size; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
22 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
23 struct istream *dupstream; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
24 uoff_t dupstream_offset, dupstream_start_offset; |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
25 char *name; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
26 |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 buffer_t *buf; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 int fd; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 bool fd_tried; |
17273
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
30 uoff_t fd_size; |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 }; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15733
diff
changeset
|
33 static void |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15733
diff
changeset
|
34 o_stream_temp_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:
15733
diff
changeset
|
35 bool close_parent ATTR_UNUSED) |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 struct temp_ostream *tstream = (struct temp_ostream *)stream; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 if (tstream->fd != -1) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 i_close_fd(&tstream->fd); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 if (tstream->buf != NULL) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 buffer_free(&tstream->buf); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 i_free(tstream->temp_path_prefix); |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
44 i_free(tstream->name); |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 static int o_stream_temp_move_to_fd(struct temp_ostream *tstream) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 string_t *path; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 if (tstream->fd_tried) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 return -1; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 tstream->fd_tried = TRUE; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 path = t_str_new(128); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 str_append(path, tstream->temp_path_prefix); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 tstream->fd = safe_mkstemp_hostpid(path, 0600, (uid_t)-1, (gid_t)-1); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 if (tstream->fd == -1) { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 i_error("safe_mkstemp(%s) failed: %m", str_c(path)); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 return -1; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 } |
19136
fefaa6d09a81
Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
62 if (i_unlink(str_c(path)) < 0) { |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 i_close_fd(&tstream->fd); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 return -1; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 if (write_full(tstream->fd, tstream->buf->data, tstream->buf->used) < 0) { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 i_error("write(%s) failed: %m", str_c(path)); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 i_close_fd(&tstream->fd); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 return -1; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 } |
19837
b02d6f8ebf88
lib: iostream-temp makes the internal fd visible now to o_stream_get_fd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19835
diff
changeset
|
71 /* make the fd available also to o_stream_get_fd(), |
b02d6f8ebf88
lib: iostream-temp makes the internal fd visible now to o_stream_get_fd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19835
diff
changeset
|
72 e.g. for unit tests */ |
b02d6f8ebf88
lib: iostream-temp makes the internal fd visible now to o_stream_get_fd()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19835
diff
changeset
|
73 tstream->ostream.fd = tstream->fd; |
17273
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
74 tstream->fd_size = tstream->buf->used; |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 buffer_free(&tstream->buf); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 return 0; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
20745
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
79 int o_stream_temp_move_to_memory(struct ostream *output) |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
80 { |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
81 struct temp_ostream *tstream = |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
82 (struct temp_ostream *)output->real_stream; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
83 unsigned char buf[IO_BLOCK_SIZE]; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
84 uoff_t offset = 0; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
85 ssize_t ret = 0; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
86 |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
87 i_assert(tstream->buf == NULL); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
88 tstream->buf = buffer_create_dynamic(default_pool, 8192); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
89 while (offset < tstream->ostream.ostream.offset && |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
90 (ret = pread(tstream->fd, buf, sizeof(buf), offset)) > 0) { |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
91 if ((size_t)ret > tstream->ostream.ostream.offset - offset) |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
92 ret = tstream->ostream.ostream.offset - offset; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
93 buffer_append(tstream->buf, buf, ret); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
94 offset += ret; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
95 } |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
96 if (ret < 0) { |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
97 /* not really expecting this to happen */ |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
98 i_error("iostream-temp %s: read(%s*) failed: %m", |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
99 o_stream_get_name(&tstream->ostream.ostream), |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
100 tstream->temp_path_prefix); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
101 tstream->ostream.ostream.stream_errno = EIO; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
102 return -1; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
103 } |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
104 i_close_fd(&tstream->fd); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
105 tstream->ostream.fd = -1; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
106 return 0; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
107 } |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
108 |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 static ssize_t |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 o_stream_temp_fd_sendv(struct temp_ostream *tstream, |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 const struct const_iovec *iov, unsigned int iov_count) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 size_t bytes = 0; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 unsigned int i; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 for (i = 0; i < iov_count; i++) { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 if (write_full(tstream->fd, iov[i].iov_base, iov[i].iov_len) < 0) { |
20745
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
118 i_error("iostream-temp %s: write(%s*) failed: %m - moving to memory", |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
119 o_stream_get_name(&tstream->ostream.ostream), |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
120 tstream->temp_path_prefix); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
121 if (o_stream_temp_move_to_memory(&tstream->ostream.ostream) < 0) |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
122 return -1; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
123 for (; i < iov_count; i++) { |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
124 buffer_append(tstream->buf, iov[i].iov_base, iov[i].iov_len); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
125 bytes += iov[i].iov_len; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
126 tstream->ostream.ostream.offset += iov[i].iov_len; |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
127 } |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
128 i_assert(tstream->fd_tried); |
244720af3113
iostream-temp: If write() to temp file fails at any time, move it back to memory.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20591
diff
changeset
|
129 return bytes; |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 bytes += iov[i].iov_len; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 tstream->ostream.ostream.offset += iov[i].iov_len; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 } |
17273
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
134 tstream->fd_size += bytes; |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 return bytes; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 static ssize_t |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 o_stream_temp_sendv(struct ostream_private *stream, |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 const struct const_iovec *iov, unsigned int iov_count) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 struct temp_ostream *tstream = (struct temp_ostream *)stream; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 ssize_t ret = 0; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 unsigned int i; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
146 tstream->flags &= ~IOSTREAM_TEMP_FLAG_TRY_FD_DUP; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
147 |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 if (tstream->fd != -1) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 return o_stream_temp_fd_sendv(tstream, iov, iov_count); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 for (i = 0; i < iov_count; i++) { |
19835
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
152 if (tstream->buf->used + iov[i].iov_len > tstream->max_mem_size) { |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 if (o_stream_temp_move_to_fd(tstream) == 0) { |
21519
9722a49567e0
global: Add asserts to make static analyzer happier.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
154 i_assert(tstream->fd != -1); |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 return o_stream_temp_fd_sendv(tstream, iov+i, |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 iov_count-i); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 /* failed to move to temp fd, just keep it in memory */ |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 buffer_append(tstream->buf, iov[i].iov_base, iov[i].iov_len); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 ret += iov[i].iov_len; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 stream->ostream.offset += iov[i].iov_len; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 return ret; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
167 static int o_stream_temp_dup_cancel(struct temp_ostream *tstream) |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
168 { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
169 struct istream *input; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
170 uoff_t size = tstream->dupstream_offset - |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
171 tstream->dupstream_start_offset; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
172 off_t ret; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
173 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
174 i_stream_seek(tstream->dupstream, tstream->dupstream_start_offset); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
175 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
176 input = i_stream_create_limit(tstream->dupstream, size); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
177 do { |
17698
e593dce9468d
lib: io_stream_copy() no longer attempts to read full block sizes from input.
Timo Sirainen <tss@iki.fi>
parents:
17597
diff
changeset
|
178 ret = io_stream_copy(&tstream->ostream.ostream, input); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
179 } while (input->v_offset < tstream->dupstream_offset && ret > 0); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
180 if (ret < 0 && tstream->ostream.ostream.stream_errno == 0) { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
181 i_assert(input->stream_errno != 0); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
182 tstream->ostream.ostream.stream_errno = input->stream_errno; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
183 } |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
184 i_stream_destroy(&input); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
185 i_stream_unref(&tstream->dupstream); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
186 return ret < 0 ? -1 : 0; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
187 } |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
188 |
20455
bc4eaa2775db
lib: iostream-temp: Fixed o_stream_send_istream() with >2GB files
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20424
diff
changeset
|
189 static off_t o_stream_temp_dup_istream(struct temp_ostream *outstream, |
bc4eaa2775db
lib: iostream-temp: Fixed o_stream_send_istream() with >2GB files
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20424
diff
changeset
|
190 struct istream *instream) |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
191 { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
192 uoff_t in_size; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
193 off_t ret; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
194 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
195 if (!instream->readable_fd || i_stream_get_fd(instream) == -1) |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
196 return 0; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
197 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
198 if (i_stream_get_size(instream, TRUE, &in_size) <= 0) { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
199 if (outstream->dupstream != NULL) |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
200 return o_stream_temp_dup_cancel(outstream); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
201 return 0; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
202 } |
20424
8edcbb725e4a
lib: Added assert to iostream-temp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19905
diff
changeset
|
203 i_assert(instream->v_offset <= in_size); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
204 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
205 if (outstream->dupstream == NULL) { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
206 outstream->dupstream = instream; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
207 outstream->dupstream_start_offset = instream->v_offset; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
208 i_stream_ref(outstream->dupstream); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
209 } else { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
210 if (outstream->dupstream != instream || |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
211 outstream->dupstream_offset != instream->v_offset || |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
212 outstream->dupstream_offset > in_size) |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
213 return o_stream_temp_dup_cancel(outstream); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
214 } |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
215 ret = in_size - instream->v_offset; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
216 i_stream_seek(instream, in_size); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
217 outstream->dupstream_offset = instream->v_offset; |
20591
07fa25c2da86
lib: ostream-temp didn't update offset when dup()ing fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20455
diff
changeset
|
218 outstream->ostream.ostream.offset = |
07fa25c2da86
lib: ostream-temp didn't update offset when dup()ing fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20455
diff
changeset
|
219 outstream->dupstream_offset - outstream->dupstream_start_offset; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
220 return ret; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
221 } |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
222 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
223 static off_t o_stream_temp_send_istream(struct ostream_private *_outstream, |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
224 struct istream *instream) |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
225 { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
226 struct temp_ostream *outstream = (struct temp_ostream *)_outstream; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
227 uoff_t orig_offset; |
20791
34f60577aa8b
lib: iostream-temp: Fixed o_stream_send_istream() with >2GB files
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20745
diff
changeset
|
228 off_t ret; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
229 |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
230 if ((outstream->flags & IOSTREAM_TEMP_FLAG_TRY_FD_DUP) != 0) { |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
231 orig_offset = outstream->dupstream_offset; |
20424
8edcbb725e4a
lib: Added assert to iostream-temp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19905
diff
changeset
|
232 if ((ret = o_stream_temp_dup_istream(outstream, instream)) > 0) { |
8edcbb725e4a
lib: Added assert to iostream-temp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19905
diff
changeset
|
233 i_assert(outstream->dupstream_offset >= orig_offset); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
234 return outstream->dupstream_offset - orig_offset; |
20424
8edcbb725e4a
lib: Added assert to iostream-temp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19905
diff
changeset
|
235 } |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
236 if (ret < 0) |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
237 return -1; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
238 outstream->flags &= ~IOSTREAM_TEMP_FLAG_TRY_FD_DUP; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
239 } |
17698
e593dce9468d
lib: io_stream_copy() no longer attempts to read full block sizes from input.
Timo Sirainen <tss@iki.fi>
parents:
17597
diff
changeset
|
240 return io_stream_copy(&outstream->ostream.ostream, instream); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
241 } |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
242 |
17097
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
243 static int |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
244 o_stream_temp_write_at(struct ostream_private *stream, |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
245 const void *data, size_t size, uoff_t offset) |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
246 { |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
247 struct temp_ostream *tstream = (struct temp_ostream *)stream; |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
248 |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
249 if (tstream->fd == -1) { |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
250 i_assert(stream->ostream.offset == tstream->buf->used); |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
251 buffer_write(tstream->buf, offset, data, size); |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
252 stream->ostream.offset = tstream->buf->used; |
17273
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
253 } else { |
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
254 if (pwrite_full(tstream->fd, data, size, offset) < 0) { |
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
255 stream->ostream.stream_errno = errno; |
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
256 i_close_fd(&tstream->fd); |
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
257 return -1; |
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
258 } |
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
259 if (tstream->fd_size < offset + size) |
1c7ee3ecbfb3
iostream-temp: Improved stream naming.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
260 tstream->fd_size = offset + size; |
17097
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
261 } |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
262 return 0; |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
263 } |
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
264 |
19905
18545181ef6a
lib: iostream-temp allows now calling o_stream_seek() on it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19837
diff
changeset
|
265 static int o_stream_temp_seek(struct ostream_private *_stream, uoff_t offset) |
18545181ef6a
lib: iostream-temp allows now calling o_stream_seek() on it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19837
diff
changeset
|
266 { |
18545181ef6a
lib: iostream-temp allows now calling o_stream_seek() on it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19837
diff
changeset
|
267 _stream->ostream.offset = offset; |
18545181ef6a
lib: iostream-temp allows now calling o_stream_seek() on it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19837
diff
changeset
|
268 return 0; |
18545181ef6a
lib: iostream-temp allows now calling o_stream_seek() on it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19837
diff
changeset
|
269 } |
18545181ef6a
lib: iostream-temp allows now calling o_stream_seek() on it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19837
diff
changeset
|
270 |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
271 struct ostream *iostream_temp_create(const char *temp_path_prefix, |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
272 enum iostream_temp_flags flags) |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 { |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
274 return iostream_temp_create_named(temp_path_prefix, flags, ""); |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
275 } |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
276 |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
277 struct ostream *iostream_temp_create_named(const char *temp_path_prefix, |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
278 enum iostream_temp_flags flags, |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
279 const char *name) |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
280 { |
19835
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
281 return iostream_temp_create_sized(temp_path_prefix, flags, name, |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
282 IOSTREAM_TEMP_MAX_BUF_SIZE_DEFAULT); |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
283 } |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
284 |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
285 struct ostream *iostream_temp_create_sized(const char *temp_path_prefix, |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
286 enum iostream_temp_flags flags, |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
287 const char *name, |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
288 size_t max_mem_size) |
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
289 { |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 struct temp_ostream *tstream; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 struct ostream *output; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 tstream = i_new(struct temp_ostream, 1); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 tstream->ostream.sendv = o_stream_temp_sendv; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
295 tstream->ostream.send_istream = o_stream_temp_send_istream; |
17097
3df6ebae9e5a
iostream-temp: Support o_stream_pwrite()
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
296 tstream->ostream.write_at = o_stream_temp_write_at; |
19905
18545181ef6a
lib: iostream-temp allows now calling o_stream_seek() on it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19837
diff
changeset
|
297 tstream->ostream.seek = o_stream_temp_seek; |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 tstream->ostream.iostream.close = o_stream_temp_close; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 tstream->temp_path_prefix = i_strdup(temp_path_prefix); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
300 tstream->flags = flags; |
19835
c2999b133d37
lib: Added iostream_temp_create_sized() to specify the max in-memory size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
301 tstream->max_mem_size = max_mem_size; |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 tstream->buf = buffer_create_dynamic(default_pool, 8192); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 tstream->fd = -1; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 output = o_stream_create(&tstream->ostream, NULL, -1); |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
306 tstream->name = i_strdup(name); |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
307 if (name[0] == '\0') { |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
308 o_stream_set_name(output, t_strdup_printf( |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
309 "(temp iostream in %s)", temp_path_prefix)); |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
310 } else { |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
311 o_stream_set_name(output, t_strdup_printf( |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
312 "(temp iostream in %s for %s)", temp_path_prefix, name)); |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
313 } |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 return output; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 static void iostream_temp_buf_destroyed(buffer_t *buf) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 buffer_free(&buf); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 struct istream *iostream_temp_finish(struct ostream **output, |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 size_t max_buffer_size) |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 struct temp_ostream *tstream = |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 (struct temp_ostream *)(*output)->real_stream; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
327 struct istream *input, *input2; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
328 uoff_t abs_offset, size; |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
329 const char *for_path; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
330 int fd; |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
332 if (tstream->name[0] == '\0') |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
333 for_path = ""; |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
334 else |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
335 for_path = t_strdup_printf(" for %s", tstream->name); |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
336 |
15731
6a6472846181
iostream-temp: Don't try to dup() the stream fd if it's already closed.
Timo Sirainen <tss@iki.fi>
parents:
15721
diff
changeset
|
337 if (tstream->dupstream != NULL && !tstream->dupstream->closed) { |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
338 abs_offset = tstream->dupstream->real_stream->abs_start_offset + |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
339 tstream->dupstream_start_offset; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
340 size = tstream->dupstream_offset - |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
341 tstream->dupstream_start_offset; |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
342 fd = dup(i_stream_get_fd(tstream->dupstream)); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
343 if (fd == -1) |
17597
82c9a9b7e6e6
When creating istream-error, give an error string whenever possible.
Timo Sirainen <tss@iki.fi>
parents:
17480
diff
changeset
|
344 input = i_stream_create_error_str(errno, "dup() failed: %m"); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
345 else { |
17480
b67c1c9bf1a5
Use the new [io]_stream_create_fd_*autoclose() functions wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
17273
diff
changeset
|
346 input2 = i_stream_create_fd_autoclose(&fd, max_buffer_size); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
347 i_stream_seek(input2, abs_offset); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
348 input = i_stream_create_limit(input2, size); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
349 i_stream_unref(&input2); |
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
350 } |
15733
b94603584655
iostream-temp: Set a name for the returned istream.
Timo Sirainen <tss@iki.fi>
parents:
15731
diff
changeset
|
351 i_stream_set_name(input, t_strdup_printf( |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
352 "(Temp file in %s%s, from %s)", tstream->temp_path_prefix, |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
353 for_path, i_stream_get_name(tstream->dupstream))); |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
354 i_stream_unref(&tstream->dupstream); |
15731
6a6472846181
iostream-temp: Don't try to dup() the stream fd if it's already closed.
Timo Sirainen <tss@iki.fi>
parents:
15721
diff
changeset
|
355 } else if (tstream->dupstream != NULL) { |
6a6472846181
iostream-temp: Don't try to dup() the stream fd if it's already closed.
Timo Sirainen <tss@iki.fi>
parents:
15721
diff
changeset
|
356 /* return the original failed stream. */ |
6a6472846181
iostream-temp: Don't try to dup() the stream fd if it's already closed.
Timo Sirainen <tss@iki.fi>
parents:
15721
diff
changeset
|
357 input = tstream->dupstream; |
15721
50d43f04511b
iostream-temp: Avoid copying data if IOSTREAM_TEMP_FLAG_TRY_FD_DUP is set.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
358 } else if (tstream->fd != -1) { |
17480
b67c1c9bf1a5
Use the new [io]_stream_create_fd_*autoclose() functions wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
17273
diff
changeset
|
359 int fd = tstream->fd; |
b67c1c9bf1a5
Use the new [io]_stream_create_fd_*autoclose() functions wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
17273
diff
changeset
|
360 input = i_stream_create_fd_autoclose(&tstream->fd, max_buffer_size); |
15733
b94603584655
iostream-temp: Set a name for the returned istream.
Timo Sirainen <tss@iki.fi>
parents:
15731
diff
changeset
|
361 i_stream_set_name(input, t_strdup_printf( |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
362 "(Temp file fd %d in %s%s, %"PRIuUOFF_T" bytes)", |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
363 fd, tstream->temp_path_prefix, for_path, tstream->fd_size)); |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 } else { |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 input = i_stream_create_from_data(tstream->buf->data, |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 tstream->buf->used); |
15733
b94603584655
iostream-temp: Set a name for the returned istream.
Timo Sirainen <tss@iki.fi>
parents:
15731
diff
changeset
|
367 i_stream_set_name(input, t_strdup_printf( |
18084
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
368 "(Temp buffer in %s%s, %"PRIuSIZE_T" bytes)", |
4e10ca59e907
lib: Added iostream_temp_create_named()
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
369 tstream->temp_path_prefix, for_path, tstream->buf->used)); |
16236
81d87e43e167
istream API change: Added support for multiple destroy callbacks.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
370 i_stream_add_destroy_callback(input, iostream_temp_buf_destroyed, |
15402
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 tstream->buf); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 tstream->buf = NULL; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 } |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 o_stream_destroy(output); |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 return input; |
faa3a83282fb
Added iostream-temp for easily creating a temporary istream (to memory/file).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 } |