Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 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 | 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 | 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 | 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 | 652 skip_size = 0; |
653 for (pos = 0; pos < iov_len; pos++) | |
654 skip_size += iov[pos].iov_len; | |
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 | 673 if (skip_size > 0) { |
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 | 676 skip_size -= ret; |
677 ret = 0; | |
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 | 680 ret -= skip_size; |
681 skip_size = 0; | |
682 } | |
683 } | |
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 | 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 | 740 if (size >= read_size) { |
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 | 753 /* buffer too large probably, try with smaller */ |
754 read_size -= size; | |
755 in_offset += read_size; | |
756 out_offset += read_size; | |
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 | 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 | 887 fstream->no_socket_cork = TRUE; |
1476 | 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 } |