diff --git a/src/bio.c b/src/bio.c index d80b7c096..74535614e 100644 --- a/src/bio.c +++ b/src/bio.c @@ -1439,6 +1439,25 @@ int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs) return 0; } +int wolfSSL_BIO_tell(WOLFSSL_BIO* bio) +{ + WOLFSSL_ENTER("wolfSSL_BIO_tell"); + int pos; + + if (bio == NULL) { + return -1; + } + + if (bio->type != WOLFSSL_BIO_FILE) { + return 0; + } + + pos =(int) XFTELL((XFILE)bio->ptr); + if(pos < 0) + return -1; + else + return pos; +} #endif /* NO_FILESYSTEM */ diff --git a/tests/api.c b/tests/api.c index 6a2283663..08c4ddf01 100644 --- a/tests/api.c +++ b/tests/api.c @@ -29222,12 +29222,18 @@ static void test_wolfSSL_BIO(void) WOLFSSL_SUCCESS); AssertIntEQ(BIO_read(f_bio1, cert, sizeof(cert)), sizeof(cert)); + AssertIntEQ(BIO_tell(f_bio1),sizeof(cert)); AssertIntEQ(BIO_write(f_bio2, msg, sizeof(msg)), sizeof(msg)); + AssertIntEQ(BIO_tell(f_bio2),sizeof(msg)); AssertIntEQ(BIO_write(f_bio2, cert, sizeof(cert)), sizeof(cert)); + AssertIntEQ(BIO_tell(f_bio2),sizeof(cert) + sizeof(msg)); AssertIntEQ((int)BIO_get_fp(f_bio2, &f2), WOLFSSL_SUCCESS); AssertIntEQ(BIO_reset(f_bio2), 0); + AssertIntEQ(BIO_tell(NULL),-1); + AssertIntEQ(BIO_tell(f_bio2),0); AssertIntEQ(BIO_seek(f_bio2, 4), 0); + AssertIntEQ(BIO_tell(f_bio2),4); BIO_free(f_bio1); BIO_free(f_bio2); diff --git a/wolfssl/openssl/bio.h b/wolfssl/openssl/bio.h index c5786b73a..edafd2152 100644 --- a/wolfssl/openssl/bio.h +++ b/wolfssl/openssl/bio.h @@ -68,6 +68,7 @@ #define BIO_set_fp wolfSSL_BIO_set_fp #define BIO_get_fp wolfSSL_BIO_get_fp #define BIO_seek wolfSSL_BIO_seek +#define BIO_tell wolfSSL_BIO_tell #define BIO_write_filename wolfSSL_BIO_write_filename #define BIO_set_mem_eof_return wolfSSL_BIO_set_mem_eof_return diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 0c81c9b77..d1b70c0cd 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1336,6 +1336,7 @@ WOLFSSL_API int wolfSSL_BIO_nwrite(WOLFSSL_BIO *bio, char **buf, int num); WOLFSSL_API int wolfSSL_BIO_reset(WOLFSSL_BIO *bio); WOLFSSL_API int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs); +WOLFSSL_API int wolfSSL_BIO_tell(WOLFSSL_BIO* bio); WOLFSSL_API int wolfSSL_BIO_write_filename(WOLFSSL_BIO *bio, char *name); WOLFSSL_API long wolfSSL_BIO_set_mem_eof_return(WOLFSSL_BIO *bio, int v); WOLFSSL_API long wolfSSL_BIO_get_mem_ptr(WOLFSSL_BIO *bio, WOLFSSL_BUF_MEM **m);