#include <openssl/err.h>
#include "ssl_locl.h"
-static int ssl_write(BIO *h, const char *buf, int num);
-static int ssl_read(BIO *b, char *out, size_t outl, size_t *read);
+static int ssl_write(BIO *h, const char *buf, size_t size, size_t *written);
+static int ssl_read(BIO *b, char *buf, size_t size, size_t *readbytes);
static int ssl_puts(BIO *h, const char *str);
static long ssl_ctrl(BIO *h, int cmd, long arg1, void *arg2);
static int ssl_new(BIO *h);
/* re-negotiate every time the total number of bytes is this size */
int num_renegotiates;
unsigned long renegotiate_count;
- unsigned long byte_count;
+ size_t byte_count;
unsigned long renegotiate_timeout;
unsigned long last_time;
} BIO_SSL;
static const BIO_METHOD methods_sslp = {
BIO_TYPE_SSL, "ssl",
ssl_write,
+ NULL,
ssl_read,
NULL,
ssl_puts,
return 1;
}
-static int ssl_read(BIO *b, char *out, size_t outl, size_t *read)
+static int ssl_read(BIO *b, char *buf, size_t size, size_t *readbytes)
{
int ret = 1;
BIO_SSL *sb;
int retry_reason = 0;
int r = 0;
- if (out == NULL)
- return (0);
+ if (buf == NULL)
+ return 0;
sb = BIO_get_data(b);
ssl = sb->ssl;
BIO_clear_retry_flags(b);
- if (outl > INT_MAX)
- return -1;
+ if (size > INT_MAX)
+ size = INT_MAX;
- ret = SSL_read(ssl, out, outl);
+ ret = SSL_read(ssl, buf, size);
+ if (ret > 0)
+ *readbytes = ret;
switch (SSL_get_error(ssl, ret)) {
case SSL_ERROR_NONE:
- if (ret <= 0)
+ if (*readbytes == 0)
break;
if (sb->renegotiate_count > 0) {
- sb->byte_count += ret;
+ sb->byte_count += *readbytes;
if (sb->byte_count > sb->renegotiate_count) {
sb->byte_count = 0;
sb->num_renegotiates++;
BIO_set_retry_reason(b, retry_reason);
- if (ret < 0)
- return ret;
-
- *read = (size_t)ret;
-
- return 1;
+ return ret;
}
-static int ssl_write(BIO *b, const char *out, int outl)
+static int ssl_write(BIO *b, const char *buf, size_t size, size_t *written)
{
int ret, r = 0;
int retry_reason = 0;
SSL *ssl;
BIO_SSL *bs;
- if (out == NULL)
- return (0);
+ if (buf == NULL)
+ return 0;
bs = BIO_get_data(b);
ssl = bs->ssl;
BIO_clear_retry_flags(b);
- /*
- * ret=SSL_do_handshake(ssl); if (ret > 0)
- */
- ret = SSL_write(ssl, out, outl);
+ ret = SSL_write_ex(ssl, buf, size, written);
switch (SSL_get_error(ssl, ret)) {
case SSL_ERROR_NONE:
- if (ret <= 0)
+ if (*written == 0)
break;
if (bs->renegotiate_count > 0) {
- bs->byte_count += ret;
+ bs->byte_count += *written;
if (bs->byte_count > bs->renegotiate_count) {
bs->byte_count = 0;
bs->num_renegotiates++;
}
BIO_set_retry_reason(b, retry_reason);
+
return ret;
}