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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }