Skip to content

Commit

Permalink
add terminal resize callback for unix like use
Browse files Browse the repository at this point in the history
  • Loading branch information
JacobBarthelmeh committed Dec 1, 2023
1 parent 0c6d34f commit a5103bf
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 6 deletions.
18 changes: 18 additions & 0 deletions apps/wolfsshd/wolfsshd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1148,6 +1148,9 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
return ret;
}
#else
#if defined(HAVE_SYS_IOCTL_H)
#include <sys/ioctl.h>
#endif

/* handles creating a new shell env. and maintains SSH connection for incoming
* user input as well as output of the shell.
Expand Down Expand Up @@ -1314,6 +1317,21 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
return WS_FATAL_ERROR;
}

/* set initial size of terminal based on saved size */
#if defined(HAVE_SYS_IOCTL_H)
{
struct winsize s;

WMEMSET(&s, 0, sizeof s);
s.ws_col = ssh->curX;
s.ws_row = ssh->curY;
s.ws_xpixel = ssh->curXP;
s.ws_ypixel = ssh->curYP;
ioctl(childFd, TIOCSWINSZ, &s);
}
#endif

wolfSSH_SetTerminalResizeCtx(ssh, (void*)&childFd);
while (ChildRunning) {
byte tmp[2];
fd_set readFds;
Expand Down
41 changes: 35 additions & 6 deletions src/internal.c
Original file line number Diff line number Diff line change
Expand Up @@ -645,8 +645,9 @@ void CtxResourceFree(WOLFSSH_CTX* ctx)
#ifdef WOLFSSH_TERM
/* default terminal resize handling callbacks */

#if defined(USE_WINDOWS_API) && defined(WOLFSSH_SSHD)
static int WS_WindowsTermResize(WOLFSSH* ssh, word32 col, word32 row, word32 colP,
#if defined(WOLFSSH_SSHD) && !defined(WOLFSSH_RESIZE_NO_DEFUALT)
#if defined(USE_WINDOWS_API)
static int WS_TermResize(WOLFSSH* ssh, word32 col, word32 row, word32 colP,
word32 rowP, void* usrCtx)
{
HPCON* term = (HPCON*)usrCtx;
Expand All @@ -667,7 +668,33 @@ static int WS_WindowsTermResize(WOLFSSH* ssh, word32 col, word32 row, word32 col

return ret;
}
#elif defined(HAVE_SYS_IOCTL_H)

#include <sys/ioctl.h>
static int WS_TermResize(WOLFSSH* ssh, word32 col, word32 row, word32 colP,
word32 rowP, void* usrCtx)
{
struct winsize s;
int ret = WS_SUCCESS;
int* fd = (int*)usrCtx;

if (fd != NULL) {
WMEMSET(&s, 0, sizeof s);
s.ws_row = row;
s.ws_col = col;
s.ws_xpixel = colP;
s.ws_ypixel = rowP;

ioctl(*fd, TIOCSWINSZ, &s);
}

(void)ssh;
return ret;
}
#else
#define WOLFSSH_RESIZE_NO_DEFUALT
#endif
#endif /* WOLFSSH_SSHD */

#endif /* WOLFSSH_TERM */

Expand Down Expand Up @@ -763,10 +790,10 @@ WOLFSSH* SshInit(WOLFSSH* ssh, WOLFSSH_CTX* ctx)
ssh->agentEnabled = ctx->agentEnabled;
#endif

#ifdef WOLFSSH_TERM
#if defined(USE_WINDOWS_API) && defined(WOLFSSH_SSHD)
ssh->termResizeCb = WS_WindowsTermResize;
#endif
#if defined(WOLFSSH_TERM) && defined(WOLFSSH_SSHD)
#ifndef WOLFSSH_RESIZE_NO_DEFUALT
ssh->termResizeCb = WS_TermResize;
#endif
#endif

if (BufferInit(&ssh->inputBuffer, 0, ctx->heap) != WS_SUCCESS ||
Expand Down Expand Up @@ -7169,6 +7196,8 @@ static int DoChannelRequest(WOLFSSH* ssh,
WLOG(WS_LOG_DEBUG, " heightPixels = %u", heightPixels);
ssh->curX = widthChar;
ssh->curY = heightRows;
ssh->curXP = widthPixels;
ssh->curYP = heightPixels;
if (ssh->termResizeCb) {
if (ssh->termResizeCb(ssh, widthChar, heightRows,
widthPixels, heightPixels, ssh->termCtx)
Expand Down
2 changes: 2 additions & 0 deletions wolfssh/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -815,6 +815,8 @@ struct WOLFSSH {
void* termCtx;
word32 curX; /* current terminal width */
word32 curY; /* current terminal height */
word32 curXP; /* pixel width */
word32 curYP; /* pixel height */
#endif
};

Expand Down

0 comments on commit a5103bf

Please sign in to comment.