src/server/util/io.c

changeset 133
87b405d61f64
parent 126
631aaa01b2b5
child 142
55298bc9ed28
equal deleted inserted replaced
132:e9afb5387007 133:87b405d61f64
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

mercurial