X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=telnet.c;h=8717a9723d3689c3dd9a97304c6b9b3cdbdc09f4;hb=f004bcca17a789356c32527a396b68b71a773db2;hp=dc98a7272aac27c5eb72d59d3747b0233214e1d1;hpb=947962e0b95e10151c186048a8b5cc2fb425838c;p=PuTTY.git diff --git a/telnet.c b/telnet.c index dc98a727..8717a972 100644 --- a/telnet.c +++ b/telnet.c @@ -4,6 +4,7 @@ #include #include +#include #include "putty.h" @@ -181,6 +182,7 @@ typedef struct telnet_tag { /* the above field _must_ be first in the structure */ Socket s; + int closed_on_socket_error; void *frontend; void *ldisc; @@ -262,7 +264,7 @@ static void option_side_effects(Telnet telnet, const struct Opt *o, int enabled) else if (o->option == TELOPT_SGA && o->send == DO) telnet->editing = !enabled; if (telnet->ldisc) /* cause ldisc to notice the change */ - ldisc_send(telnet->ldisc, NULL, 0, 0); + ldisc_echoedit_update(telnet->ldisc); /* Ensure we get the minimum options */ if (!telnet->activated) { @@ -660,6 +662,7 @@ static void telnet_log(Plug plug, int type, SockAddr addr, int port, msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg); logevent(telnet->frontend, msg); + sfree(msg); } static int telnet_closing(Plug plug, const char *error_msg, int error_code, @@ -676,6 +679,8 @@ static int telnet_closing(Plug plug, const char *error_msg, int error_code, if (telnet->s) { sk_close(telnet->s); telnet->s = NULL; + if (error_msg) + telnet->closed_on_socket_error = TRUE; notify_remote_exit(telnet->frontend); } if (error_msg) { @@ -729,6 +734,7 @@ static const char *telnet_init(void *frontend_handle, void **backend_handle, telnet->fn = &fn_table; telnet->conf = conf_copy(conf); telnet->s = NULL; + telnet->closed_on_socket_error = FALSE; telnet->echoing = TRUE; telnet->editing = TRUE; telnet->activated = FALSE; @@ -812,15 +818,10 @@ static const char *telnet_init(void *frontend_handle, void **backend_handle, sfree(*realhost); *realhost = dupstr(loghost); - colon = strrchr(*realhost, ':'); - if (colon) { - /* - * FIXME: if we ever update this aspect of ssh.c for - * IPv6 literal management, this should change in line - * with it. - */ + + colon = host_strrchr(*realhost, ':'); + if (colon) *colon++ = '\0'; - } } return NULL; @@ -1096,6 +1097,8 @@ static int telnet_exitcode(void *handle) Telnet telnet = (Telnet) handle; if (telnet->s != NULL) return -1; /* still connected */ + else if (telnet->closed_on_socket_error) + return INT_MAX; /* a socket error counts as an unclean exit */ else /* Telnet doesn't transmit exit codes back to the client */ return 0;