X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/6ee0cb6dfb669f887f62043a1231bbd8d496560f..125105d16c788398562ac03e91ce7a0dc0292492:/telnet.c diff --git a/telnet.c b/telnet.c index c0efd715..e3fff49f 100644 --- a/telnet.c +++ b/telnet.c @@ -611,18 +611,11 @@ static void do_telnet_read(Telnet telnet, char *buf, int len) else { subneg_addchar: if (telnet->sb_len >= telnet->sb_size) { - unsigned char *newbuf; telnet->sb_size += SB_DELTA; - newbuf = (telnet->sb_buf ? - srealloc(telnet->sb_buf, telnet->sb_size) : - smalloc(telnet->sb_size)); - if (newbuf) - telnet->sb_buf = newbuf; - else - telnet->sb_size -= SB_DELTA; + telnet->sb_buf = sresize(telnet->sb_buf, telnet->sb_size, + unsigned char); } - if (telnet->sb_len < telnet->sb_size) - telnet->sb_buf[telnet->sb_len++] = c; + telnet->sb_buf[telnet->sb_len++] = c; telnet->state = SUBNEGOT; /* in case we came here by goto */ } break; @@ -691,7 +684,7 @@ static char *telnet_init(void *frontend_handle, void **backend_handle, char *err; Telnet telnet; - telnet = smalloc(sizeof(*telnet)); + telnet = snew(struct telnet_tag); telnet->fn = &fn_table; telnet->cfg = *cfg; /* STRUCTURE COPY */ telnet->s = NULL; @@ -962,6 +955,29 @@ static void telnet_special(void *handle, Telnet_Special code) } } +static const struct telnet_special *telnet_get_specials(void *handle) +{ + static const struct telnet_special specials[] = { + {"Are You There", TS_AYT}, + {"Break", TS_BRK}, + {"Synch", TS_SYNCH}, + {"Erase Character", TS_EC}, + {"Erase Line", TS_EL}, + {"Go Ahead", TS_GA}, + {"No Operation", TS_NOP}, + {"", 0}, + {"Abort Process", TS_ABORT}, + {"Abort Output", TS_AO}, + {"Interrupt Process", TS_IP}, + {"Suspend Process", TS_SUSP}, + {"", 0}, + {"End Of Record", TS_EOR}, + {"End Of File", TS_EOF}, + {NULL, 0} + }; + return specials; +} + static Socket telnet_socket(void *handle) { Telnet telnet = (Telnet) handle; @@ -1003,9 +1019,12 @@ static void telnet_provide_logctx(void *handle, void *logctx) static int telnet_exitcode(void *handle) { - /* Telnet telnet = (Telnet) handle; */ - /* Telnet doesn't transmit exit codes back to the client */ - return 0; + Telnet telnet = (Telnet) handle; + if (telnet->s != NULL) + return -1; /* still connected */ + else + /* Telnet doesn't transmit exit codes back to the client */ + return 0; } Backend telnet_backend = { @@ -1016,6 +1035,7 @@ Backend telnet_backend = { telnet_sendbuffer, telnet_size, telnet_special, + telnet_get_specials, telnet_socket, telnet_exitcode, telnet_sendok,