diff --git a/src/ssh.c b/src/ssh.c index 087e9b0a..4238abe6 100644 --- a/src/ssh.c +++ b/src/ssh.c @@ -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) diff --git a/wolfssh/internal.h b/wolfssh/internal.h index 0bcb7fff..3d728d17 100644 --- a/wolfssh/internal.h +++ b/wolfssh/internal.h @@ -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; diff --git a/wolfssh/ssh.h b/wolfssh/ssh.h index 141434a0..e23acbaf 100644 --- a/wolfssh/ssh.h +++ b/wolfssh/ssh.h @@ -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);