annotate src/lib/ostream-unix.c @ 23007:36e01285b5b8

lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 18 Mar 2019 00:52:37 +0100
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22101
diff changeset
1 /* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */
22101
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
2
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
3 #include "lib.h"
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
4 #include "fdpass.h"
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
5 #include "ostream-file-private.h"
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
6 #include "ostream-unix.h"
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
7
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
8 struct unix_ostream {
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
9 struct file_ostream fstream;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
10 int write_fd;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
11 };
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
12
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
13 static void
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
14 o_stream_unix_close(struct iostream_private *stream, bool close_parent)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
15 {
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
16 struct unix_ostream *ustream = (struct unix_ostream *)stream;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
17
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
18 if (ustream->write_fd != -1)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
19 i_close_fd(&ustream->write_fd);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
20 o_stream_file_close(stream, close_parent);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
21 }
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
22
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
23 static ssize_t o_stream_unix_writev(struct file_ostream *fstream,
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
24 const struct const_iovec *iov,
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
25 unsigned int iov_count)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
26 {
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
27 struct unix_ostream *ustream = (struct unix_ostream *)fstream;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
28 size_t sent;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
29 ssize_t ret;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
30
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
31 if (ustream->write_fd == -1) {
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
32 /* no fd */
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
33 return o_stream_file_writev(fstream, iov, iov_count);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
34 }
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
35
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
36 /* send first iovec along with fd */
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
37 if (iov_count == 0)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
38 return 0;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
39 i_assert(iov[0].iov_len > 0);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
40 ret = fd_send(fstream->fd, ustream->write_fd,
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
41 iov[0].iov_base, iov[0].iov_len);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
42 if (ret < 0)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
43 return ret;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
44
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
45 /* update stream */
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
46 sent = ret;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
47 fstream->real_offset += sent;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
48
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
49 ustream->write_fd = -1;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
50
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
51 if (sent < iov[0].iov_len || iov_count == 1) {
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
52 /* caller will call us again to write the rest */
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
53 return sent;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
54 }
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
55
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
56 /* send remaining iovecs */
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
57 ret = o_stream_file_writev(fstream, &iov[1], iov_count-1);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
58 if (ret < 0)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
59 return (errno == EAGAIN || errno == EINTR ? (ssize_t)sent : ret);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
60 sent += ret;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
61 return sent;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
62 }
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
63
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
64 struct ostream *o_stream_create_unix(int fd, size_t max_buffer_size)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
65 {
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
66 struct unix_ostream *ustream;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
67 struct ostream *output;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
68
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
69 i_assert(fd != -1);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
70
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
71 ustream = i_new(struct unix_ostream, 1);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
72 ustream->write_fd = -1;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
73 output = o_stream_create_file_common(&ustream->fstream, fd,
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
74 max_buffer_size, FALSE);
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
75 output->real_stream->iostream.close = o_stream_unix_close;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
76 ustream->fstream.writev = o_stream_unix_writev;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
77
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
78 return output;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
79 }
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
80
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
81 bool o_stream_unix_write_fd(struct ostream *output, int fd)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
82 {
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
83 struct unix_ostream *ustream =
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
84 (struct unix_ostream *)output->real_stream;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
85
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
86 if (ustream->write_fd >= 0)
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
87 return FALSE;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
88 ustream->write_fd = fd;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
89 return TRUE;
dbb9b7c9ca9f lib: Added ostream-unix for writing fd sockets via ostream.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
90 }