annotate src/lib-ssl-iostream/istream-openssl.c @ 12616:bd23d4e10fa1

Added lib-ssl-iostream for handling SSL connections more easily.
author Timo Sirainen <tss@iki.fi>
date Mon, 31 Jan 2011 18:40:27 +0200
parents
children 6a3f3a5ad9a5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12616
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "istream-internal.h"
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "iostream-openssl.h"
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 struct ssl_istream {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 struct istream_private istream;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 struct ssl_iostream *ssl_io;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 bool seen_eof;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 };
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 static void i_stream_ssl_destroy(struct iostream_private *stream)
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct ssl_istream *sstream = (struct ssl_istream *)stream;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 ssl_iostream_unref(&sstream->ssl_io);
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 static ssize_t i_stream_ssl_read(struct istream_private *stream)
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct ssl_istream *sstream = (struct ssl_istream *)stream;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 size_t size;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 ssize_t ret;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 if (sstream->seen_eof) {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 stream->istream.eof = TRUE;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 return -1;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 if (!sstream->ssl_io->handshaked) {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 if ((ret = ssl_iostream_handshake(sstream->ssl_io)) <= 0) {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 if (ret < 0)
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 stream->istream.stream_errno = errno;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 return ret;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 if (!i_stream_get_buffer_space(stream, 1, &size))
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 return -2;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 while ((ret = SSL_read(sstream->ssl_io->ssl,
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 stream->w_buffer + stream->pos, size)) <= 0) {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 ret = ssl_iostream_handle_error(sstream->ssl_io, ret,
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 "SSL_read");
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 if (ret <= 0) {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 if (ret < 0) {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 stream->istream.stream_errno = errno;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 stream->istream.eof = TRUE;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 sstream->seen_eof = TRUE;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 return ret;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 (void)ssl_iostream_bio_sync(sstream->ssl_io);
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 stream->pos += ret;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 return ret;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 }
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 struct istream *i_stream_create_ssl(struct ssl_iostream *ssl_io)
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 {
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 struct ssl_istream *sstream;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 ssl_io->refcount++;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 sstream = i_new(struct ssl_istream, 1);
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 sstream->ssl_io = ssl_io;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 sstream->istream.iostream.destroy = i_stream_ssl_destroy;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 sstream->istream.max_buffer_size =
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 ssl_io->plain_input->real_stream->max_buffer_size;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 sstream->istream.read = i_stream_ssl_read;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 sstream->istream.istream.readable_fd = FALSE;
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 return i_stream_create(&sstream->istream, NULL, -1);
bd23d4e10fa1 Added lib-ssl-iostream for handling SSL connections more easily.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }