annotate src/lib/ostream-file.c @ 8590:b9faf4db2a9f HEAD

Updated copyright notices to include year 2009.
author Timo Sirainen <tss@iki.fi>
date Tue, 06 Jan 2009 09:25:38 -0500
parents 744f9dbff89c
children 52e0b40146b1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8124
diff changeset
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
805
5ac361acb316 Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
3 /* @UNSAFE: whole file */
5ac361acb316 Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
4
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "lib.h"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "ioloop.h"
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
7 #include "write-full.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "network.h"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "sendfile-util.h"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "istream.h"
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
11 #include "istream-internal.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "ostream-internal.h"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <unistd.h>
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
15 #include <sys/stat.h>
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #ifdef HAVE_SYS_UIO_H
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 # include <sys/uio.h>
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #endif
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
20 /* try to keep the buffer size within 4k..128k. ReiserFS may actually return
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
21 128k as optimal size. */
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
22 #define DEFAULT_OPTIMAL_BLOCK_SIZE 4096
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
23 #define MAX_OPTIMAL_BLOCK_SIZE (128*1024)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 #define IS_STREAM_EMPTY(fstream) \
920
30babf122f97 Minor speed optimizations
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
26 ((fstream)->head == (fstream)->tail && !(fstream)->full)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 #define MAX_SSIZE_T(size) \
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 ((size) < SSIZE_T_MAX ? (size_t)(size) : SSIZE_T_MAX)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
31 struct file_ostream {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6255
diff changeset
32 struct ostream_private ostream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 int fd;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
35 struct io *io;
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
36 uoff_t buffer_offset;
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
37 uoff_t real_offset;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 unsigned char *buffer; /* ring-buffer */
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
40 size_t buffer_size, max_buffer_size, optimal_block_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 size_t head, tail; /* first unsent/unused byte */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 unsigned int full:1; /* if head == tail, is buffer empty or full? */
1478
ce6521e4a191 Automatically set file streams to blocking and don't try to io_add() them.
Timo Sirainen <tss@iki.fi>
parents: 1476
diff changeset
44 unsigned int file:1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 unsigned int corked:1;
3336
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
46 unsigned int flush_pending:1;
4938
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
47 unsigned int socket_cork_set:1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 unsigned int no_socket_cork:1;
1115
6a233fbb02a5 Don't bother trying sendfile() more than once with the stream.
Timo Sirainen <tss@iki.fi>
parents: 1036
diff changeset
49 unsigned int no_sendfile:1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 unsigned int autoclose_fd:1;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
51 };
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
53 static void stream_send_io(struct file_ostream *fstream);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
54
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
55 static void stream_closed(struct file_ostream *fstream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 {
3960
aeb424e64f24 Call io_remove() before closing the fd. It's required by kqueue.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
57 if (fstream->io != NULL)
aeb424e64f24 Call io_remove() before closing the fd. It's required by kqueue.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
58 io_remove(&fstream->io);
aeb424e64f24 Call io_remove() before closing the fd. It's required by kqueue.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
59
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 if (fstream->autoclose_fd && fstream->fd != -1) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 if (close(fstream->fd) < 0)
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
62 i_error("file_ostream.close() failed: %m");
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
4766
b96086a311a9 When i/ostream is closed, change the fd to be -1 so it won't be accidentally
Timo Sirainen <tss@iki.fi>
parents: 4122
diff changeset
64 fstream->fd = -1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 fstream->ostream.ostream.closed = TRUE;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
69 static void o_stream_file_close(struct iostream_private *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
71 struct file_ostream *fstream = (struct file_ostream *)stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 /* flush output before really closing it */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 o_stream_flush(&fstream->ostream.ostream);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 stream_closed(fstream);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
79 static void o_stream_file_destroy(struct iostream_private *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
81 struct file_ostream *fstream = (struct file_ostream *)stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 4938
diff changeset
83 i_free(fstream->buffer);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6255
diff changeset
86 static void
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
87 o_stream_file_set_max_buffer_size(struct iostream_private *stream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
88 size_t max_size)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
90 struct file_ostream *fstream = (struct file_ostream *)stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 fstream->max_buffer_size = max_size;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
95 static void update_buffer(struct file_ostream *fstream, size_t size)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 size_t used;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98
2647
a17d7463a4dc If we couldn't send any bytes, don't reset buffer's full-flag.
Timo Sirainen <tss@iki.fi>
parents: 2634
diff changeset
99 if (IS_STREAM_EMPTY(fstream) || size == 0)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 return;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 if (fstream->head < fstream->tail) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 /* ...HXXXT... */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 used = fstream->tail - fstream->head;
2521
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
105 i_assert(size <= used);
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
106 fstream->head += size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 } else {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 /* XXXT...HXXX */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 used = fstream->buffer_size - fstream->head;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if (size > used) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 size -= used;
2521
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
112 i_assert(size <= fstream->tail);
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
113 fstream->head = size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 } else {
2521
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
115 fstream->head += size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 fstream->full = FALSE;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 if (fstream->head == fstream->tail)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 fstream->head = fstream->tail = 0;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 if (fstream->head == fstream->buffer_size)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 fstream->head = 0;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127
4938
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
128 static void o_stream_socket_cork(struct file_ostream *fstream)
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
129 {
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
130 if (fstream->corked && !fstream->socket_cork_set) {
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
131 if (!fstream->no_socket_cork) {
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
132 if (net_set_cork(fstream->fd, TRUE) < 0)
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
133 fstream->no_socket_cork = TRUE;
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
134 else
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
135 fstream->socket_cork_set = TRUE;
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
136 }
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
137 }
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
138 }
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
139
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
140 static int o_stream_lseek(struct file_ostream *fstream)
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
141 {
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
142 off_t ret;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
143
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
144 if (fstream->real_offset == fstream->buffer_offset)
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
145 return 0;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
146
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
147 ret = lseek(fstream->fd, (off_t)fstream->buffer_offset, SEEK_SET);
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
148 if (ret < 0) {
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
149 fstream->ostream.ostream.stream_errno = errno;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
150 return -1;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
151 }
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
152
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
153 if (ret != (off_t)fstream->buffer_offset) {
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
154 fstream->ostream.ostream.stream_errno = EINVAL;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
155 return -1;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
156 }
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
157 fstream->real_offset = fstream->buffer_offset;
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
158 return 0;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
159 }
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
160
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
161 static ssize_t o_stream_writev(struct file_ostream *fstream,
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
162 const struct const_iovec *iov, int iov_size)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 {
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
164 ssize_t ret, ret2;
2471
4fa0f02369b1 o_stream_sendv() returned wrong value if sending more than UIO_MAXIOV
Timo Sirainen <tss@iki.fi>
parents: 2432
diff changeset
165 size_t size, sent;
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
166 bool partial;
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
167 int i;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168
4938
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
169 o_stream_socket_cork(fstream);
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
170 if (iov_size == 1) {
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
171 if (!fstream->file ||
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
172 fstream->real_offset == fstream->buffer_offset) {
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
173 ret = write(fstream->fd, iov->iov_base, iov->iov_len);
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
174 if (ret > 0)
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
175 fstream->real_offset += ret;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
176 } else {
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
177 ret = pwrite(fstream->fd, iov->iov_base, iov->iov_len,
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
178 fstream->buffer_offset);
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
179 }
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
180 partial = ret != (ssize_t)iov->iov_len;
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
181 } else {
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
182 if (o_stream_lseek(fstream) < 0)
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
183 return -1;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
184
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
185 sent = 0; partial = FALSE;
3623
085ebc6e341c Use IOV_MAX instead of UIO_MAXIOV when available.
Timo Sirainen <tss@iki.fi>
parents: 3618
diff changeset
186 while (iov_size > IOV_MAX) {
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
187 size = 0;
3623
085ebc6e341c Use IOV_MAX instead of UIO_MAXIOV when available.
Timo Sirainen <tss@iki.fi>
parents: 3618
diff changeset
188 for (i = 0; i < IOV_MAX; i++)
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
189 size += iov[i].iov_len;
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
190
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
191 ret = writev(fstream->fd, (const struct iovec *)iov,
3623
085ebc6e341c Use IOV_MAX instead of UIO_MAXIOV when available.
Timo Sirainen <tss@iki.fi>
parents: 3618
diff changeset
192 IOV_MAX);
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
193 if (ret != (ssize_t)size) {
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
194 partial = TRUE;
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
195 break;
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
196 }
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
197
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
198 fstream->real_offset += ret;
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
199 fstream->buffer_offset += ret;
2471
4fa0f02369b1 o_stream_sendv() returned wrong value if sending more than UIO_MAXIOV
Timo Sirainen <tss@iki.fi>
parents: 2432
diff changeset
200 sent += ret;
3623
085ebc6e341c Use IOV_MAX instead of UIO_MAXIOV when available.
Timo Sirainen <tss@iki.fi>
parents: 3618
diff changeset
201 iov += IOV_MAX;
085ebc6e341c Use IOV_MAX instead of UIO_MAXIOV when available.
Timo Sirainen <tss@iki.fi>
parents: 3618
diff changeset
202 iov_size -= IOV_MAX;
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
203 }
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
204
3623
085ebc6e341c Use IOV_MAX instead of UIO_MAXIOV when available.
Timo Sirainen <tss@iki.fi>
parents: 3618
diff changeset
205 if (iov_size <= IOV_MAX) {
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
206 size = 0;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
207 for (i = 0; i < iov_size; i++)
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
208 size += iov[i].iov_len;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
209
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
210 ret = writev(fstream->fd, (const struct iovec *)iov,
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
211 iov_size);
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
212 partial = ret != (ssize_t)size;
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
213 }
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
214 if (ret > 0) {
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
215 fstream->real_offset += ret;
2521
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
216 ret += sent;
7061
4ff39d30aa4a If writev() fails for non-file and nothing was sent, return failure instead
Timo Sirainen <tss@iki.fi>
parents: 6851
diff changeset
217 } else if (!fstream->file && sent > 0) {
6851
6a9080055e54 Handle write failures with files better.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
218 /* return what we managed to get sent */
6254
28b9873da2cc If we do multiple writev() calls and the last one fails, we shouldn't treat
Timo Sirainen <tss@iki.fi>
parents: 6164
diff changeset
219 ret = sent;
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
220 }
2432
b8d2a5575fe9 Limit iovec count to UIO_MAXIOV for writev() calls.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
221 }
1146
ee4bdf40ec10 Bugfixes to handling >2GB files.
Timo Sirainen <tss@iki.fi>
parents: 1115
diff changeset
222
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 if (ret < 0) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 if (errno == EAGAIN || errno == EINTR)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 return 0;
1224
b661eb87bd26 if connection was closed while trying to write data to client, we sometimes
Timo Sirainen <tss@iki.fi>
parents: 1207
diff changeset
226 fstream->ostream.ostream.stream_errno = errno;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 stream_closed(fstream);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 }
6851
6a9080055e54 Handle write failures with files better.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
230 if (unlikely(ret == 0 && fstream->file)) {
6a9080055e54 Handle write failures with files better.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
231 /* assume out of disk space */
6a9080055e54 Handle write failures with files better.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
232 fstream->ostream.ostream.stream_errno = ENOSPC;
6a9080055e54 Handle write failures with files better.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
233 stream_closed(fstream);
6a9080055e54 Handle write failures with files better.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
234 return -1;
6a9080055e54 Handle write failures with files better.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
235 }
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
236 fstream->buffer_offset += ret;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
237 if (partial && fstream->file) {
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
238 /* we failed to write everything to a file. either we ran out
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
239 of disk space or we're writing to NFS. try to write the
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
240 rest to resolve this. */
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
241 size = ret;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
242 while (iov_size > 0 && size >= iov->iov_len) {
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
243 size -= iov->iov_len;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
244 iov++;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
245 iov_size--;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
246 }
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
247 i_assert(iov_size > 0);
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
248 if (size == 0)
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
249 ret2 = o_stream_writev(fstream, iov, iov_size);
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
250 else {
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
251 /* write the first iov separately */
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
252 struct const_iovec new_iov;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253
8124
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
254 new_iov.iov_base =
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
255 CONST_PTR_OFFSET(iov->iov_base, size);
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
256 new_iov.iov_len = iov->iov_len - size;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
257 ret2 = o_stream_writev(fstream, &new_iov, 1);
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
258 if (ret2 > 0) {
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
259 i_assert((size_t)ret2 == new_iov.iov_len);
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
260 /* write the rest */
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
261 if (iov_size > 1) {
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
262 ret += ret2;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
263 ret2 = o_stream_writev(fstream, iov + 1,
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
264 iov_size - 1);
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
265 }
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
266 }
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
267 }
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
268 if (ret2 <= 0)
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
269 return ret2;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
270 ret += ret2;
744f9dbff89c ostream: Make sure writing to files always fully succeeds or fails.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
271 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 return ret;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 /* returns how much of vector was used */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
276 static int o_stream_fill_iovec(struct file_ostream *fstream,
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
277 struct const_iovec iov[2])
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 if (IS_STREAM_EMPTY(fstream))
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 return 0;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 if (fstream->head < fstream->tail) {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
283 iov[0].iov_base = fstream->buffer + fstream->head;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 iov[0].iov_len = fstream->tail - fstream->head;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 return 1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 } else {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
287 iov[0].iov_base = fstream->buffer + fstream->head;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 iov[0].iov_len = fstream->buffer_size - fstream->head;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 if (fstream->tail == 0)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 return 1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 else {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
292 iov[1].iov_base = fstream->buffer;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 iov[1].iov_len = fstream->tail;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 return 2;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
299 static int buffer_flush(struct file_ostream *fstream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
301 struct const_iovec iov[2];
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
302 int iov_len;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
303 ssize_t ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 iov_len = o_stream_fill_iovec(fstream, iov);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
306 if (iov_len > 0) {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
307 ret = o_stream_writev(fstream, iov, iov_len);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
308 if (ret < 0)
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
309 return -1;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
310
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
311 update_buffer(fstream, ret);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
314 return IS_STREAM_EMPTY(fstream) ? 1 : 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
317 static void o_stream_file_cork(struct ostream_private *stream, bool set)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
319 struct file_ostream *fstream = (struct file_ostream *)stream;
3337
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
320 int ret;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
321
2710
ebc72e393388 Don't do anything in cork() if stream is closed.
Timo Sirainen <tss@iki.fi>
parents: 2657
diff changeset
322 if (fstream->corked != set && !stream->ostream.closed) {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
323 if (set && fstream->io != NULL)
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
324 io_remove(&fstream->io);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
325 else if (!set) {
4838
2ccd3ad66e29 If connection is closed while buffer is being flushed in uncorking, don't
Timo Sirainen <tss@iki.fi>
parents: 4766
diff changeset
326 /* buffer flushing might close the stream */
3337
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
327 ret = buffer_flush(fstream);
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
328 if (fstream->io == NULL &&
4838
2ccd3ad66e29 If connection is closed while buffer is being flushed in uncorking, don't
Timo Sirainen <tss@iki.fi>
parents: 4766
diff changeset
329 (ret == 0 || fstream->flush_pending) &&
2ccd3ad66e29 If connection is closed while buffer is being flushed in uncorking, don't
Timo Sirainen <tss@iki.fi>
parents: 4766
diff changeset
330 !stream->ostream.closed) {
3337
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
331 fstream->io = io_add(fstream->fd, IO_WRITE,
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
332 stream_send_io, fstream);
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
333 }
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
334 }
b47043d0d131 Try to flush output before uncorking
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
335
4938
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
336 if (fstream->socket_cork_set) {
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
337 i_assert(!set);
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
338 if (net_set_cork(fstream->fd, FALSE) < 0)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
339 fstream->no_socket_cork = TRUE;
4938
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
340 fstream->socket_cork_set = FALSE;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
341 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
342 fstream->corked = set;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
346 static int o_stream_file_flush(struct ostream_private *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
348 struct file_ostream *fstream = (struct file_ostream *) stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
350 return buffer_flush(fstream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
353 static void
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
354 o_stream_file_flush_pending(struct ostream_private *stream, bool set)
3336
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
355 {
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
356 struct file_ostream *fstream = (struct file_ostream *) stream;
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
357
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
358 fstream->flush_pending = set;
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
359 if (set && !fstream->corked && fstream->io == NULL) {
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
360 fstream->io = io_add(fstream->fd, IO_WRITE,
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
361 stream_send_io, fstream);
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
362 }
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
363 }
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
364
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
365 static size_t get_unused_space(const struct file_ostream *fstream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 if (fstream->head > fstream->tail) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 /* XXXT...HXXX */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 return fstream->head - fstream->tail;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 } else if (fstream->head < fstream->tail) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 /* ...HXXXT... */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 return (fstream->buffer_size - fstream->tail) + fstream->head;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 } else {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 /* either fully unused or fully used */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 return fstream->full ? 0 : fstream->buffer_size;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
379 static size_t o_stream_file_get_used_size(const struct ostream_private *stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
381 const struct file_ostream *fstream =
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
382 (const struct file_ostream *)stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
384 return fstream->buffer_size - get_unused_space(fstream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
387 static int o_stream_file_seek(struct ostream_private *stream, uoff_t offset)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
389 struct file_ostream *fstream = (struct file_ostream *)stream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
391 if (offset > OFF_T_MAX || !fstream->file) {
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 stream->ostream.stream_errno = EINVAL;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395
1207
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
396 if (buffer_flush(fstream) < 0)
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
397 return -1;
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
398
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 stream->ostream.offset = offset;
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
400 fstream->buffer_offset = offset;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 return 1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
404 static void o_stream_grow_buffer(struct file_ostream *fstream, size_t bytes)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 {
2756
9cd5d91509bb Growing output buffer size broke the data inside it.
Timo Sirainen <tss@iki.fi>
parents: 2750
diff changeset
406 size_t size, new_size, end_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 4938
diff changeset
408 size = nearest_power(fstream->buffer_size + bytes);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
409 if (size > fstream->max_buffer_size) {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
410 /* limit the size */
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
411 size = fstream->max_buffer_size;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
412 } else if (fstream->corked) {
2657
b89f471a0e04 When corked, don't limit buffer size to optimal_block_size. Fixes problems
Timo Sirainen <tss@iki.fi>
parents: 2647
diff changeset
413 /* try to use optimal buffer size with corking */
b89f471a0e04 When corked, don't limit buffer size to optimal_block_size. Fixes problems
Timo Sirainen <tss@iki.fi>
parents: 2647
diff changeset
414 new_size = I_MIN(fstream->optimal_block_size,
b89f471a0e04 When corked, don't limit buffer size to optimal_block_size. Fixes problems
Timo Sirainen <tss@iki.fi>
parents: 2647
diff changeset
415 fstream->max_buffer_size);
b89f471a0e04 When corked, don't limit buffer size to optimal_block_size. Fixes problems
Timo Sirainen <tss@iki.fi>
parents: 2647
diff changeset
416 if (new_size > size)
b89f471a0e04 When corked, don't limit buffer size to optimal_block_size. Fixes problems
Timo Sirainen <tss@iki.fi>
parents: 2647
diff changeset
417 size = new_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
420 if (size <= fstream->buffer_size)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 return;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 4938
diff changeset
423 fstream->buffer = i_realloc(fstream->buffer,
941
4d6b69558add Added old_size parameter to p_realloc() - we rarely need it and this way
Timo Sirainen <tss@iki.fi>
parents: 920
diff changeset
424 fstream->buffer_size, size);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 if (fstream->tail <= fstream->head && !IS_STREAM_EMPTY(fstream)) {
2756
9cd5d91509bb Growing output buffer size broke the data inside it.
Timo Sirainen <tss@iki.fi>
parents: 2750
diff changeset
427 /* move head forward to end of buffer */
9cd5d91509bb Growing output buffer size broke the data inside it.
Timo Sirainen <tss@iki.fi>
parents: 2750
diff changeset
428 end_size = fstream->buffer_size - fstream->head;
9cd5d91509bb Growing output buffer size broke the data inside it.
Timo Sirainen <tss@iki.fi>
parents: 2750
diff changeset
429 memmove(fstream->buffer + size - end_size,
9cd5d91509bb Growing output buffer size broke the data inside it.
Timo Sirainen <tss@iki.fi>
parents: 2750
diff changeset
430 fstream->buffer + fstream->head, end_size);
9cd5d91509bb Growing output buffer size broke the data inside it.
Timo Sirainen <tss@iki.fi>
parents: 2750
diff changeset
431 fstream->head = size - end_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 fstream->full = FALSE;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 fstream->buffer_size = size;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
438 static void stream_send_io(struct file_ostream *fstream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
440 struct ostream *ostream = &fstream->ostream.ostream;
2790
02c0b8d532c2 Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents: 2756
diff changeset
441 int ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442
3392
e8c0736ec5be Don't forget o_stream_set_flush_pending() call if it's called in flush
Timo Sirainen <tss@iki.fi>
parents: 3337
diff changeset
443 /* Set flush_pending = FALSE first before calling the flush callback,
e8c0736ec5be Don't forget o_stream_set_flush_pending() call if it's called in flush
Timo Sirainen <tss@iki.fi>
parents: 3337
diff changeset
444 and change it to TRUE only if callback returns 0. That way the
e8c0736ec5be Don't forget o_stream_set_flush_pending() call if it's called in flush
Timo Sirainen <tss@iki.fi>
parents: 3337
diff changeset
445 callback can call o_stream_set_flush_pending() again and we don't
e8c0736ec5be Don't forget o_stream_set_flush_pending() call if it's called in flush
Timo Sirainen <tss@iki.fi>
parents: 3337
diff changeset
446 forget it even if flush callback returns 1. */
e8c0736ec5be Don't forget o_stream_set_flush_pending() call if it's called in flush
Timo Sirainen <tss@iki.fi>
parents: 3337
diff changeset
447 fstream->flush_pending = FALSE;
e8c0736ec5be Don't forget o_stream_set_flush_pending() call if it's called in flush
Timo Sirainen <tss@iki.fi>
parents: 3337
diff changeset
448
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
449 o_stream_ref(ostream);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
450 if (fstream->ostream.callback != NULL)
2790
02c0b8d532c2 Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents: 2756
diff changeset
451 ret = fstream->ostream.callback(fstream->ostream.context);
02c0b8d532c2 Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents: 2756
diff changeset
452 else
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
453 ret = o_stream_file_flush(&fstream->ostream);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
454
3395
5573554dce0c Don't remove output handler if flush_pending is still set after callback.
Timo Sirainen <tss@iki.fi>
parents: 3392
diff changeset
455 if (ret == 0)
5573554dce0c Don't remove output handler if flush_pending is still set after callback.
Timo Sirainen <tss@iki.fi>
parents: 3392
diff changeset
456 fstream->flush_pending = TRUE;
5573554dce0c Don't remove output handler if flush_pending is still set after callback.
Timo Sirainen <tss@iki.fi>
parents: 3392
diff changeset
457
3401
c19d6448f856 Set output I/O handler after output callback if needed.
Timo Sirainen <tss@iki.fi>
parents: 3395
diff changeset
458 if (!fstream->flush_pending && IS_STREAM_EMPTY(fstream)) {
c19d6448f856 Set output I/O handler after output callback if needed.
Timo Sirainen <tss@iki.fi>
parents: 3395
diff changeset
459 if (fstream->io != NULL) {
c19d6448f856 Set output I/O handler after output callback if needed.
Timo Sirainen <tss@iki.fi>
parents: 3395
diff changeset
460 /* all sent */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
461 io_remove(&fstream->io);
3401
c19d6448f856 Set output I/O handler after output callback if needed.
Timo Sirainen <tss@iki.fi>
parents: 3395
diff changeset
462 }
4122
9e5af78ea530 If output flush callback closed the stream, don't add another flush I/O
Timo Sirainen <tss@iki.fi>
parents: 3960
diff changeset
463 } else if (!fstream->ostream.ostream.closed) {
3665
1f4b4387595b Revert previous "cleanup" which broke things.. Added a comment.
Timo Sirainen <tss@iki.fi>
parents: 3653
diff changeset
464 /* Add the IO handler if it's not there already. Callback
1f4b4387595b Revert previous "cleanup" which broke things.. Added a comment.
Timo Sirainen <tss@iki.fi>
parents: 3653
diff changeset
465 might have just returned 0 without there being any data
1f4b4387595b Revert previous "cleanup" which broke things.. Added a comment.
Timo Sirainen <tss@iki.fi>
parents: 3653
diff changeset
466 to be sent. */
1f4b4387595b Revert previous "cleanup" which broke things.. Added a comment.
Timo Sirainen <tss@iki.fi>
parents: 3653
diff changeset
467 if (fstream->io == NULL) {
1f4b4387595b Revert previous "cleanup" which broke things.. Added a comment.
Timo Sirainen <tss@iki.fi>
parents: 3653
diff changeset
468 fstream->io = io_add(fstream->fd, IO_WRITE,
1f4b4387595b Revert previous "cleanup" which broke things.. Added a comment.
Timo Sirainen <tss@iki.fi>
parents: 3653
diff changeset
469 stream_send_io, fstream);
1f4b4387595b Revert previous "cleanup" which broke things.. Added a comment.
Timo Sirainen <tss@iki.fi>
parents: 3653
diff changeset
470 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 }
3336
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
472
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
473 o_stream_unref(&ostream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
476 static size_t o_stream_add(struct file_ostream *fstream,
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
477 const void *data, size_t size)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 size_t unused, sent;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 int i;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 unused = get_unused_space(fstream);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 if (unused < size)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 o_stream_grow_buffer(fstream, size-unused);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 sent = 0;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 for (i = 0; i < 2 && sent < size && !fstream->full; i++) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 unused = fstream->tail >= fstream->head ?
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 fstream->buffer_size - fstream->tail :
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 fstream->head - fstream->tail;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 if (unused > size-sent)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 unused = size-sent;
2521
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
494 memcpy(fstream->buffer + fstream->tail,
3418a7f233ff Output stream sometimes duplicated data and sometimes lost data.
Timo Sirainen <tss@iki.fi>
parents: 2484
diff changeset
495 CONST_PTR_OFFSET(data, sent), unused);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 sent += unused;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 fstream->tail += unused;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 if (fstream->tail == fstream->buffer_size)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 fstream->tail = 0;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 if (fstream->head == fstream->tail)
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 fstream->full = TRUE;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505
1478
ce6521e4a191 Automatically set file streams to blocking and don't try to io_add() them.
Timo Sirainen <tss@iki.fi>
parents: 1476
diff changeset
506 if (sent != 0 && fstream->io == NULL &&
ce6521e4a191 Automatically set file streams to blocking and don't try to io_add() them.
Timo Sirainen <tss@iki.fi>
parents: 1476
diff changeset
507 !fstream->corked && !fstream->file) {
1499
e850252cdc7e Removed I/O priorities. They were pretty much useless and were just getting
Timo Sirainen <tss@iki.fi>
parents: 1487
diff changeset
508 fstream->io = io_add(fstream->fd, IO_WRITE, stream_send_io,
e850252cdc7e Removed I/O priorities. They were pretty much useless and were just getting
Timo Sirainen <tss@iki.fi>
parents: 1487
diff changeset
509 fstream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 return sent;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
515 static ssize_t o_stream_file_sendv(struct ostream_private *stream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
516 const struct const_iovec *iov,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
517 unsigned int iov_count)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
519 struct file_ostream *fstream = (struct file_ostream *)stream;
6254
28b9873da2cc If we do multiple writev() calls and the last one fails, we shouldn't treat
Timo Sirainen <tss@iki.fi>
parents: 6164
diff changeset
520 size_t size, total_size, added, optimal_size;
3618
a16f27ce2eda Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents: 3401
diff changeset
521 unsigned int i;
1305
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
522 ssize_t ret = 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
524 for (i = 0, size = 0; i < iov_count; i++)
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
525 size += iov[i].iov_len;
6254
28b9873da2cc If we do multiple writev() calls and the last one fails, we shouldn't treat
Timo Sirainen <tss@iki.fi>
parents: 6164
diff changeset
526 total_size = size;
1305
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
527
3618
a16f27ce2eda Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents: 3401
diff changeset
528 if (size > get_unused_space(fstream) && !IS_STREAM_EMPTY(fstream)) {
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
529 if (o_stream_file_flush(stream) < 0)
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
530 return -1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
533 optimal_size = I_MIN(fstream->optimal_block_size,
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
534 fstream->max_buffer_size);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
535 if (IS_STREAM_EMPTY(fstream) &&
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
536 (!fstream->corked || size >= optimal_size)) {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
537 /* send immediately */
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
538 ret = o_stream_writev(fstream, iov, iov_count);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
539 if (ret < 0)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 return -1;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
541
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
542 size = ret;
6254
28b9873da2cc If we do multiple writev() calls and the last one fails, we shouldn't treat
Timo Sirainen <tss@iki.fi>
parents: 6164
diff changeset
543 while (size > 0 && iov_count > 0 && size >= iov[0].iov_len) {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
544 size -= iov[0].iov_len;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
545 iov++;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
546 iov_count--;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
547 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
548
6254
28b9873da2cc If we do multiple writev() calls and the last one fails, we shouldn't treat
Timo Sirainen <tss@iki.fi>
parents: 6164
diff changeset
549 if (iov_count == 0)
28b9873da2cc If we do multiple writev() calls and the last one fails, we shouldn't treat
Timo Sirainen <tss@iki.fi>
parents: 6164
diff changeset
550 i_assert(size == 0);
28b9873da2cc If we do multiple writev() calls and the last one fails, we shouldn't treat
Timo Sirainen <tss@iki.fi>
parents: 6164
diff changeset
551 else {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
552 added = o_stream_add(fstream,
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
553 CONST_PTR_OFFSET(iov[0].iov_base, size),
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
554 iov[0].iov_len - size);
2484
c8b12c26a040 o_stream_send*() might have returned wrong value
Timo Sirainen <tss@iki.fi>
parents: 2471
diff changeset
555 ret += added;
c8b12c26a040 o_stream_send*() might have returned wrong value
Timo Sirainen <tss@iki.fi>
parents: 2471
diff changeset
556
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
557 if (added != iov[0].iov_len - size) {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
558 /* buffer full */
2484
c8b12c26a040 o_stream_send*() might have returned wrong value
Timo Sirainen <tss@iki.fi>
parents: 2471
diff changeset
559 stream->ostream.offset += ret;
c8b12c26a040 o_stream_send*() might have returned wrong value
Timo Sirainen <tss@iki.fi>
parents: 2471
diff changeset
560 return ret;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
561 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
562
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
563 iov++;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
564 iov_count--;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
565 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 }
1207
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
567
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
568 /* buffer it, at least partly */
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
569 for (i = 0; i < iov_count; i++) {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
570 added = o_stream_add(fstream, iov[i].iov_base, iov[i].iov_len);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
571 ret += added;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
572 if (added != iov[i].iov_len)
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
573 break;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
574 }
1207
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
575 stream->ostream.offset += ret;
6848
b73cb35a8427 Assert: With files o_stream_send*() must either write everything or return
Timo Sirainen <tss@iki.fi>
parents: 6723
diff changeset
576 i_assert((size_t)ret <= total_size);
b73cb35a8427 Assert: With files o_stream_send*() must either write everything or return
Timo Sirainen <tss@iki.fi>
parents: 6723
diff changeset
577 i_assert((size_t)ret == total_size || !fstream->file);
1207
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
578 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6255
diff changeset
581 static off_t io_stream_sendfile(struct ostream_private *outstream,
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
582 struct istream *instream, int in_fd)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
584 struct file_ostream *foutstream = (struct file_ostream *)outstream;
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
585 const struct stat *st;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 uoff_t start_offset;
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
587 uoff_t in_size, offset, send_size, v_offset;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 ssize_t ret;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
590 st = i_stream_stat(instream, TRUE);
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
591 if (st == NULL) {
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
592 outstream->ostream.stream_errno = instream->stream_errno;
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
593 return -1;
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
594 }
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
595 in_size = st->st_size;
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
596
4938
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
597 o_stream_socket_cork(foutstream);
e3539fafe74f Delay setting the TCP cork until something is actually sent to the
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
598
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 /* flush out any data in buffer */
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
600 if ((ret = buffer_flush(foutstream)) <= 0)
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
601 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
603 if (o_stream_lseek(foutstream) < 0)
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
604 return -1;
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
605
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
606 start_offset = v_offset = instream->v_offset;
1146
ee4bdf40ec10 Bugfixes to handling >2GB files.
Timo Sirainen <tss@iki.fi>
parents: 1115
diff changeset
607 do {
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
608 offset = instream->real_stream->abs_start_offset + v_offset;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
609 send_size = in_size - v_offset;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 ret = safe_sendfile(foutstream->fd, in_fd, &offset,
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 MAX_SSIZE_T(send_size));
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
613 if (ret <= 0) {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
614 if (ret == 0 || errno == EINTR || errno == EAGAIN) {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
615 ret = 0;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
616 break;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
617 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
618
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
619 outstream->ostream.stream_errno = errno;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
620 if (errno != EINVAL) {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
621 /* close only if error wasn't because
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
622 sendfile() isn't supported */
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
623 stream_closed(foutstream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 }
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
625 break;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627
1146
ee4bdf40ec10 Bugfixes to handling >2GB files.
Timo Sirainen <tss@iki.fi>
parents: 1115
diff changeset
628 v_offset += ret;
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
629 foutstream->real_offset += ret;
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
630 foutstream->buffer_offset += ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 outstream->ostream.offset += ret;
1146
ee4bdf40ec10 Bugfixes to handling >2GB files.
Timo Sirainen <tss@iki.fi>
parents: 1115
diff changeset
632 } while ((uoff_t)ret != send_size);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
633
1204
db5958ba1c32 sendfile bugfix
Timo Sirainen <tss@iki.fi>
parents: 1197
diff changeset
634 i_stream_seek(instream, v_offset);
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
635 return ret < 0 ? -1 : (off_t)(instream->v_offset - start_offset);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
636 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6255
diff changeset
638 static off_t io_stream_copy(struct ostream_private *outstream,
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
639 struct istream *instream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
641 struct file_ostream *foutstream = (struct file_ostream *)outstream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 uoff_t start_offset;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
643 struct const_iovec iov[3];
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 int iov_len;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 const unsigned char *data;
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
646 size_t size, skip_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 ssize_t ret;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 int pos;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650 iov_len = o_stream_fill_iovec(foutstream, iov);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651
1305
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
652 skip_size = 0;
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
653 for (pos = 0; pos < iov_len; pos++)
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
654 skip_size += iov[pos].iov_len;
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
655
2634
b847d8650282 o_stream_send_istream() was buggy if input stream's offset wasn't 0 or if
Timo Sirainen <tss@iki.fi>
parents: 2554
diff changeset
656 start_offset = instream->v_offset;
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
657 for (;;) {
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
658 (void)i_stream_read_data(instream, &data, &size,
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
659 foutstream->optimal_block_size-1);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 if (size == 0) {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 /* all sent */
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 break;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
663 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 pos = iov_len++;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 iov[pos].iov_base = (void *) data;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 iov[pos].iov_len = size;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 ret = o_stream_writev(foutstream, iov, iov_len);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
670 if (ret < 0)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672
1305
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
673 if (skip_size > 0) {
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
674 if ((size_t)ret < skip_size) {
2536
0d2c47d85a3a _send_istream() might have crashed.
Timo Sirainen <tss@iki.fi>
parents: 2521
diff changeset
675 update_buffer(foutstream, ret);
1305
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
676 skip_size -= ret;
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
677 ret = 0;
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
678 } else {
2536
0d2c47d85a3a _send_istream() might have crashed.
Timo Sirainen <tss@iki.fi>
parents: 2521
diff changeset
679 update_buffer(foutstream, skip_size);
1305
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
680 ret -= skip_size;
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
681 skip_size = 0;
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
682 }
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
683 }
06e9bb095cb3 file offset wasn't kept right.
Timo Sirainen <tss@iki.fi>
parents: 1245
diff changeset
684 outstream->ostream.offset += ret;
2988
76d0e16d45e6 Go back to the version before recent changes. It was correct all the time.
Timo Sirainen <tss@iki.fi>
parents: 2985
diff changeset
685 i_stream_skip(instream, ret);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
687 if ((size_t)ret != iov[pos].iov_len)
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
688 break;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689
2554
3ad5b4e60321 Added assert
Timo Sirainen <tss@iki.fi>
parents: 2536
diff changeset
690 i_assert(skip_size == 0);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
691 iov_len = 0;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694 return (off_t) (instream->v_offset - start_offset);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6255
diff changeset
697 static off_t io_stream_copy_backwards(struct ostream_private *outstream,
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
698 struct istream *instream, uoff_t in_size)
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
699 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
700 struct file_ostream *foutstream = (struct file_ostream *)outstream;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
701 uoff_t in_start_offset, in_offset, in_limit, out_offset;
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
702 const unsigned char *data;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
703 size_t buffer_size, size, read_size;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
704 ssize_t ret;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
705
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
706 i_assert(IS_STREAM_EMPTY(foutstream));
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
707
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
708 /* figure out optimal buffer size */
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
709 buffer_size = instream->real_stream->buffer_size;
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
710 if (buffer_size == 0 || buffer_size > foutstream->buffer_size) {
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
711 if (foutstream->optimal_block_size > foutstream->buffer_size) {
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
712 o_stream_grow_buffer(foutstream,
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
713 foutstream->optimal_block_size -
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
714 foutstream->buffer_size);
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
715 }
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
716
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
717 buffer_size = foutstream->buffer_size;
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
718 }
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
719
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
720 in_start_offset = instream->v_offset;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
721 in_offset = in_limit = in_size;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
722 out_offset = outstream->ostream.offset + (in_offset - in_start_offset);
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
723
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
724 while (in_offset > in_start_offset) {
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
725 if (in_offset - in_start_offset <= buffer_size)
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
726 read_size = in_offset - in_start_offset;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
727 else
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
728 read_size = buffer_size;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
729 in_offset -= read_size;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
730 out_offset -= read_size;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
731
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
732 for (;;) {
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
733 i_assert(in_offset <= in_limit);
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
734
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
735 i_stream_seek(instream, in_offset);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
736 read_size = in_limit - in_offset;
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
737
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
738 (void)i_stream_read_data(instream, &data, &size,
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
739 read_size-1);
2040
6920ebecb853 o_stream_send_istream() fix
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
740 if (size >= read_size) {
6920ebecb853 o_stream_send_istream() fix
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
741 size = read_size;
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
742 if (instream->mmaped) {
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
743 /* we'll have to write it through
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
744 buffer or the file gets corrupted */
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
745 i_assert(size <=
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
746 foutstream->buffer_size);
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
747 memcpy(foutstream->buffer, data, size);
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
748 data = foutstream->buffer;
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
749 }
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
750 break;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
751 }
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
752
2040
6920ebecb853 o_stream_send_istream() fix
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
753 /* buffer too large probably, try with smaller */
6920ebecb853 o_stream_send_istream() fix
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
754 read_size -= size;
6920ebecb853 o_stream_send_istream() fix
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
755 in_offset += read_size;
6920ebecb853 o_stream_send_istream() fix
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
756 out_offset += read_size;
6920ebecb853 o_stream_send_istream() fix
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
757 buffer_size -= read_size;
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
758 }
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
759 in_limit -= size;
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
760
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
761 ret = pwrite_full(foutstream->fd, data, size, out_offset);
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
762 if (ret < 0) {
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
763 /* error */
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
764 outstream->ostream.stream_errno = errno;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
765 return -1;
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
766 }
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
767 }
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
768
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
769 return (off_t) (in_size - in_start_offset);
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
770 }
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
771
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
772 static off_t o_stream_file_send_istream(struct ostream_private *outstream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
773 struct istream *instream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774 {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2245
diff changeset
775 struct file_ostream *foutstream = (struct file_ostream *)outstream;
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
776 const struct stat *st;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
777 off_t ret;
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
778 int in_fd;
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
779
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
780 in_fd = i_stream_get_fd(instream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
781
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
782 if (in_fd == foutstream->fd) {
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
783 /* copying data within same fd. we'll have to be careful with
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
784 seeks and overlapping writes. */
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
785 st = i_stream_stat(instream, TRUE);
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
786 if (st == NULL) {
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
787 outstream->ostream.stream_errno = instream->stream_errno;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
788 return -1;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
789 }
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
790 i_assert(instream->v_offset <= (uoff_t)st->st_size);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
791
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
792 ret = (off_t)outstream->ostream.offset -
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
793 (off_t)(instream->real_stream->abs_start_offset +
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents: 1861
diff changeset
794 instream->v_offset);
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
795 if (ret == 0) {
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
796 /* copying data over itself. we don't really
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
797 need to do that, just fake it. */
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
798 return st->st_size - instream->v_offset;
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
799 }
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
800 if (ret > 0) {
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
801 /* overlapping */
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
802 return io_stream_copy_backwards(outstream, instream,
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
803 st->st_size);
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
804 }
1197
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
805 }
e86f259048cf o_stream_send_istream() is now safe to use for moving data within file.
Timo Sirainen <tss@iki.fi>
parents: 1146
diff changeset
806
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
807 if (!foutstream->no_sendfile && in_fd != -1 && instream->seekable) {
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
808 ret = io_stream_sendfile(outstream, instream, in_fd);
1115
6a233fbb02a5 Don't bother trying sendfile() more than once with the stream.
Timo Sirainen <tss@iki.fi>
parents: 1036
diff changeset
809 if (ret >= 0 || outstream->ostream.stream_errno != EINVAL)
6a233fbb02a5 Don't bother trying sendfile() more than once with the stream.
Timo Sirainen <tss@iki.fi>
parents: 1036
diff changeset
810 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811
1115
6a233fbb02a5 Don't bother trying sendfile() more than once with the stream.
Timo Sirainen <tss@iki.fi>
parents: 1036
diff changeset
812 /* sendfile() not supported (with this fd), fallback to
1146
ee4bdf40ec10 Bugfixes to handling >2GB files.
Timo Sirainen <tss@iki.fi>
parents: 1115
diff changeset
813 regular sending. */
1115
6a233fbb02a5 Don't bother trying sendfile() more than once with the stream.
Timo Sirainen <tss@iki.fi>
parents: 1036
diff changeset
814 outstream->ostream.stream_errno = 0;
6a233fbb02a5 Don't bother trying sendfile() more than once with the stream.
Timo Sirainen <tss@iki.fi>
parents: 1036
diff changeset
815 foutstream->no_sendfile = TRUE;
6a233fbb02a5 Don't bother trying sendfile() more than once with the stream.
Timo Sirainen <tss@iki.fi>
parents: 1036
diff changeset
816 }
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
817
6723
ba048bb01842 o_stream_send_istream(): Don't fstat() the stream unless we have to.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
818 return io_stream_copy(outstream, instream);
1861
e42d97a85653 Added istream->eof. istream->v_size is now set to 0 with files.
Timo Sirainen <tss@iki.fi>
parents: 1834
diff changeset
819 }
e42d97a85653 Added istream->eof. istream->v_size is now set to 0 with files.
Timo Sirainen <tss@iki.fi>
parents: 1834
diff changeset
820
6161
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
821 static struct file_ostream *
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
822 o_stream_create_fd_common(int fd, bool autoclose_fd)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
823 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 805
diff changeset
824 struct file_ostream *fstream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
825
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 4938
diff changeset
826 fstream = i_new(struct file_ostream, 1);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827 fstream->fd = fd;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 fstream->autoclose_fd = autoclose_fd;
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
829 fstream->optimal_block_size = DEFAULT_OPTIMAL_BLOCK_SIZE;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
831 fstream->ostream.iostream.close = o_stream_file_close;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
832 fstream->ostream.iostream.destroy = o_stream_file_destroy;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
833 fstream->ostream.iostream.set_max_buffer_size =
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
834 o_stream_file_set_max_buffer_size;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
836 fstream->ostream.cork = o_stream_file_cork;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
837 fstream->ostream.flush = o_stream_file_flush;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
838 fstream->ostream.flush_pending = o_stream_file_flush_pending;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
839 fstream->ostream.get_used_size = o_stream_file_get_used_size;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
840 fstream->ostream.seek = o_stream_file_seek;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
841 fstream->ostream.sendv = o_stream_file_sendv;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6415
diff changeset
842 fstream->ostream.send_istream = o_stream_file_send_istream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
843
6161
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
844 return fstream;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
845 }
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
846
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
847 static void fstream_init_file(struct file_ostream *fstream)
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
848 {
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
849 struct stat st;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
850
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
851 fstream->no_sendfile = TRUE;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
852 if (fstat(fstream->fd, &st) < 0)
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
853 return;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
854
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
855 if ((uoff_t)st.st_blksize > fstream->optimal_block_size) {
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
856 /* use the optimal block size, but with a reasonable limit */
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
857 fstream->optimal_block_size =
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
858 I_MIN(st.st_blksize, MAX_OPTIMAL_BLOCK_SIZE);
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
859 }
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
860
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
861 if (S_ISREG(st.st_mode)) {
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
862 fstream->no_socket_cork = TRUE;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
863 fstream->file = TRUE;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
864 }
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
865 }
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
866
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
867 struct ostream *
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
868 o_stream_create_fd(int fd, size_t max_buffer_size, bool autoclose_fd)
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
869 {
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
870 struct file_ostream *fstream;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
871 struct ostream *ostream;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
872 off_t offset;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
873
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
874 fstream = o_stream_create_fd_common(fd, autoclose_fd);
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
875 fstream->max_buffer_size = max_buffer_size;
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6255
diff changeset
876 ostream = o_stream_create(&fstream->ostream);
1207
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
877
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
878 offset = lseek(fd, 0, SEEK_CUR);
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
879 if (offset >= 0) {
1207
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
880 ostream->offset = offset;
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
881 fstream->real_offset = offset;
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
882 fstream->buffer_offset = offset;
6161
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
883 fstream_init_file(fstream);
1345
04b81672c3a3 Call safe_sendfile() only with sockets, and also with files under Linux.
Timo Sirainen <tss@iki.fi>
parents: 1305
diff changeset
884 } else {
1476
6e2806114f44 Don't try to cork files.
Timo Sirainen <tss@iki.fi>
parents: 1345
diff changeset
885 if (net_getsockname(fd, NULL, NULL) < 0) {
1345
04b81672c3a3 Call safe_sendfile() only with sockets, and also with files under Linux.
Timo Sirainen <tss@iki.fi>
parents: 1305
diff changeset
886 fstream->no_sendfile = TRUE;
1487
Timo Sirainen <tss@iki.fi>
parents: 1478
diff changeset
887 fstream->no_socket_cork = TRUE;
1476
6e2806114f44 Don't try to cork files.
Timo Sirainen <tss@iki.fi>
parents: 1345
diff changeset
888 }
1245
06b1b95ae756 Try to use optimal block sizes when writing to files.
Timo Sirainen <tss@iki.fi>
parents: 1224
diff changeset
889 }
2245
95fe82bbda7a Allow giving 0 max_buffer_size, in which case "optimal" size is used.
Timo Sirainen <tss@iki.fi>
parents: 2072
diff changeset
890
95fe82bbda7a Allow giving 0 max_buffer_size, in which case "optimal" size is used.
Timo Sirainen <tss@iki.fi>
parents: 2072
diff changeset
891 if (max_buffer_size == 0)
95fe82bbda7a Allow giving 0 max_buffer_size, in which case "optimal" size is used.
Timo Sirainen <tss@iki.fi>
parents: 2072
diff changeset
892 fstream->max_buffer_size = fstream->optimal_block_size;
95fe82bbda7a Allow giving 0 max_buffer_size, in which case "optimal" size is used.
Timo Sirainen <tss@iki.fi>
parents: 2072
diff changeset
893
1207
cf9558657ded ostream: get initial offset. flush buffer before seeking.
Timo Sirainen <tss@iki.fi>
parents: 1204
diff changeset
894 return ostream;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895 }
6161
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
896
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
897 struct ostream *
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
898 o_stream_create_fd_file(int fd, uoff_t offset, bool autoclose_fd)
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
899 {
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
900 struct file_ostream *fstream;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
901 struct ostream *ostream;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
902
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
903 if (offset == (uoff_t)-1)
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
904 offset = lseek(fd, 0, SEEK_CUR);
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
905
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
906 fstream = o_stream_create_fd_common(fd, autoclose_fd);
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
907 fstream_init_file(fstream);
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
908 fstream->max_buffer_size = fstream->optimal_block_size;
6163
48dbfdba4e24 Delay lseek()s and use pwrite() whenever possible.
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
909 fstream->real_offset = offset;
6164
22398d619cac Delayed lseek()/pwrite() fixes.
Timo Sirainen <tss@iki.fi>
parents: 6163
diff changeset
910 fstream->buffer_offset = offset;
6161
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
911
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6255
diff changeset
912 ostream = o_stream_create(&fstream->ostream);
6161
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
913 ostream->offset = offset;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
914 return ostream;
c62f7ee79446 Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
915 }