diff --git a/src/internal.c b/src/internal.c index e50912aa..938e67ef 100644 --- a/src/internal.c +++ b/src/internal.c @@ -7859,6 +7859,12 @@ static int DoChannelOpenConf(WOLFSSH* ssh, ret = ChannelUpdatePeer(channel, peerChannelId, peerInitialWindowSz, peerMaxPacketSz); + if (ret == WS_SUCCESS) { + if (ssh->ctx->channelOpenConfCb != NULL) { + ret = ssh->ctx->channelOpenConfCb(channel, ssh->channelOpenCtx); + } + } + if (ret == WS_SUCCESS) { ssh->serverState = SERVER_CHANNEL_OPEN_DONE; ssh->defaultPeerChannelId = peerChannelId; @@ -7872,6 +7878,7 @@ static int DoChannelOpenConf(WOLFSSH* ssh, static int DoChannelOpenFail(WOLFSSH* ssh, byte* buf, word32 len, word32* idx) { + WOLFSSH_CHANNEL* channel = NULL; char desc[80]; word32 begin, channelId, reasonId, descSz, langSz; int ret = WS_SUCCESS; @@ -7905,6 +7912,19 @@ static int DoChannelOpenFail(WOLFSSH* ssh, WLOG(WS_LOG_INFO, "description: %s", desc); } + if (ssh->ctx->channelOpenFailCb != NULL) { + channel = ChannelFind(ssh, channelId, WS_CHANNEL_ID_SELF); + + if (channel != NULL) { + ret = ssh->ctx->channelOpenFailCb(channel, ssh->channelOpenCtx); + } + else { + ret = WS_INVALID_CHANID; + } + } + } + + if (ret == WS_SUCCESS) { ret = ChannelRemove(ssh, channelId, WS_CHANNEL_ID_SELF); } diff --git a/src/ssh.c b/src/ssh.c index 9e72678e..087e9b0a 100644 --- a/src/ssh.c +++ b/src/ssh.c @@ -3062,6 +3062,21 @@ int wolfSSH_CTX_SetChannelOpenCb(WOLFSSH_CTX* ctx, WS_CallbackChannelOpen cb) } +int wolfSSH_CTX_SetChannelOpenRespCb(WOLFSSH_CTX* ctx, + WS_CallbackChannelOpen confCb, WS_CallbackChannelOpen failCb) +{ + int ret = WS_SSH_CTX_NULL_E; + + if (ctx != NULL) { + ctx->channelOpenConfCb = confCb; + ctx->channelOpenFailCb = failCb; + ret = WS_SUCCESS; + } + + return ret; +} + + int wolfSSH_SetChannelOpenCtx(WOLFSSH* ssh, void* ctx) { int ret = WS_SSH_NULL_E; diff --git a/wolfssh/internal.h b/wolfssh/internal.h index a83511da..0bcb7fff 100644 --- a/wolfssh/internal.h +++ b/wolfssh/internal.h @@ -499,6 +499,8 @@ struct WOLFSSH_CTX { WS_CallbackReqSuccess reqSuccessCb; /* Global Request Success Callback */ WS_CallbackReqSuccess reqFailureCb; /* Global Request Failure Callback */ WS_CallbackChannelOpen channelOpenCb; + WS_CallbackChannelOpen channelOpenConfCb; + WS_CallbackChannelOpen channelOpenFailCb; #ifdef WOLFSSH_SCP WS_CallbackScpRecv scpRecvCb; /* SCP receive callback */ WS_CallbackScpSend scpSendCb; /* SCP send callback */ diff --git a/wolfssh/ssh.h b/wolfssh/ssh.h index 63d1ea9b..141434a0 100644 --- a/wolfssh/ssh.h +++ b/wolfssh/ssh.h @@ -214,6 +214,8 @@ WOLFSSH_API int wolfSSH_ChannelGetEof(WOLFSSH_CHANNEL*); typedef int (*WS_CallbackChannelOpen)(WOLFSSH_CHANNEL* channel, void* ctx); WOLFSSH_API int wolfSSH_CTX_SetChannelOpenCb(WOLFSSH_CTX* ctx, WS_CallbackChannelOpen cb); +WOLFSSH_API int wolfSSH_CTX_SetChannelOpenRespCb(WOLFSSH_CTX* ctx, + WS_CallbackChannelOpen confCb, WS_CallbackChannelOpen failCb); WOLFSSH_API int wolfSSH_SetChannelOpenCtx(WOLFSSH* ssh, void* ctx); WOLFSSH_API void* wolfSSH_GetChannelOpenCtx(WOLFSSH* ssh);