Mercurial > dovecot > core-2.2
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 |
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 } |