1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-02 12:02:47 -05:00

Whitespace rationalisation of entire code base.

The number of people has been steadily increasing who read our source
code with an editor that thinks tab stops are 4 spaces apart, as
opposed to the traditional tty-derived 8 that the PuTTY code expects.

So I've been wondering for ages about just fixing it, and switching to
a spaces-only policy throughout the code. And I recently found out
about 'git blame -w', which should make this change not too disruptive
for the purposes of source-control archaeology; so perhaps now is the
time.

While I'm at it, I've also taken the opportunity to remove all the
trailing spaces from source lines (on the basis that git dislikes
them, and is the only thing that seems to have a strong opinion one
way or the other).
    
Apologies to anyone downstream of this code who has complicated patch
sets to rebase past this change. I don't intend it to be needed again.
This commit is contained in:
Simon Tatham
2019-09-08 20:29:00 +01:00
parent b60230dbb8
commit 5d718ef64b
210 changed files with 30897 additions and 30897 deletions

View File

@ -47,12 +47,12 @@ void fatal(const char *fmt, ...)
void net_readdata(sel_rfd *rfd, void *data, size_t len)
{
if (len == 0)
exit(0); /* EOF on network - client went away */
exit(0); /* EOF on network - client went away */
telnet_from_net(telnet, data, len);
if (sel_write(netw, NULL, 0) > BUF)
sel_rfd_freeze(ptyr);
sel_rfd_freeze(ptyr);
if (sel_write(ptyw, NULL, 0) > BUF)
sel_rfd_freeze(netr);
sel_rfd_freeze(netr);
}
void net_readerr(sel_rfd *rfd, int error)
@ -64,7 +64,7 @@ void net_readerr(sel_rfd *rfd, int error)
void net_written(sel_wfd *wfd, size_t bufsize)
{
if (bufsize < BUF)
sel_rfd_unfreeze(ptyr);
sel_rfd_unfreeze(ptyr);
}
void net_writeerr(sel_wfd *wfd, int error)
@ -76,18 +76,18 @@ void net_writeerr(sel_wfd *wfd, int error)
void pty_readdata(sel_rfd *rfd, void *data, size_t len)
{
if (len == 0)
exit(0); /* EOF on pty */
exit(0); /* EOF on pty */
telnet_from_pty(telnet, data, len);
if (sel_write(netw, NULL, 0) > BUF)
sel_rfd_freeze(ptyr);
sel_rfd_freeze(ptyr);
if (sel_write(ptyw, NULL, 0) > BUF)
sel_rfd_freeze(netr);
sel_rfd_freeze(netr);
}
void pty_readerr(sel_rfd *rfd, int error)
{
if (error == EIO) /* means EOF, on a pty */
exit(0);
if (error == EIO) /* means EOF, on a pty */
exit(0);
fprintf(stderr, "pty: read: %s\n", strerror(errno));
exit(1);
}
@ -95,7 +95,7 @@ void pty_readerr(sel_rfd *rfd, int error)
void pty_written(sel_wfd *wfd, size_t bufsize)
{
if (bufsize < BUF)
sel_rfd_unfreeze(netr);
sel_rfd_unfreeze(netr);
}
void pty_writeerr(sel_wfd *wfd, int error)
@ -109,12 +109,12 @@ void sig_readdata(sel_rfd *rfd, void *data, size_t len)
char *p = data;
while (len > 0) {
if (*p == 'C') {
int status;
waitpid(-1, &status, WNOHANG);
if (WIFEXITED(status) || WIFSIGNALED(status))
exit(0); /* child process vanished */
}
if (*p == 'C') {
int status;
waitpid(-1, &status, WNOHANG);
if (WIFEXITED(status) || WIFSIGNALED(status))
exit(0); /* child process vanished */
}
}
}
@ -150,24 +150,24 @@ int main(int argc, char **argv)
telnet = telnet_new(netw, ptyw);
if (pipe(signalpipe) < 0) {
perror("pipe");
return 1;
perror("pipe");
return 1;
}
sigr = sel_rfd_add(asel, signalpipe[0], sig_readdata,
sig_readerr, NULL);
sig_readerr, NULL);
signal(SIGCHLD, sigchld);
do {
struct shell_data shdata;
struct shell_data shdata;
ret = sel_iterate(asel, -1);
if (!shell_started && telnet_shell_ok(telnet, &shdata)) {
ptyfd = run_program_in_pty(&shdata, directory, program_args);
sel_rfd_setfd(ptyr, ptyfd);
sel_wfd_setfd(ptyw, ptyfd);
shell_started = 1;
}
ret = sel_iterate(asel, -1);
if (!shell_started && telnet_shell_ok(telnet, &shdata)) {
ptyfd = run_program_in_pty(&shdata, directory, program_args);
sel_rfd_setfd(ptyr, ptyfd);
sel_wfd_setfd(ptyw, ptyfd);
shell_started = 1;
}
} while (ret == 0);
return 0;

View File

@ -13,26 +13,26 @@ void *smalloc(size_t size) {
void *p;
p = malloc(size);
if (!p) {
fatal("out of memory");
fatal("out of memory");
}
return p;
}
void sfree(void *p) {
if (p) {
free(p);
free(p);
}
}
void *srealloc(void *p, size_t size) {
void *q;
if (p) {
q = realloc(p, size);
q = realloc(p, size);
} else {
q = malloc(size);
q = malloc(size);
}
if (!q)
fatal("out of memory");
fatal("out of memory");
return q;
}

View File

@ -30,18 +30,18 @@ void pty_preinit(void)
*/
master = open("/dev/ptmx", O_RDWR);
if (master < 0) {
perror("/dev/ptmx: open");
exit(1);
perror("/dev/ptmx: open");
exit(1);
}
if (grantpt(master) < 0) {
perror("grantpt");
exit(1);
perror("grantpt");
exit(1);
}
if (unlockpt(master) < 0) {
perror("unlockpt");
exit(1);
perror("unlockpt");
exit(1);
}
}
@ -70,24 +70,24 @@ int run_program_in_pty(const struct shell_data *shdata,
#if 0
{
struct winsize ws;
struct termios ts;
struct winsize ws;
struct termios ts;
/*
* FIXME: think up some good defaults here
*/
/*
* FIXME: think up some good defaults here
*/
if (!ioctl(0, TIOCGWINSZ, &ws))
ioctl(master, TIOCSWINSZ, &ws);
if (!tcgetattr(0, &ts))
tcsetattr(master, TCSANOW, &ts);
if (!ioctl(0, TIOCGWINSZ, &ws))
ioctl(master, TIOCSWINSZ, &ws);
if (!tcgetattr(0, &ts))
tcsetattr(master, TCSANOW, &ts);
}
#endif
slave = open(ptyname, O_RDWR | O_NOCTTY);
if (slave < 0) {
perror("slave pty: open");
return 1;
perror("slave pty: open");
return 1;
}
/*
@ -95,26 +95,26 @@ int run_program_in_pty(const struct shell_data *shdata,
*/
pid = fork();
if (pid < 0) {
perror("fork");
return 1;
perror("fork");
return 1;
}
if (pid == 0) {
int i, fd;
int i, fd;
/*
* We are the child.
*/
close(master);
/*
* We are the child.
*/
close(master);
fcntl(slave, F_SETFD, 0); /* don't close on exec */
dup2(slave, 0);
dup2(slave, 1);
if (slave != 0 && slave != 1)
close(slave);
dup2(1, 2);
setsid();
setpgrp();
fcntl(slave, F_SETFD, 0); /* don't close on exec */
dup2(slave, 0);
dup2(slave, 1);
if (slave != 0 && slave != 1)
close(slave);
dup2(1, 2);
setsid();
setpgrp();
i = 0;
#ifdef TIOCNOTTY
if ((fd = open("/dev/tty", O_RDWR)) >= 0) {
@ -139,26 +139,26 @@ int run_program_in_pty(const struct shell_data *shdata,
perror("slave pty: open");
exit(127);
}
tcsetpgrp(0, getpgrp());
tcsetpgrp(0, getpgrp());
for (i = 0; i < shdata->nenvvars; i++)
for (i = 0; i < shdata->nenvvars; i++)
putenv(shdata->envvars[i]);
if (shdata->termtype)
if (shdata->termtype)
putenv(shdata->termtype);
if (directory)
chdir(directory);
/*
* Use the provided shell program name, if the user gave
* one. Failing that, use $SHELL; failing that, look up
* the user's default shell in the password file; failing
* _that_, revert to the bog-standard /bin/sh.
*/
if (!program_args) {
/*
* Use the provided shell program name, if the user gave
* one. Failing that, use $SHELL; failing that, look up
* the user's default shell in the password file; failing
* _that_, revert to the bog-standard /bin/sh.
*/
if (!program_args) {
char *shell;
shell = getenv("SHELL");
shell = getenv("SHELL");
if (!shell) {
const char *login;
uid_t uid;
@ -189,11 +189,11 @@ int run_program_in_pty(const struct shell_data *shdata,
execv(program_args[0], program_args);
/*
* If we're here, exec has gone badly foom.
*/
perror("exec");
exit(127);
/*
* If we're here, exec has gone badly foom.
*/
perror("exec");
exit(127);
}
close(slave);

View File

@ -5,7 +5,7 @@
#ifndef CYGTERMD_PTY_H
#define CYGTERMD_PTY_H
#include "telnet.h" /* for struct shdata */
#include "telnet.h" /* for struct shdata */
/*
* Called at program startup to actually allocate a pty, so that

View File

@ -25,7 +25,7 @@
typedef struct bufchain_tag {
struct bufchain_granule *head, *tail;
size_t buffersize; /* current amount of buffered data */
size_t buffersize; /* current amount of buffered data */
} bufchain;
struct bufchain_granule {
struct bufchain_granule *next;
@ -43,9 +43,9 @@ static void bufchain_clear(bufchain *ch)
{
struct bufchain_granule *b;
while (ch->head) {
b = ch->head;
ch->head = ch->head->next;
sfree(b);
b = ch->head;
ch->head = ch->head->next;
sfree(b);
}
ch->tail = NULL;
ch->buffersize = 0;
@ -65,31 +65,31 @@ static void bufchain_add(bufchain *ch, const void *data, size_t len)
ch->buffersize += len;
if (ch->tail && ch->tail->buflen < BUFFER_GRANULE) {
size_t copylen = BUFFER_GRANULE - ch->tail->buflen;
if (copylen > len)
copylen = len;
memcpy(ch->tail->buf + ch->tail->buflen, buf, copylen);
buf += copylen;
len -= copylen;
ch->tail->buflen += copylen;
size_t copylen = BUFFER_GRANULE - ch->tail->buflen;
if (copylen > len)
copylen = len;
memcpy(ch->tail->buf + ch->tail->buflen, buf, copylen);
buf += copylen;
len -= copylen;
ch->tail->buflen += copylen;
}
while (len > 0) {
struct bufchain_granule *newbuf;
size_t grainlen = BUFFER_GRANULE;
if (grainlen > len)
grainlen = len;
newbuf = snew(struct bufchain_granule);
newbuf->bufpos = 0;
newbuf->buflen = grainlen;
memcpy(newbuf->buf, buf, grainlen);
buf += grainlen;
len -= grainlen;
if (ch->tail)
ch->tail->next = newbuf;
else
ch->head = ch->tail = newbuf;
newbuf->next = NULL;
ch->tail = newbuf;
struct bufchain_granule *newbuf;
size_t grainlen = BUFFER_GRANULE;
if (grainlen > len)
grainlen = len;
newbuf = snew(struct bufchain_granule);
newbuf->bufpos = 0;
newbuf->buflen = grainlen;
memcpy(newbuf->buf, buf, grainlen);
buf += grainlen;
len -= grainlen;
if (ch->tail)
ch->tail->next = newbuf;
else
ch->head = ch->tail = newbuf;
newbuf->next = NULL;
ch->tail = newbuf;
}
}
@ -99,19 +99,19 @@ static void bufchain_consume(bufchain *ch, size_t len)
assert(ch->buffersize >= len);
while (len > 0) {
size_t remlen = len;
assert(ch->head != NULL);
if (remlen >= ch->head->buflen - ch->head->bufpos) {
remlen = ch->head->buflen - ch->head->bufpos;
tmp = ch->head;
ch->head = tmp->next;
sfree(tmp);
if (!ch->head)
ch->tail = NULL;
} else
ch->head->bufpos += remlen;
ch->buffersize -= remlen;
len -= remlen;
size_t remlen = len;
assert(ch->head != NULL);
if (remlen >= ch->head->buflen - ch->head->bufpos) {
remlen = ch->head->buflen - ch->head->bufpos;
tmp = ch->head;
ch->head = tmp->next;
sfree(tmp);
if (!ch->head)
ch->tail = NULL;
} else
ch->head->bufpos += remlen;
ch->buffersize -= remlen;
len -= remlen;
}
}
@ -163,8 +163,8 @@ sel *sel_new(void *ctx)
}
sel_wfd *sel_wfd_add(sel *sel, int fd,
sel_written_fn_t written, sel_writeerr_fn_t writeerr,
void *ctx)
sel_written_fn_t written, sel_writeerr_fn_t writeerr,
void *ctx)
{
sel_wfd *wfd = snew(sel_wfd);
@ -177,9 +177,9 @@ sel_wfd *sel_wfd_add(sel *sel, int fd,
wfd->next = NULL;
wfd->prev = sel->wtail;
if (sel->wtail)
sel->wtail->next = wfd;
sel->wtail->next = wfd;
else
sel->whead = wfd;
sel->whead = wfd;
sel->wtail = wfd;
wfd->parent = sel;
@ -187,8 +187,8 @@ sel_wfd *sel_wfd_add(sel *sel, int fd,
}
sel_rfd *sel_rfd_add(sel *sel, int fd,
sel_readdata_fn_t readdata, sel_readerr_fn_t readerr,
void *ctx)
sel_readdata_fn_t readdata, sel_readerr_fn_t readerr,
void *ctx)
{
sel_rfd *rfd = snew(sel_rfd);
@ -201,9 +201,9 @@ sel_rfd *sel_rfd_add(sel *sel, int fd,
rfd->next = NULL;
rfd->prev = sel->rtail;
if (sel->rtail)
sel->rtail->next = rfd;
sel->rtail->next = rfd;
else
sel->rhead = rfd;
sel->rhead = rfd;
sel->rtail = rfd;
rfd->parent = sel;
@ -242,13 +242,13 @@ int sel_wfd_delete(sel_wfd *wfd)
int ret;
if (wfd->prev)
wfd->prev->next = wfd->next;
wfd->prev->next = wfd->next;
else
sel->whead = wfd->next;
sel->whead = wfd->next;
if (wfd->next)
wfd->next->prev = wfd->prev;
wfd->next->prev = wfd->prev;
else
sel->wtail = wfd->prev;
sel->wtail = wfd->prev;
bufchain_clear(&wfd->buf);
@ -263,13 +263,13 @@ int sel_rfd_delete(sel_rfd *rfd)
int ret;
if (rfd->prev)
rfd->prev->next = rfd->next;
rfd->prev->next = rfd->next;
else
sel->rhead = rfd->next;
sel->rhead = rfd->next;
if (rfd->next)
rfd->next->prev = rfd->prev;
rfd->next->prev = rfd->prev;
else
sel->rtail = rfd->prev;
sel->rtail = rfd->prev;
ret = rfd->fd;
sfree(rfd);
@ -279,9 +279,9 @@ int sel_rfd_delete(sel_rfd *rfd)
void sel_free(sel *sel)
{
while (sel->whead)
sel_wfd_delete(sel->whead);
sel_wfd_delete(sel->whead);
while (sel->rhead)
sel_rfd_delete(sel->rhead);
sel_rfd_delete(sel->rhead);
sfree(sel);
}
@ -306,35 +306,35 @@ int sel_iterate(sel *sel, long timeout)
FD_ZERO(&wset);
for (rfd = sel->rhead; rfd; rfd = rfd->next) {
if (rfd->fd >= 0 && !rfd->frozen) {
FD_SET(rfd->fd, &rset);
if (maxfd < rfd->fd + 1)
maxfd = rfd->fd + 1;
}
if (rfd->fd >= 0 && !rfd->frozen) {
FD_SET(rfd->fd, &rset);
if (maxfd < rfd->fd + 1)
maxfd = rfd->fd + 1;
}
}
for (wfd = sel->whead; wfd; wfd = wfd->next) {
if (wfd->fd >= 0 && bufchain_size(&wfd->buf)) {
FD_SET(wfd->fd, &wset);
if (maxfd < wfd->fd + 1)
maxfd = wfd->fd + 1;
}
if (wfd->fd >= 0 && bufchain_size(&wfd->buf)) {
FD_SET(wfd->fd, &wset);
if (maxfd < wfd->fd + 1)
maxfd = wfd->fd + 1;
}
}
if (timeout < 0) {
ptv = NULL;
ptv = NULL;
} else {
ptv = &tv;
tv.tv_sec = timeout / 1000;
tv.tv_usec = 1000 * (timeout % 1000);
ptv = &tv;
tv.tv_sec = timeout / 1000;
tv.tv_usec = 1000 * (timeout % 1000);
}
do {
ret = select(maxfd, &rset, &wset, NULL, ptv);
ret = select(maxfd, &rset, &wset, NULL, ptv);
} while (ret < 0 && (errno == EINTR || errno == EAGAIN));
if (ret < 0)
return errno;
return errno;
/*
* Just in case one of the callbacks destroys an rfd or wfd we
@ -346,40 +346,40 @@ int sel_iterate(sel *sel, long timeout)
* using select in the first place.
*/
do {
for (wfd = sel->whead; wfd; wfd = wfd->next)
if (wfd->fd >= 0 && FD_ISSET(wfd->fd, &wset)) {
void *data;
size_t len;
for (wfd = sel->whead; wfd; wfd = wfd->next)
if (wfd->fd >= 0 && FD_ISSET(wfd->fd, &wset)) {
void *data;
size_t len;
FD_CLR(wfd->fd, &wset);
bufchain_prefix(&wfd->buf, &data, &len);
ret = write(wfd->fd, data, len);
assert(ret != 0);
if (ret < 0) {
if (wfd->writeerr)
wfd->writeerr(wfd, errno);
} else {
bufchain_consume(&wfd->buf, len);
if (wfd->written)
wfd->written(wfd, bufchain_size(&wfd->buf));
}
break;
}
FD_CLR(wfd->fd, &wset);
bufchain_prefix(&wfd->buf, &data, &len);
ret = write(wfd->fd, data, len);
assert(ret != 0);
if (ret < 0) {
if (wfd->writeerr)
wfd->writeerr(wfd, errno);
} else {
bufchain_consume(&wfd->buf, len);
if (wfd->written)
wfd->written(wfd, bufchain_size(&wfd->buf));
}
break;
}
} while (wfd);
do {
for (rfd = sel->rhead; rfd; rfd = rfd->next)
if (rfd->fd >= 0 && !rfd->frozen && FD_ISSET(rfd->fd, &rset)) {
FD_CLR(rfd->fd, &rset);
ret = read(rfd->fd, buf, sizeof(buf));
if (ret < 0) {
if (rfd->readerr)
rfd->readerr(rfd, errno);
} else {
if (rfd->readdata)
rfd->readdata(rfd, buf, ret);
}
break;
}
for (rfd = sel->rhead; rfd; rfd = rfd->next)
if (rfd->fd >= 0 && !rfd->frozen && FD_ISSET(rfd->fd, &rset)) {
FD_CLR(rfd->fd, &rset);
ret = read(rfd->fd, buf, sizeof(buf));
if (ret < 0) {
if (rfd->readerr)
rfd->readerr(rfd, errno);
} else {
if (rfd->readdata)
rfd->readdata(rfd, buf, ret);
}
break;
}
} while (rfd);
return 0;

View File

@ -37,7 +37,7 @@ typedef void (*sel_readerr_fn_t)(sel_rfd *rfd, int error);
/*
* Create a sel structure, which will oversee a select loop.
*
*
* "ctx" is user-supplied data stored in the sel structure; it can
* be read and written with sel_get_ctx() and sel_set_ctx().
*/
@ -47,10 +47,10 @@ sel *sel_new(void *ctx);
* Add a new fd for writing. Returns a sel_wfd which identifies
* that fd in the sel structure, e.g. for putting data into its
* output buffer.
*
*
* "ctx" is user-supplied data stored in the sel structure; it can
* be read and written with sel_wfd_get_ctx() and sel_wfd_set_ctx().
*
*
* "written" and "writeerr" are called from the event loop when
* things happen.
*
@ -59,22 +59,22 @@ sel *sel_new(void *ctx);
* using sel_wfd_setfd.
*/
sel_wfd *sel_wfd_add(sel *sel, int fd,
sel_written_fn_t written, sel_writeerr_fn_t writeerr,
void *ctx);
sel_written_fn_t written, sel_writeerr_fn_t writeerr,
void *ctx);
/*
* Add a new fd for reading. Returns a sel_rfd which identifies
* that fd in the sel structure.
*
*
* "ctx" is user-supplied data stored in the sel structure; it can
* be read and written with sel_rfd_get_ctx() and sel_rfd_set_ctx().
*
*
* "readdata" and "readerr" are called from the event loop when
* things happen. "ctx" is passed to both of them.
*/
sel_rfd *sel_rfd_add(sel *sel, int fd,
sel_readdata_fn_t readdata, sel_readerr_fn_t readerr,
void *ctx);
sel_readdata_fn_t readdata, sel_readerr_fn_t readerr,
void *ctx);
/*
* Write data into the output buffer of a wfd. Returns the new
@ -137,7 +137,7 @@ void sel_rfd_set_ctx(sel_rfd *rfd, void *ctx);
* Run one iteration of the sel event loop, calling callbacks as
* necessary. Returns zero on success; in the event of a fatal
* error, returns the errno value.
*
*
* "timeout" is a value in microseconds to limit the length of the
* select call. Less than zero means to wait indefinitely.
*/

View File

@ -13,27 +13,27 @@
#include "malloc.h"
#include "pty.h"
#define IAC 255 /* interpret as command: */
#define DONT 254 /* you are not to use option */
#define DO 253 /* please, you use option */
#define WONT 252 /* I won't use option */
#define WILL 251 /* I will use option */
#define SB 250 /* interpret as subnegotiation */
#define SE 240 /* end sub negotiation */
#define IAC 255 /* interpret as command: */
#define DONT 254 /* you are not to use option */
#define DO 253 /* please, you use option */
#define WONT 252 /* I won't use option */
#define WILL 251 /* I will use option */
#define SB 250 /* interpret as subnegotiation */
#define SE 240 /* end sub negotiation */
#define GA 249 /* you may reverse the line */
#define EL 248 /* erase the current line */
#define EC 247 /* erase the current character */
#define AYT 246 /* are you there */
#define AO 245 /* abort output--but let prog finish */
#define IP 244 /* interrupt process--permanently */
#define BREAK 243 /* break */
#define DM 242 /* data mark--for connect. cleaning */
#define NOP 241 /* nop */
#define EOR 239 /* end of record (transparent mode) */
#define ABORT 238 /* Abort process */
#define SUSP 237 /* Suspend process */
#define xEOF 236 /* End of file: EOF is already used... */
#define GA 249 /* you may reverse the line */
#define EL 248 /* erase the current line */
#define EC 247 /* erase the current character */
#define AYT 246 /* are you there */
#define AO 245 /* abort output--but let prog finish */
#define IP 244 /* interrupt process--permanently */
#define BREAK 243 /* break */
#define DM 242 /* data mark--for connect. cleaning */
#define NOP 241 /* nop */
#define EOR 239 /* end of record (transparent mode) */
#define ABORT 238 /* Abort process */
#define SUSP 237 /* Suspend process */
#define xEOF 236 /* End of file: EOF is already used... */
#define TELOPTS(X) \
X(BINARY, 0) /* 8-bit data path */ \
@ -95,9 +95,9 @@
enum { TELOPTS(telnet_enum) dummy=0 };
#undef telnet_enum
#define TELQUAL_IS 0 /* option is... */
#define TELQUAL_SEND 1 /* send option */
#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
#define TELQUAL_IS 0 /* option is... */
#define TELQUAL_SEND 1 /* send option */
#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
#define BSD_VAR 1
#define BSD_VALUE 0
#define RFC_VAR 0
@ -113,9 +113,9 @@ static char *telopt(int opt)
{
#define telnet_str(x,y) case TELOPT_##x: return #x;
switch (opt) {
TELOPTS(telnet_str)
TELOPTS(telnet_str)
default:
return "<unknown>";
return "<unknown>";
}
#undef telnet_str
}
@ -123,13 +123,13 @@ static char *telopt(int opt)
static void telnet_size(void *handle, int width, int height);
struct Opt {
int send; /* what we initially send */
int nsend; /* -ve send if requested to stop it */
int ack, nak; /* +ve and -ve acknowledgements */
int option; /* the option code */
int index; /* index into telnet->opt_states[] */
int send; /* what we initially send */
int nsend; /* -ve send if requested to stop it */
int ack, nak; /* +ve and -ve acknowledgements */
int option; /* the option code */
int index; /* index into telnet->opt_states[] */
enum {
REQUESTED, ACTIVE, INACTIVE, REALLY_INACTIVE
REQUESTED, ACTIVE, INACTIVE, REALLY_INACTIVE
} initial_state;
};
@ -174,8 +174,8 @@ struct Telnet {
int sb_size;
enum {
TOP_LEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT,
SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR
TOP_LEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT,
SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR
} state;
sel_wfd *net, *pty;
@ -210,8 +210,8 @@ static void send_opt(Telnet *telnet, int cmd, int option)
static void deactivate_option(Telnet *telnet, const struct Opt *o)
{
if (telnet->opt_states[o->index] == REQUESTED ||
telnet->opt_states[o->index] == ACTIVE)
send_opt(telnet, o->nsend, o->option);
telnet->opt_states[o->index] == ACTIVE)
send_opt(telnet, o->nsend, o->option);
telnet->opt_states[o->index] = REALLY_INACTIVE;
}
@ -225,16 +225,16 @@ static void option_side_effects(Telnet *telnet, const struct Opt *o, int enabled
static void activate_option(Telnet *telnet, const struct Opt *o)
{
if (o->option == TELOPT_NEW_ENVIRON ||
o->option == TELOPT_OLD_ENVIRON ||
o->option == TELOPT_TTYPE) {
char buf[6];
buf[0] = IAC;
buf[1] = SB;
buf[2] = o->option;
buf[3] = TELQUAL_SEND;
buf[4] = IAC;
buf[5] = SE;
sel_write(telnet->net, buf, 6);
o->option == TELOPT_OLD_ENVIRON ||
o->option == TELOPT_TTYPE) {
char buf[6];
buf[0] = IAC;
buf[1] = SB;
buf[2] = o->option;
buf[3] = TELQUAL_SEND;
buf[4] = IAC;
buf[5] = SE;
sel_write(telnet->net, buf, 6);
}
option_side_effects(telnet, o, 1);
}
@ -242,15 +242,15 @@ static void activate_option(Telnet *telnet, const struct Opt *o)
static void done_option(Telnet *telnet, int option)
{
if (option == TELOPT_OLD_ENVIRON)
telnet->old_environ_done = 1;
telnet->old_environ_done = 1;
else if (option == TELOPT_NEW_ENVIRON)
telnet->new_environ_done = 1;
telnet->new_environ_done = 1;
else if (option == TELOPT_TTYPE)
telnet->ttype_done = 1;
telnet->ttype_done = 1;
if (telnet->old_environ_done && telnet->new_environ_done &&
telnet->ttype_done) {
telnet->shell_ok = 1;
telnet->ttype_done) {
telnet->shell_ok = 1;
}
}
@ -258,10 +258,10 @@ static void refused_option(Telnet *telnet, const struct Opt *o)
{
done_option(telnet, o->option);
if (o->send == WILL && o->option == TELOPT_NEW_ENVIRON &&
telnet->opt_states[o_oenv.index] == INACTIVE) {
send_opt(telnet, WILL, TELOPT_OLD_ENVIRON);
telnet->opt_states[o_oenv.index] = REQUESTED;
telnet->old_environ_done = 0;
telnet->opt_states[o_oenv.index] == INACTIVE) {
send_opt(telnet, WILL, TELOPT_OLD_ENVIRON);
telnet->opt_states[o_oenv.index] = REQUESTED;
telnet->old_environ_done = 0;
}
option_side_effects(telnet, o, 0);
}
@ -271,41 +271,41 @@ static void proc_rec_opt(Telnet *telnet, int cmd, int option)
const struct Opt *const *o;
for (o = opts; *o; o++) {
if ((*o)->option == option && (*o)->ack == cmd) {
switch (telnet->opt_states[(*o)->index]) {
case REQUESTED:
telnet->opt_states[(*o)->index] = ACTIVE;
activate_option(telnet, *o);
break;
case ACTIVE:
break;
case INACTIVE:
telnet->opt_states[(*o)->index] = ACTIVE;
send_opt(telnet, (*o)->send, option);
activate_option(telnet, *o);
break;
case REALLY_INACTIVE:
send_opt(telnet, (*o)->nsend, option);
break;
}
return;
} else if ((*o)->option == option && (*o)->nak == cmd) {
switch (telnet->opt_states[(*o)->index]) {
case REQUESTED:
telnet->opt_states[(*o)->index] = INACTIVE;
refused_option(telnet, *o);
break;
case ACTIVE:
telnet->opt_states[(*o)->index] = INACTIVE;
send_opt(telnet, (*o)->nsend, option);
option_side_effects(telnet, *o, 0);
break;
case INACTIVE:
case REALLY_INACTIVE:
break;
}
return;
}
if ((*o)->option == option && (*o)->ack == cmd) {
switch (telnet->opt_states[(*o)->index]) {
case REQUESTED:
telnet->opt_states[(*o)->index] = ACTIVE;
activate_option(telnet, *o);
break;
case ACTIVE:
break;
case INACTIVE:
telnet->opt_states[(*o)->index] = ACTIVE;
send_opt(telnet, (*o)->send, option);
activate_option(telnet, *o);
break;
case REALLY_INACTIVE:
send_opt(telnet, (*o)->nsend, option);
break;
}
return;
} else if ((*o)->option == option && (*o)->nak == cmd) {
switch (telnet->opt_states[(*o)->index]) {
case REQUESTED:
telnet->opt_states[(*o)->index] = INACTIVE;
refused_option(telnet, *o);
break;
case ACTIVE:
telnet->opt_states[(*o)->index] = INACTIVE;
send_opt(telnet, (*o)->nsend, option);
option_side_effects(telnet, *o, 0);
break;
case INACTIVE:
case REALLY_INACTIVE:
break;
}
return;
}
}
/*
* If we reach here, the option was one we weren't prepared to
@ -324,52 +324,52 @@ static void process_subneg(Telnet *telnet)
switch (telnet->sb_opt) {
case TELOPT_OLD_ENVIRON:
case TELOPT_NEW_ENVIRON:
if (telnet->sb_buf[0] == TELQUAL_IS) {
if (telnet->sb_opt == TELOPT_NEW_ENVIRON) {
var = RFC_VAR;
value = RFC_VALUE;
} else {
if (telnet->sb_len > 1 && !(telnet->sb_buf[0] &~ 1)) {
var = telnet->sb_buf[0];
value = BSD_VAR ^ BSD_VALUE ^ var;
} else {
var = BSD_VAR;
value = BSD_VALUE;
}
}
}
n = 1;
while (n < telnet->sb_len && telnet->sb_buf[n] == var) {
int varpos, varlen, valpos, vallen;
char *result;
if (telnet->sb_buf[0] == TELQUAL_IS) {
if (telnet->sb_opt == TELOPT_NEW_ENVIRON) {
var = RFC_VAR;
value = RFC_VALUE;
} else {
if (telnet->sb_len > 1 && !(telnet->sb_buf[0] &~ 1)) {
var = telnet->sb_buf[0];
value = BSD_VAR ^ BSD_VALUE ^ var;
} else {
var = BSD_VAR;
value = BSD_VALUE;
}
}
}
n = 1;
while (n < telnet->sb_len && telnet->sb_buf[n] == var) {
int varpos, varlen, valpos, vallen;
char *result;
varpos = ++n;
while (n < telnet->sb_len && telnet->sb_buf[n] != value)
n++;
if (n == telnet->sb_len)
break;
varlen = n - varpos;
valpos = ++n;
while (n < telnet->sb_len && telnet->sb_buf[n] != var)
n++;
vallen = n - valpos;
varpos = ++n;
while (n < telnet->sb_len && telnet->sb_buf[n] != value)
n++;
if (n == telnet->sb_len)
break;
varlen = n - varpos;
valpos = ++n;
while (n < telnet->sb_len && telnet->sb_buf[n] != var)
n++;
vallen = n - valpos;
result = snewn(varlen + vallen + 2, char);
sprintf(result, "%.*s=%.*s",
varlen, telnet->sb_buf+varpos,
vallen, telnet->sb_buf+valpos);
if (telnet->shdata.nenvvars >= telnet->envvarsize) {
telnet->envvarsize = telnet->shdata.nenvvars * 3 / 2 + 16;
telnet->shdata.envvars = sresize(telnet->shdata.envvars,
telnet->envvarsize, char *);
}
telnet->shdata.envvars[telnet->shdata.nenvvars++] = result;
}
done_option(telnet, telnet->sb_opt);
break;
result = snewn(varlen + vallen + 2, char);
sprintf(result, "%.*s=%.*s",
varlen, telnet->sb_buf+varpos,
vallen, telnet->sb_buf+valpos);
if (telnet->shdata.nenvvars >= telnet->envvarsize) {
telnet->envvarsize = telnet->shdata.nenvvars * 3 / 2 + 16;
telnet->shdata.envvars = sresize(telnet->shdata.envvars,
telnet->envvarsize, char *);
}
telnet->shdata.envvars[telnet->shdata.nenvvars++] = result;
}
done_option(telnet, telnet->sb_opt);
break;
case TELOPT_TTYPE:
if (telnet->sb_len >= 1 && telnet->sb_buf[0] == TELQUAL_IS) {
telnet->shdata.termtype = snewn(5 + telnet->sb_len, char);
if (telnet->sb_len >= 1 && telnet->sb_buf[0] == TELQUAL_IS) {
telnet->shdata.termtype = snewn(5 + telnet->sb_len, char);
strcpy(telnet->shdata.termtype, "TERM=");
for (n = 0; n < telnet->sb_len-1; n++) {
char c = telnet->sb_buf[n+1];
@ -377,117 +377,117 @@ static void process_subneg(Telnet *telnet)
c = c + 'a' - 'A';
telnet->shdata.termtype[n+5] = c;
}
telnet->shdata.termtype[telnet->sb_len+5-1] = '\0';
}
done_option(telnet, telnet->sb_opt);
break;
telnet->shdata.termtype[telnet->sb_len+5-1] = '\0';
}
done_option(telnet, telnet->sb_opt);
break;
case TELOPT_NAWS:
if (telnet->sb_len == 4) {
int w, h;
w = (unsigned char)telnet->sb_buf[0];
w = (w << 8) | (unsigned char)telnet->sb_buf[1];
h = (unsigned char)telnet->sb_buf[2];
h = (h << 8) | (unsigned char)telnet->sb_buf[3];
pty_resize(w, h);
}
break;
if (telnet->sb_len == 4) {
int w, h;
w = (unsigned char)telnet->sb_buf[0];
w = (w << 8) | (unsigned char)telnet->sb_buf[1];
h = (unsigned char)telnet->sb_buf[2];
h = (h << 8) | (unsigned char)telnet->sb_buf[3];
pty_resize(w, h);
}
break;
}
}
void telnet_from_net(Telnet *telnet, char *buf, int len)
{
while (len--) {
int c = (unsigned char) *buf++;
int c = (unsigned char) *buf++;
switch (telnet->state) {
case TOP_LEVEL:
case SEENCR:
/*
* PuTTY sends Telnet's new line sequence (CR LF on
* the wire) in response to the return key. We must
* therefore treat that as equivalent to CR NUL, and
* send CR to the pty.
*/
if ((c == NUL || c == '\n') && telnet->state == SEENCR)
telnet->state = TOP_LEVEL;
else if (c == IAC)
telnet->state = SEENIAC;
else {
char cc = c;
sel_write(telnet->pty, &cc, 1);
switch (telnet->state) {
case TOP_LEVEL:
case SEENCR:
/*
* PuTTY sends Telnet's new line sequence (CR LF on
* the wire) in response to the return key. We must
* therefore treat that as equivalent to CR NUL, and
* send CR to the pty.
*/
if ((c == NUL || c == '\n') && telnet->state == SEENCR)
telnet->state = TOP_LEVEL;
else if (c == IAC)
telnet->state = SEENIAC;
else {
char cc = c;
sel_write(telnet->pty, &cc, 1);
if (c == CR)
telnet->state = SEENCR;
else
telnet->state = TOP_LEVEL;
}
break;
case SEENIAC:
if (c == DO)
telnet->state = SEENDO;
else if (c == DONT)
telnet->state = SEENDONT;
else if (c == WILL)
telnet->state = SEENWILL;
else if (c == WONT)
telnet->state = SEENWONT;
else if (c == SB)
telnet->state = SEENSB;
else if (c == DM)
telnet->state = TOP_LEVEL;
else {
/* ignore everything else; print it if it's IAC */
if (c == IAC) {
char cc = c;
sel_write(telnet->pty, &cc, 1);
}
telnet->state = TOP_LEVEL;
}
break;
case SEENWILL:
proc_rec_opt(telnet, WILL, c);
telnet->state = TOP_LEVEL;
break;
case SEENWONT:
proc_rec_opt(telnet, WONT, c);
telnet->state = TOP_LEVEL;
break;
case SEENDO:
proc_rec_opt(telnet, DO, c);
telnet->state = TOP_LEVEL;
break;
case SEENDONT:
proc_rec_opt(telnet, DONT, c);
telnet->state = TOP_LEVEL;
break;
case SEENSB:
telnet->sb_opt = c;
telnet->sb_len = 0;
telnet->state = SUBNEGOT;
break;
case SUBNEGOT:
if (c == IAC)
telnet->state = SUBNEG_IAC;
else {
subneg_addchar:
if (telnet->sb_len >= telnet->sb_size) {
telnet->sb_size += SB_DELTA;
telnet->sb_buf = sresize(telnet->sb_buf, telnet->sb_size,
unsigned char);
}
telnet->sb_buf[telnet->sb_len++] = c;
telnet->state = SUBNEGOT; /* in case we came here by goto */
}
break;
case SUBNEG_IAC:
if (c != SE)
goto subneg_addchar; /* yes, it's a hack, I know, but... */
else {
process_subneg(telnet);
telnet->state = TOP_LEVEL;
}
break;
}
if (c == CR)
telnet->state = SEENCR;
else
telnet->state = TOP_LEVEL;
}
break;
case SEENIAC:
if (c == DO)
telnet->state = SEENDO;
else if (c == DONT)
telnet->state = SEENDONT;
else if (c == WILL)
telnet->state = SEENWILL;
else if (c == WONT)
telnet->state = SEENWONT;
else if (c == SB)
telnet->state = SEENSB;
else if (c == DM)
telnet->state = TOP_LEVEL;
else {
/* ignore everything else; print it if it's IAC */
if (c == IAC) {
char cc = c;
sel_write(telnet->pty, &cc, 1);
}
telnet->state = TOP_LEVEL;
}
break;
case SEENWILL:
proc_rec_opt(telnet, WILL, c);
telnet->state = TOP_LEVEL;
break;
case SEENWONT:
proc_rec_opt(telnet, WONT, c);
telnet->state = TOP_LEVEL;
break;
case SEENDO:
proc_rec_opt(telnet, DO, c);
telnet->state = TOP_LEVEL;
break;
case SEENDONT:
proc_rec_opt(telnet, DONT, c);
telnet->state = TOP_LEVEL;
break;
case SEENSB:
telnet->sb_opt = c;
telnet->sb_len = 0;
telnet->state = SUBNEGOT;
break;
case SUBNEGOT:
if (c == IAC)
telnet->state = SUBNEG_IAC;
else {
subneg_addchar:
if (telnet->sb_len >= telnet->sb_size) {
telnet->sb_size += SB_DELTA;
telnet->sb_buf = sresize(telnet->sb_buf, telnet->sb_size,
unsigned char);
}
telnet->sb_buf[telnet->sb_len++] = c;
telnet->state = SUBNEGOT; /* in case we came here by goto */
}
break;
case SUBNEG_IAC:
if (c != SE)
goto subneg_addchar; /* yes, it's a hack, I know, but... */
else {
process_subneg(telnet);
telnet->state = TOP_LEVEL;
}
break;
}
}
}
@ -509,13 +509,13 @@ Telnet *telnet_new(sel_wfd *net, sel_wfd *pty)
* Initialise option states.
*/
{
const struct Opt *const *o;
const struct Opt *const *o;
for (o = opts; *o; o++) {
telnet->opt_states[(*o)->index] = (*o)->initial_state;
if (telnet->opt_states[(*o)->index] == REQUESTED)
send_opt(telnet, (*o)->send, (*o)->option);
}
for (o = opts; *o; o++) {
telnet->opt_states[(*o)->index] = (*o)->initial_state;
if (telnet->opt_states[(*o)->index] == REQUESTED)
send_opt(telnet, (*o)->send, (*o)->option);
}
}
telnet->old_environ_done = 1; /* initially don't want to bother */
@ -544,22 +544,22 @@ void telnet_from_pty(Telnet *telnet, char *buf, int len)
p = (unsigned char *)buf;
end = (unsigned char *)(buf + len);
while (p < end) {
unsigned char *q = p;
unsigned char *q = p;
while (p < end && iswritable(*p))
p++;
sel_write(telnet->net, q, p - q);
while (p < end && iswritable(*p))
p++;
sel_write(telnet->net, q, p - q);
while (p < end && !iswritable(*p)) {
sel_write(telnet->net, *p == IAC ? iac : cr, 2);
p++;
}
while (p < end && !iswritable(*p)) {
sel_write(telnet->net, *p == IAC ? iac : cr, 2);
p++;
}
}
}
int telnet_shell_ok(Telnet *telnet, struct shell_data *shdata)
{
if (telnet->shell_ok)
*shdata = telnet->shdata; /* structure copy */
*shdata = telnet->shdata; /* structure copy */
return telnet->shell_ok;
}

View File

@ -10,7 +10,7 @@
typedef struct Telnet Telnet;
struct shell_data {
char **envvars; /* array of "VAR=value" terms */
char **envvars; /* array of "VAR=value" terms */
int nenvvars;
char *termtype;
};

View File

@ -36,78 +36,78 @@ my %chan_by_id = (); # indexed by 'c%d' or 's%d' for client and server ids
my %globalreq = (); # indexed by 'i' or 'o'
my %packets = (
#define SSH2_MSG_DISCONNECT 1 /* 0x1 */
#define SSH2_MSG_DISCONNECT 1 /* 0x1 */
'SSH2_MSG_DISCONNECT' => sub {
my ($direction, $seq, $data) = @_;
my ($reason, $description, $lang) = &parse("uss", $data);
printf "%s\n", &str($description);
},
#define SSH2_MSG_IGNORE 2 /* 0x2 */
#define SSH2_MSG_IGNORE 2 /* 0x2 */
'SSH2_MSG_IGNORE' => sub {
my ($direction, $seq, $data) = @_;
my ($str) = &parse("s", $data);
printf "(%d bytes)\n", length $str;
},
#define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */
#define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */
'SSH2_MSG_UNIMPLEMENTED' => sub {
my ($direction, $seq, $data) = @_;
my ($rseq) = &parse("u", $data);
printf "i%d\n", $rseq;
},
#define SSH2_MSG_DEBUG 4 /* 0x4 */
#define SSH2_MSG_DEBUG 4 /* 0x4 */
'SSH2_MSG_DEBUG' => sub {
my ($direction, $seq, $data) = @_;
my ($disp, $message, $lang) = &parse("bss", $data);
printf "%s\n", &str($message);
},
#define SSH2_MSG_SERVICE_REQUEST 5 /* 0x5 */
#define SSH2_MSG_SERVICE_REQUEST 5 /* 0x5 */
'SSH2_MSG_SERVICE_REQUEST' => sub {
my ($direction, $seq, $data) = @_;
my ($service) = &parse("s", $data);
printf "%s\n", &str($service);
},
#define SSH2_MSG_SERVICE_ACCEPT 6 /* 0x6 */
#define SSH2_MSG_SERVICE_ACCEPT 6 /* 0x6 */
'SSH2_MSG_SERVICE_ACCEPT' => sub {
my ($direction, $seq, $data) = @_;
my ($service) = &parse("s", $data);
printf "%s\n", &str($service);
},
#define SSH2_MSG_KEXINIT 20 /* 0x14 */
#define SSH2_MSG_KEXINIT 20 /* 0x14 */
'SSH2_MSG_KEXINIT' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_NEWKEYS 21 /* 0x15 */
#define SSH2_MSG_NEWKEYS 21 /* 0x15 */
'SSH2_MSG_NEWKEYS' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_KEXDH_INIT 30 /* 0x1e */
#define SSH2_MSG_KEXDH_INIT 30 /* 0x1e */
'SSH2_MSG_KEXDH_INIT' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_KEXDH_REPLY 31 /* 0x1f */
#define SSH2_MSG_KEXDH_REPLY 31 /* 0x1f */
'SSH2_MSG_KEXDH_REPLY' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_KEX_DH_GEX_REQUEST 30 /* 0x1e */
#define SSH2_MSG_KEX_DH_GEX_REQUEST 30 /* 0x1e */
'SSH2_MSG_KEX_DH_GEX_REQUEST' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_KEX_DH_GEX_GROUP 31 /* 0x1f */
#define SSH2_MSG_KEX_DH_GEX_GROUP 31 /* 0x1f */
'SSH2_MSG_KEX_DH_GEX_GROUP' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_KEX_DH_GEX_INIT 32 /* 0x20 */
#define SSH2_MSG_KEX_DH_GEX_INIT 32 /* 0x20 */
'SSH2_MSG_KEX_DH_GEX_INIT' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_KEX_DH_GEX_REPLY 33 /* 0x21 */
#define SSH2_MSG_KEX_DH_GEX_REPLY 33 /* 0x21 */
'SSH2_MSG_KEX_DH_GEX_REPLY' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
@ -172,7 +172,7 @@ my %packets = (
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_USERAUTH_REQUEST 50 /* 0x32 */
#define SSH2_MSG_USERAUTH_REQUEST 50 /* 0x32 */
'SSH2_MSG_USERAUTH_REQUEST' => sub {
my ($direction, $seq, $data) = @_;
my ($user, $service, $method) = &parse("sss", $data);
@ -187,43 +187,43 @@ my %packets = (
}
print "$out\n";
},
#define SSH2_MSG_USERAUTH_FAILURE 51 /* 0x33 */
#define SSH2_MSG_USERAUTH_FAILURE 51 /* 0x33 */
'SSH2_MSG_USERAUTH_FAILURE' => sub {
my ($direction, $seq, $data) = @_;
my ($options) = &parse("s", $data);
printf "%s\n", &str($options);
},
#define SSH2_MSG_USERAUTH_SUCCESS 52 /* 0x34 */
#define SSH2_MSG_USERAUTH_SUCCESS 52 /* 0x34 */
'SSH2_MSG_USERAUTH_SUCCESS' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_USERAUTH_BANNER 53 /* 0x35 */
#define SSH2_MSG_USERAUTH_BANNER 53 /* 0x35 */
'SSH2_MSG_USERAUTH_BANNER' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_USERAUTH_PK_OK 60 /* 0x3c */
#define SSH2_MSG_USERAUTH_PK_OK 60 /* 0x3c */
'SSH2_MSG_USERAUTH_PK_OK' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60 /* 0x3c */
#define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60 /* 0x3c */
'SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_USERAUTH_INFO_REQUEST 60 /* 0x3c */
#define SSH2_MSG_USERAUTH_INFO_REQUEST 60 /* 0x3c */
'SSH2_MSG_USERAUTH_INFO_REQUEST' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_USERAUTH_INFO_RESPONSE 61 /* 0x3d */
#define SSH2_MSG_USERAUTH_INFO_RESPONSE 61 /* 0x3d */
'SSH2_MSG_USERAUTH_INFO_RESPONSE' => sub {
my ($direction, $seq, $data) = @_;
print "\n";
},
#define SSH2_MSG_GLOBAL_REQUEST 80 /* 0x50 */
#define SSH2_MSG_GLOBAL_REQUEST 80 /* 0x50 */
'SSH2_MSG_GLOBAL_REQUEST' => sub {
my ($direction, $seq, $data) = @_;
my ($type, $wantreply) = &parse("sb", $data);
@ -237,7 +237,7 @@ my %packets = (
}
print "\n";
},
#define SSH2_MSG_REQUEST_SUCCESS 81 /* 0x51 */
#define SSH2_MSG_REQUEST_SUCCESS 81 /* 0x51 */
'SSH2_MSG_REQUEST_SUCCESS' => sub {
my ($direction, $seq, $data) = @_;
my $otherdir = ($direction eq "i" ? "o" : "i");
@ -253,7 +253,7 @@ my %packets = (
}
print "\n";
},
#define SSH2_MSG_REQUEST_FAILURE 82 /* 0x52 */
#define SSH2_MSG_REQUEST_FAILURE 82 /* 0x52 */
'SSH2_MSG_REQUEST_FAILURE' => sub {
my ($direction, $seq, $data) = @_;
my $otherdir = ($direction eq "i" ? "o" : "i");
@ -265,7 +265,7 @@ my %packets = (
}
print "\n";
},
#define SSH2_MSG_CHANNEL_OPEN 90 /* 0x5a */
#define SSH2_MSG_CHANNEL_OPEN 90 /* 0x5a */
'SSH2_MSG_CHANNEL_OPEN' => sub {
my ($direction, $seq, $data) = @_;
my ($type, $sid, $winsize, $packet) = &parse("suuu", $data);
@ -275,14 +275,14 @@ my %packets = (
# quote the _recipient's_ id of the channel.
$sid = ($direction eq "i" ? "s" : "c") . $sid;
my $chan = {'id'=>$sid, 'state'=>'halfopen',
'i'=>{'win'=>0, 'seq'=>0},
'o'=>{'win'=>0, 'seq'=>0}};
$chan->{$direction}{'win'} = $winsize;
'i'=>{'win'=>0, 'seq'=>0},
'o'=>{'win'=>0, 'seq'=>0}};
$chan->{$direction}{'win'} = $winsize;
push @channels, $chan;
my $index = $#channels;
$chan_by_id{$sid} = $index;
printf "ch%d (%s) %s (--%d)", $index, $chan->{'id'}, $type,
$chan->{$direction}{'win'};
$chan->{$direction}{'win'};
if ($type eq "x11") {
my ($addr, $port) = &parse("su", $data);
printf " from %s:%s", $addr, $port;
@ -295,7 +295,7 @@ my %packets = (
}
print "\n";
},
#define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91 /* 0x5b */
#define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91 /* 0x5b */
'SSH2_MSG_CHANNEL_OPEN_CONFIRMATION' => sub {
my ($direction, $seq, $data) = @_;
my ($rid, $sid, $winsize, $packet) = &parse("uuuu", $data);
@ -310,11 +310,11 @@ my %packets = (
my $chan = $channels[$index];
$chan->{'id'} = ($direction eq "i" ? "$rid/$sid" : "$sid/$rid");
$chan->{'state'} = 'open';
$chan->{$direction}{'win'} = $winsize;
$chan->{$direction}{'win'} = $winsize;
printf "ch%d (%s) (--%d)\n", $index, $chan->{'id'},
$chan->{$direction}{'win'};
$chan->{$direction}{'win'};
},
#define SSH2_MSG_CHANNEL_OPEN_FAILURE 92 /* 0x5c */
#define SSH2_MSG_CHANNEL_OPEN_FAILURE 92 /* 0x5c */
'SSH2_MSG_CHANNEL_OPEN_FAILURE' => sub {
my ($direction, $seq, $data) = @_;
my ($rid, $reason, $desc, $lang) = &parse("uuss", $data);
@ -328,7 +328,7 @@ my %packets = (
$chan->{'state'} = 'rejected';
printf "ch%d (%s) %s\n", $index, $chan->{'id'}, &str($reason);
},
#define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93 /* 0x5d */
#define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93 /* 0x5d */
'SSH2_MSG_CHANNEL_WINDOW_ADJUST' => sub {
my ($direction, $seq, $data) = @_;
my ($rid, $bytes) = &parse("uu", $data);
@ -339,11 +339,11 @@ my %packets = (
return;
}
my $chan = $channels[$index];
$chan->{$direction}{'win'} += $bytes;
$chan->{$direction}{'win'} += $bytes;
printf "ch%d (%s) +%d (--%d)\n", $index, $chan->{'id'}, $bytes,
$chan->{$direction}{'win'};
$chan->{$direction}{'win'};
},
#define SSH2_MSG_CHANNEL_DATA 94 /* 0x5e */
#define SSH2_MSG_CHANNEL_DATA 94 /* 0x5e */
'SSH2_MSG_CHANNEL_DATA' => sub {
my ($direction, $seq, $data) = @_;
my ($rid, $bytes) = &parse("uu", $data);
@ -354,9 +354,9 @@ my %packets = (
return;
}
my $chan = $channels[$index];
$chan->{$direction}{'seq'} += $bytes;
$chan->{$direction}{'seq'} += $bytes;
printf "ch%d (%s), %s bytes (%d--%d)\n", $index, $chan->{'id'}, $bytes,
$chan->{$direction}{'seq'}-$bytes, $chan->{$direction}{'seq'};
$chan->{$direction}{'seq'}-$bytes, $chan->{$direction}{'seq'};
my @realdata = splice @$data, 0, $bytes;
if ($dumpdata) {
my $filekey = $direction . "file";
@ -377,7 +377,7 @@ my %packets = (
$chan->{$direction."data"}->($chan, $index, $direction, $rawdata);
}
},
#define SSH2_MSG_CHANNEL_EXTENDED_DATA 95 /* 0x5f */
#define SSH2_MSG_CHANNEL_EXTENDED_DATA 95 /* 0x5f */
'SSH2_MSG_CHANNEL_EXTENDED_DATA' => sub {
my ($direction, $seq, $data) = @_;
my ($rid, $type, $bytes) = &parse("uuu", $data);
@ -392,7 +392,7 @@ my %packets = (
return;
}
my $chan = $channels[$index];
$chan->{$direction}{'seq'} += $bytes;
$chan->{$direction}{'seq'} += $bytes;
printf "ch%d (%s), type %s, %s bytes (%d--%d)\n", $index,$chan->{'id'},
$type, $bytes, $chan->{$direction}{'seq'}-$bytes,
$chan->{$direction}{'seq'};
@ -421,7 +421,7 @@ my %packets = (
$chan->{$direction."data"}->($chan, $index, $direction, $rawdata);
}
},
#define SSH2_MSG_CHANNEL_EOF 96 /* 0x60 */
#define SSH2_MSG_CHANNEL_EOF 96 /* 0x60 */
'SSH2_MSG_CHANNEL_EOF' => sub {
my ($direction, $seq, $data) = @_;
my ($rid) = &parse("uu", $data);
@ -434,7 +434,7 @@ my %packets = (
my $chan = $channels[$index];
printf "ch%d (%s)\n", $index, $chan->{'id'};
},
#define SSH2_MSG_CHANNEL_CLOSE 97 /* 0x61 */
#define SSH2_MSG_CHANNEL_CLOSE 97 /* 0x61 */
'SSH2_MSG_CHANNEL_CLOSE' => sub {
my ($direction, $seq, $data) = @_;
my ($rid) = &parse("uu", $data);
@ -454,7 +454,7 @@ my %packets = (
}
printf "ch%d (%s)\n", $index, $chan->{'id'};
},
#define SSH2_MSG_CHANNEL_REQUEST 98 /* 0x62 */
#define SSH2_MSG_CHANNEL_REQUEST 98 /* 0x62 */
'SSH2_MSG_CHANNEL_REQUEST' => sub {
my ($direction, $seq, $data) = @_;
my ($rid, $type, $wantreply) = &parse("usb", $data);
@ -469,7 +469,7 @@ my %packets = (
printf "ch%d (%s) %s (%s)", $index, $chan->{'id'},
$type, $wantreply eq "yes" ? "reply" : "noreply";
push @{$chan->{'requests_'.$direction}}, [$seq, $type]
if $wantreply eq "yes";
if $wantreply eq "yes";
}
if ($type eq "pty-req") {
my ($term, $w, $h, $pw, $ph, $modes) = &parse("suuuus", $data);
@ -506,7 +506,7 @@ my %packets = (
}
print "\n";
},
#define SSH2_MSG_CHANNEL_SUCCESS 99 /* 0x63 */
#define SSH2_MSG_CHANNEL_SUCCESS 99 /* 0x63 */
'SSH2_MSG_CHANNEL_SUCCESS' => sub {
my ($direction, $seq, $data) = @_;
my ($rid) = &parse("uu", $data);
@ -527,7 +527,7 @@ my %packets = (
}
print "\n";
},
#define SSH2_MSG_CHANNEL_FAILURE 100 /* 0x64 */
#define SSH2_MSG_CHANNEL_FAILURE 100 /* 0x64 */
'SSH2_MSG_CHANNEL_FAILURE' => sub {
my ($direction, $seq, $data) = @_;
my ($rid) = &parse("uu", $data);
@ -796,19 +796,19 @@ my %verbose_packet_dump_functions = (
);
my %sftp_packets = (
#define SSH_FXP_INIT 1 /* 0x1 */
#define SSH_FXP_INIT 1 /* 0x1 */
0x1 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($ver) = &parse("u", $data);
printf "SSH_FXP_INIT %d\n", $ver;
},
#define SSH_FXP_VERSION 2 /* 0x2 */
#define SSH_FXP_VERSION 2 /* 0x2 */
0x2 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($ver) = &parse("u", $data);
printf "SSH_FXP_VERSION %d\n", $ver;
},
#define SSH_FXP_OPEN 3 /* 0x3 */
#define SSH_FXP_OPEN 3 /* 0x3 */
0x3 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path, $pflags) = &parse("usu", $data);
@ -828,7 +828,7 @@ my %sftp_packets = (
}
print "\n";
},
#define SSH_FXP_CLOSE 4 /* 0x4 */
#define SSH_FXP_CLOSE 4 /* 0x4 */
0x4 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $handle) = &parse("us", $data);
@ -836,7 +836,7 @@ my %sftp_packets = (
printf " \"%s\"", &stringescape($handle);
print "\n";
},
#define SSH_FXP_READ 5 /* 0x5 */
#define SSH_FXP_READ 5 /* 0x5 */
0x5 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $handle, $offset, $len) = &parse("usUu", $data);
@ -844,7 +844,7 @@ my %sftp_packets = (
printf " \"%s\" %d %d", &stringescape($handle), $offset, $len;
print "\n";
},
#define SSH_FXP_WRITE 6 /* 0x6 */
#define SSH_FXP_WRITE 6 /* 0x6 */
0x6 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $handle, $offset, $wdata) = &parse("usUs", $data);
@ -852,7 +852,7 @@ my %sftp_packets = (
printf " \"%s\" %d [%d bytes]", &stringescape($handle), $offset, length $wdata;
print "\n";
},
#define SSH_FXP_LSTAT 7 /* 0x7 */
#define SSH_FXP_LSTAT 7 /* 0x7 */
0x7 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -860,7 +860,7 @@ my %sftp_packets = (
printf " \"%s\"", $path;
print "\n";
},
#define SSH_FXP_FSTAT 8 /* 0x8 */
#define SSH_FXP_FSTAT 8 /* 0x8 */
0x8 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $handle) = &parse("us", $data);
@ -868,7 +868,7 @@ my %sftp_packets = (
printf " \"%s\"", &stringescape($handle);
print "\n";
},
#define SSH_FXP_SETSTAT 9 /* 0x9 */
#define SSH_FXP_SETSTAT 9 /* 0x9 */
0x9 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -877,7 +877,7 @@ my %sftp_packets = (
printf " \"%s\" %s", $path, $attrs;
print "\n";
},
#define SSH_FXP_FSETSTAT 10 /* 0xa */
#define SSH_FXP_FSETSTAT 10 /* 0xa */
0xa => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $handle) = &parse("us", $data);
@ -886,7 +886,7 @@ my %sftp_packets = (
printf " \"%s\" %s", &stringescape($handle), $attrs;
print "\n";
},
#define SSH_FXP_OPENDIR 11 /* 0xb */
#define SSH_FXP_OPENDIR 11 /* 0xb */
0xb => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -894,7 +894,7 @@ my %sftp_packets = (
printf " \"%s\"", $path;
print "\n";
},
#define SSH_FXP_READDIR 12 /* 0xc */
#define SSH_FXP_READDIR 12 /* 0xc */
0xc => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $handle) = &parse("us", $data);
@ -902,7 +902,7 @@ my %sftp_packets = (
printf " \"%s\"", &stringescape($handle);
print "\n";
},
#define SSH_FXP_REMOVE 13 /* 0xd */
#define SSH_FXP_REMOVE 13 /* 0xd */
0xd => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -910,7 +910,7 @@ my %sftp_packets = (
printf " \"%s\"", $path;
print "\n";
},
#define SSH_FXP_MKDIR 14 /* 0xe */
#define SSH_FXP_MKDIR 14 /* 0xe */
0xe => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -918,7 +918,7 @@ my %sftp_packets = (
printf " \"%s\"", $path;
print "\n";
},
#define SSH_FXP_RMDIR 15 /* 0xf */
#define SSH_FXP_RMDIR 15 /* 0xf */
0xf => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -926,7 +926,7 @@ my %sftp_packets = (
printf " \"%s\"", $path;
print "\n";
},
#define SSH_FXP_REALPATH 16 /* 0x10 */
#define SSH_FXP_REALPATH 16 /* 0x10 */
0x10 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -934,7 +934,7 @@ my %sftp_packets = (
printf " \"%s\"", $path;
print "\n";
},
#define SSH_FXP_STAT 17 /* 0x11 */
#define SSH_FXP_STAT 17 /* 0x11 */
0x11 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $path) = &parse("us", $data);
@ -942,7 +942,7 @@ my %sftp_packets = (
printf " \"%s\"", $path;
print "\n";
},
#define SSH_FXP_RENAME 18 /* 0x12 */
#define SSH_FXP_RENAME 18 /* 0x12 */
0x12 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $srcpath, $dstpath) = &parse("uss", $data);
@ -950,7 +950,7 @@ my %sftp_packets = (
printf " \"%s\" \"%s\"", $srcpath, $dstpath;
print "\n";
},
#define SSH_FXP_STATUS 101 /* 0x65 */
#define SSH_FXP_STATUS 101 /* 0x65 */
0x65 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $status) = &parse("uu", $data);
@ -968,7 +968,7 @@ my %sftp_packets = (
else { printf "[unknown status %d]", $status; }
print "\n";
},
#define SSH_FXP_HANDLE 102 /* 0x66 */
#define SSH_FXP_HANDLE 102 /* 0x66 */
0x66 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $handle) = &parse("us", $data);
@ -976,7 +976,7 @@ my %sftp_packets = (
printf " \"%s\"", &stringescape($handle);
print "\n";
},
#define SSH_FXP_DATA 103 /* 0x67 */
#define SSH_FXP_DATA 103 /* 0x67 */
0x67 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $retdata) = &parse("us", $data);
@ -984,7 +984,7 @@ my %sftp_packets = (
printf " [%d bytes]", length $retdata;
print "\n";
},
#define SSH_FXP_NAME 104 /* 0x68 */
#define SSH_FXP_NAME 104 /* 0x68 */
0x68 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $count) = &parse("uu", $data);
@ -996,7 +996,7 @@ my %sftp_packets = (
}
print "\n";
},
#define SSH_FXP_ATTRS 105 /* 0x69 */
#define SSH_FXP_ATTRS 105 /* 0x69 */
0x69 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid) = &parse("u", $data);
@ -1005,7 +1005,7 @@ my %sftp_packets = (
printf " %s", $attrs;
print "\n";
},
#define SSH_FXP_EXTENDED 200 /* 0xc8 */
#define SSH_FXP_EXTENDED 200 /* 0xc8 */
0xc8 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid, $type) = &parse("us", $data);
@ -1013,7 +1013,7 @@ my %sftp_packets = (
printf " \"%s\"", $type;
print "\n";
},
#define SSH_FXP_EXTENDED_REPLY 201 /* 0xc9 */
#define SSH_FXP_EXTENDED_REPLY 201 /* 0xc9 */
0xc9 => sub {
my ($chan, $index, $direction, $id, $data) = @_;
my ($reqid) = &parse("u", $data);