Channel Callbacks (EOF and Close)

1. Added callbacks for receiving a Channel EOF message and a Channel
   Close message.
2. Added accessors for the new callback's ctx parameters.
3. Add some missing comments on the channel open callbacks.
pull/713/head
John Safranek 2024-02-21 11:41:31 -08:00
parent bb0809ceca
commit 45d5e916e4
3 changed files with 130 additions and 4 deletions

101
src/ssh.c
View File

@ -3102,6 +3102,107 @@ void* wolfSSH_GetChannelOpenCtx(WOLFSSH* ssh)
}
int wolfSSH_SetChannelReqCtx(WOLFSSH* ssh, void* ctx)
{
int ret = WS_SSH_NULL_E;
if (ssh != NULL) {
ssh->channelReqCtx = ctx;
ret = WS_SUCCESS;
}
return ret;
}
void* wolfSSH_GetChannelReqCtx(WOLFSSH* ssh)
{
void* ctx = NULL;
if (ssh != NULL) {
ctx = ssh->channelReqCtx;
}
return ctx;
}
int wolfSSH_CTX_SetChannelEofCb(WOLFSSH_CTX* ctx, WS_CallbackChannelEof cb)
{
int ret = WS_SSH_CTX_NULL_E;
if (ctx != NULL) {
ctx->channelEofCb = cb;
ret = WS_SUCCESS;
}
return ret;
}
int wolfSSH_SetChannelEofCtx(WOLFSSH* ssh, void* ctx)
{
int ret = WS_SSH_NULL_E;
if (ssh != NULL) {
ssh->channelEofCtx = ctx;
ret = WS_SUCCESS;
}
return ret;
}
void* wolfSSH_GetChannelEofCtx(WOLFSSH* ssh)
{
void* ctx = NULL;
if (ssh != NULL) {
ctx = ssh->channelEofCtx;
}
return ctx;
}
int wolfSSH_CTX_SetChannelCloseCb(WOLFSSH_CTX* ctx, WS_CallbackChannelClose cb)
{
int ret = WS_SSH_CTX_NULL_E;
if (ctx != NULL) {
ctx->channelCloseCb = cb;
ret = WS_SUCCESS;
}
return ret;
}
int wolfSSH_SetChannelCloseCtx(WOLFSSH* ssh, void* ctx)
{
int ret = WS_SSH_NULL_E;
if (ssh != NULL) {
ssh->channelCloseCtx = ctx;
ret = WS_SUCCESS;
}
return ret;
}
void* wolfSSH_GetChannelCloseCtx(WOLFSSH* ssh)
{
void* ctx = NULL;
if (ssh != NULL) {
ctx = ssh->channelCloseCtx;
}
return ctx;
}
#if (defined(WOLFSSH_SFTP) || defined(WOLFSSH_SCP)) && \
!defined(NO_WOLFSSH_SERVER)

View File

@ -498,9 +498,12 @@ struct WOLFSSH_CTX {
WS_CallbackGlobalReq globalReqCb; /* Global Request Callback */
WS_CallbackReqSuccess reqSuccessCb; /* Global Request Success Callback */
WS_CallbackReqSuccess reqFailureCb; /* Global Request Failure Callback */
WS_CallbackChannelOpen channelOpenCb;
WS_CallbackChannelOpen channelOpenConfCb;
WS_CallbackChannelOpen channelOpenFailCb;
WS_CallbackChannelOpen channelOpenCb; /* Channel Open Requested */
WS_CallbackChannelOpen channelOpenConfCb; /* Channel Open Confirm */
WS_CallbackChannelOpen channelOpenFailCb; /* Channel Open Fail */
WS_CallbackChannelReqShell channelReqShellCb; /* Channel Request "Shell" */
WS_CallbackChannelEof channelEofCb; /* Channel Eof Callback */
WS_CallbackChannelClose channelCloseCb; /* Channel Close Callback */
#ifdef WOLFSSH_SCP
WS_CallbackScpRecv scpRecvCb; /* SCP receive callback */
WS_CallbackScpSend scpSendCb; /* SCP send callback */
@ -661,11 +664,14 @@ struct WOLFSSH {
word32 rxCount;
word32 highwaterMark;
byte highwaterFlag; /* Set when highwater CB called */
void* highwaterCtx;
void* highwaterCtx; /* Highwater CB context */
void* globalReqCtx; /* Global Request CB context */
void* reqSuccessCtx; /* Global Request Sucess CB context */
void* reqFailureCtx; /* Global Request Failure CB context */
void* channelOpenCtx; /* Channel Open CB context */
void* channelReqCtx; /* Channel Request CB context */
void* channelEofCtx; /* Channel EOF CB context */
void* channelCloseCtx; /* Channel Close CB context */
void* fs; /* File system handle */
word32 curSz;
word32 seq;

View File

@ -219,6 +219,25 @@ WOLFSSH_API int wolfSSH_CTX_SetChannelOpenRespCb(WOLFSSH_CTX* ctx,
WOLFSSH_API int wolfSSH_SetChannelOpenCtx(WOLFSSH* ssh, void* ctx);
WOLFSSH_API void* wolfSSH_GetChannelOpenCtx(WOLFSSH* ssh);
typedef int (*WS_CallbackChannelReqShell)(WOLFSSH_CHANNEL* channel,
void* ctx);
WOLFSSH_API int wolfSSH_CTX_SetChannelReqShellCb(WOLFSSH_CTX* ctx,
WS_CallbackChannelReqShell cb);
WOLFSSH_API int wolfSSH_SetChannelReqCtx(WOLFSSH* ssh, void* ctx);
WOLFSSH_API void* wolfSSH_GetChannelReqCtx(WOLFSSH* ssh);
typedef int (*WS_CallbackChannelEof)(WOLFSSH_CHANNEL* channel, void* ctx);
WOLFSSH_API int wolfSSH_CTX_SetChannelEofCb(WOLFSSH_CTX* ctx,
WS_CallbackChannelEof cb);
WOLFSSH_API int wolfSSH_SetChannelEofCtx(WOLFSSH* ssh, void* ctx);
WOLFSSH_API void* wolfSSH_GetChannelEofCtx(WOLFSSH* ssh);
typedef int (*WS_CallbackChannelClose)(WOLFSSH_CHANNEL* channel, void* ctx);
WOLFSSH_API int wolfSSH_CTX_SetChannelCloseCb(WOLFSSH_CTX* ctx,
WS_CallbackChannelClose cb);
WOLFSSH_API int wolfSSH_SetChannelCloseCtx(WOLFSSH* ssh, void* ctx);
WOLFSSH_API void* wolfSSH_GetChannelCloseCtx(WOLFSSH* ssh);
WOLFSSH_API int wolfSSH_get_error(const WOLFSSH*);
WOLFSSH_API const char* wolfSSH_get_error_name(const WOLFSSH*);
WOLFSSH_API const char* wolfSSH_ErrorToName(int);