diff --git a/cyassl/internal.h b/cyassl/internal.h index 914b50402..da99f3564 100644 --- a/cyassl/internal.h +++ b/cyassl/internal.h @@ -1272,6 +1272,8 @@ struct CYASSL { Keys keys; int rfd; /* read file descriptor */ int wfd; /* write file descriptor */ + int rflags; /* user read flags */ + int wflags; /* user write flags */ CYASSL_BIO* biord; /* socket bio read to free/close */ CYASSL_BIO* biowr; /* socket bio write to free/close */ void* IOCB_ReadCtx; diff --git a/cyassl/ssl.h b/cyassl/ssl.h index 1d1adde5d..6f8792095 100644 --- a/cyassl/ssl.h +++ b/cyassl/ssl.h @@ -778,9 +778,12 @@ typedef int (*CallbackIOSend)(CYASSL *ssl, char *buf, int sz, void *ctx); CYASSL_API void CyaSSL_SetIORecv(CYASSL_CTX*, CallbackIORecv); CYASSL_API void CyaSSL_SetIOSend(CYASSL_CTX*, CallbackIOSend); -CYASSL_API void CyaSSL_SetIOReadCtx(CYASSL* ssl, void *ctx); +CYASSL_API void CyaSSL_SetIOReadCtx( CYASSL* ssl, void *ctx); CYASSL_API void CyaSSL_SetIOWriteCtx(CYASSL* ssl, void *ctx); +CYASSL_API void CyaSSL_SetIOReadFlags( CYASSL* ssl, int flags); +CYASSL_API void CyaSSL_SetIOWriteFlags(CYASSL* ssl, int flags); + /* CA cache callbacks */ enum { CYASSL_SSLV3 = 0, diff --git a/src/internal.c b/src/internal.c index 5fde0137f..43f44441d 100644 --- a/src/internal.c +++ b/src/internal.c @@ -970,11 +970,13 @@ int InitSSL(CYASSL* ssl, CYASSL_CTX* ctx) ssl->timeout = ctx->timeout; ssl->rfd = -1; /* set to invalid descriptor */ ssl->wfd = -1; + ssl->rflags = 0; /* no user flags yet */ + ssl->wflags = 0; /* no user flags yet */ ssl->biord = 0; ssl->biowr = 0; - ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer acess if not */ - ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */ + ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */ + ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */ InitMd5(&ssl->hashMd5); InitSha(&ssl->hashSha); diff --git a/src/io.c b/src/io.c index d6389b53d..ad9fe4fd2 100644 --- a/src/io.c +++ b/src/io.c @@ -160,7 +160,7 @@ int EmbedReceive(CYASSL *ssl, char *buf, int sz, void *ctx) } #endif - recvd = (int)RECV_FUNCTION(sd, (char *)buf, sz, 0); + recvd = (int)RECV_FUNCTION(sd, buf, sz, ssl->rflags); if (recvd < 0) { err = LastError(); @@ -211,9 +211,7 @@ int EmbedSend(CYASSL* ssl, char *buf, int sz, void *ctx) int len = sz; int err; - (void)ssl; - - sent = (int)SEND_FUNCTION(sd, &buf[sz - len], len, 0); + sent = (int)SEND_FUNCTION(sd, &buf[sz - len], len, ssl->wflags); if (sent < 0) { err = LastError(); @@ -283,7 +281,7 @@ int EmbedReceiveFrom(CYASSL *ssl, char *buf, int sz, void *ctx) (char*)&timeout, sizeof(timeout)); } - recvd = (int)RECVFROM_FUNCTION(sd, (char *)buf, sz, 0, + recvd = (int)RECVFROM_FUNCTION(sd, buf, sz, ssl->rflags, (struct sockaddr*)&peer, &peerSz); if (recvd < 0) { @@ -342,12 +340,9 @@ int EmbedSendTo(CYASSL* ssl, char *buf, int sz, void *ctx) int len = sz; int err; - (void)ssl; - CYASSL_ENTER("EmbedSendTo()"); - sent = (int)SENDTO_FUNCTION(sd, &buf[sz - len], len, 0, + sent = (int)SENDTO_FUNCTION(sd, &buf[sz - len], len, ssl->wflags, dtlsCtx->peer.sa, dtlsCtx->peer.sz); - if (sent < 0) { err = LastError(); CYASSL_MSG("Embed Send To error"); @@ -445,3 +440,15 @@ CYASSL_API void CyaSSL_SetIOWriteCtx(CYASSL* ssl, void *wctx) ssl->IOCB_WriteCtx = wctx; } + +CYASSL_API void CyaSSL_SetIOReadFlags(CYASSL* ssl, int flags) +{ + ssl->rflags = flags; +} + + +CYASSL_API void CyaSSL_SetIOWriteFlags(CYASSL* ssl, int flags) +{ + ssl->wflags = flags; +} +