diff options
| author | jsing <> | 2015-03-31 14:03:38 +0000 | 
|---|---|---|
| committer | jsing <> | 2015-03-31 14:03:38 +0000 | 
| commit | 6532e10a84a6b48e6521919594e1bd396ddacdb6 (patch) | |
| tree | c543b48853afa3779822fdf734c77e67d886bf12 /src/lib/libtls/tls_server.c | |
| parent | 3ae32b082287786588f78075822ef3789949ab74 (diff) | |
| download | openbsd-6532e10a84a6b48e6521919594e1bd396ddacdb6.tar.gz openbsd-6532e10a84a6b48e6521919594e1bd396ddacdb6.tar.bz2 openbsd-6532e10a84a6b48e6521919594e1bd396ddacdb6.zip | |
Provide a tls_accept_fds() function, which allows a TLS connection to be
accepted via an existing pair of file descriptors.
Based on a diff from Jan Klemkow.
Diffstat (limited to 'src/lib/libtls/tls_server.c')
| -rw-r--r-- | src/lib/libtls/tls_server.c | 21 | 
1 files changed, 16 insertions, 5 deletions
| diff --git a/src/lib/libtls/tls_server.c b/src/lib/libtls/tls_server.c index cbe064e2f5..55b19e472c 100644 --- a/src/lib/libtls/tls_server.c +++ b/src/lib/libtls/tls_server.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_server.c,v 1.6 2015/03/31 12:21:27 jsing Exp $ */ | 1 | /* $OpenBSD: tls_server.c,v 1.7 2015/03/31 14:03:38 jsing Exp $ */ | 
| 2 | /* | 2 | /* | 
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 
| 4 | * | 4 | * | 
| @@ -99,7 +99,7 @@ err: | |||
| 99 | } | 99 | } | 
| 100 | 100 | ||
| 101 | int | 101 | int | 
| 102 | tls_accept_socket(struct tls *ctx, struct tls **cctx, int socket) | 102 | tls_accept_fds(struct tls *ctx, struct tls **cctx, int fd_read, int fd_write) | 
| 103 | { | 103 | { | 
| 104 | struct tls *conn_ctx = *cctx; | 104 | struct tls *conn_ctx = *cctx; | 
| 105 | int ret, err; | 105 | int ret, err; | 
| @@ -116,14 +116,13 @@ tls_accept_socket(struct tls *ctx, struct tls **cctx, int socket) | |||
| 116 | } | 116 | } | 
| 117 | *cctx = conn_ctx; | 117 | *cctx = conn_ctx; | 
| 118 | 118 | ||
| 119 | conn_ctx->socket = socket; | ||
| 120 | |||
| 121 | if ((conn_ctx->ssl_conn = SSL_new(ctx->ssl_ctx)) == NULL) { | 119 | if ((conn_ctx->ssl_conn = SSL_new(ctx->ssl_ctx)) == NULL) { | 
| 122 | tls_set_error(ctx, "ssl failure"); | 120 | tls_set_error(ctx, "ssl failure"); | 
| 123 | goto err; | 121 | goto err; | 
| 124 | } | 122 | } | 
| 125 | 123 | ||
| 126 | if (SSL_set_fd(conn_ctx->ssl_conn, socket) != 1) { | 124 | if (SSL_set_rfd(conn_ctx->ssl_conn, fd_read) != 1 || | 
| 125 | SSL_set_wfd(conn_ctx->ssl_conn, fd_write) != 1) { | ||
| 127 | tls_set_error(ctx, "ssl set fd failure"); | 126 | tls_set_error(ctx, "ssl set fd failure"); | 
| 128 | goto err; | 127 | goto err; | 
| 129 | } | 128 | } | 
| @@ -143,3 +142,15 @@ tls_accept_socket(struct tls *ctx, struct tls **cctx, int socket) | |||
| 143 | err: | 142 | err: | 
| 144 | return (-1); | 143 | return (-1); | 
| 145 | } | 144 | } | 
| 145 | |||
| 146 | int | ||
| 147 | tls_accept_socket(struct tls *ctx, struct tls **cctx, int socket) | ||
| 148 | { | ||
| 149 | int rv; | ||
| 150 | |||
| 151 | rv = tls_accept_fds(ctx, cctx, socket, socket); | ||
| 152 | if (*cctx != NULL) | ||
| 153 | (*cctx)->socket = socket; | ||
| 154 | |||
| 155 | return (rv); | ||
| 156 | } | ||
