281 |
281 |
282 IOStream* sslstream_new(pool_handle_t *pool, SSL *ssl) { |
282 IOStream* sslstream_new(pool_handle_t *pool, SSL *ssl) { |
283 SSLStream *st = pool_malloc(pool, sizeof(SSLStream)); |
283 SSLStream *st = pool_malloc(pool, sizeof(SSLStream)); |
284 st->st = ssl_io_funcs; |
284 st->st = ssl_io_funcs; |
285 st->ssl = ssl; |
285 st->ssl = ssl; |
|
286 st->error = 0; |
286 return (IOStream*)st; |
287 return (IOStream*)st; |
287 } |
288 } |
288 |
289 |
289 ssize_t net_ssl_write(SSLStream *st, void *buf, size_t nbytes) { |
290 ssize_t net_ssl_write(SSLStream *st, void *buf, size_t nbytes) { |
290 return SSL_write(st->ssl, buf, nbytes); |
291 int ret = SSL_write(st->ssl, buf, nbytes); |
|
292 if(ret <= 0) { |
|
293 st->error = SSL_get_error(st->ssl, ret); |
|
294 } |
|
295 return ret; |
291 } |
296 } |
292 |
297 |
293 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { |
298 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) { |
294 ssize_t r = 0; |
299 ssize_t r = 0; |
295 for(int i=0;i<iovcnt;i++) { |
300 for(int i=0;i<iovcnt;i++) { |
296 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); |
301 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len); |
297 if(ret <= 0) { |
302 if(ret <= 0) { |
|
303 st->error = SSL_get_error(st->ssl, ret); |
298 return 0; |
304 return 0; |
299 } |
305 } |
300 r += ret; |
306 r += ret; |
301 } |
307 } |
302 return r; |
308 return r; |
303 } |
309 } |
304 |
310 |
305 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) { |
311 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) { |
306 return SSL_read(st->ssl, buf, nbytes); |
312 int ret = SSL_read(st->ssl, buf, nbytes); |
|
313 if(ret <= 0) { |
|
314 st->error = SSL_get_error(st->ssl, ret); |
|
315 } |
|
316 return ret; |
307 } |
317 } |
308 |
318 |
309 void net_ssl_close(SSLStream *st) { |
319 void net_ssl_close(SSLStream *st) { |
310 SSL_shutdown(st->ssl); |
320 int ret = SSL_shutdown(st->ssl); |
|
321 if(ret != 1) { |
|
322 st->error = SSL_get_error(st->ssl, ret); |
|
323 } |
311 close(SSL_get_fd(st->ssl)); |
324 close(SSL_get_fd(st->ssl)); |
312 } |
325 } |
313 |
326 |
314 void net_ssl_finish(SSLStream *st) { |
327 void net_ssl_finish(SSLStream *st) { |
315 |
328 |