int safe_SSL_accept(aClient *acptr, int fd) { int ssl_err; if((ssl_err = SSL_accept(acptr->ssl)) <= 0) { switch(ssl_err = SSL_get_error(acptr->ssl, ssl_err)) { case SSL_ERROR_SYSCALL: if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: /* handshake will be completed later . . */ return 1; default: return fatal_ssl_error(ssl_err, SAFE_SSL_ACCEPT, acptr); } /* NOTREACHED */ return -1; } return 1; }
int ircd_SSL_accept(struct Client *acptr, int fd) { int ssl_err; if((ssl_err = SSL_accept((SSL *)acptr->ssl)) <= 0) { switch(ssl_err = SSL_get_error((SSL *)acptr->ssl, ssl_err)) { case SSL_ERROR_SYSCALL: if (ERRNO == EINTR || ERRNO == EWOULDBLOCK || ERRNO == EAGAIN) case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: Debug((DEBUG_DEBUG, "ircd_SSL_accept(%s), - %s", get_client_name(acptr, TRUE), ssl_error_str(ssl_err))); /* handshake will be completed later . . */ return 1; default: return fatal_ssl_error(ssl_err, SAFE_SSL_ACCEPT, acptr); } /* NOTREACHED */ return -1; } return 1; }
int safe_SSL_write(aClient *acptr, const void *buf, int sz) { int len, ssl_err; len = SSL_write(acptr->ssl, buf, sz); if (len <= 0) { switch(ssl_err = SSL_get_error(acptr->ssl, len)) { case SSL_ERROR_SYSCALL: if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR) { case SSL_ERROR_WANT_WRITE: errno = EWOULDBLOCK; return -1; } case SSL_ERROR_SSL: if(errno == EAGAIN) return -1; default: return fatal_ssl_error(ssl_err, SAFE_SSL_WRITE, acptr); } } return len; }