X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/d9268a99e3826f6e4554867b370a69c7578ad9a2..786476b93a0377f202d4bc7b156dbc6cce6fcf59:/config.c diff --git a/config.c b/config.c index 477dc4d4..d5b50dd1 100644 --- a/config.c +++ b/config.c @@ -15,20 +15,6 @@ #define HOST_BOX_TITLE "Host Name (or IP address)" #define PORT_BOX_TITLE "Port" -/* - * Convenience function: determine whether this binary supports a - * given backend. - */ -static int have_backend(int protocol) -{ - struct backend_list *p = backends; - for (p = backends; p->name; p++) { - if (p->protocol == protocol) - return 1; - } - return 0; -} - static void config_host_handler(union control *ctrl, void *dlg, void *data, int event) { @@ -104,7 +90,7 @@ struct hostport { void config_protocolbuttons_handler(union control *ctrl, void *dlg, void *data, int event) { - int button, defport; + int button; Config *cfg = (Config *)data; struct hostport *hp = (struct hostport *)ctrl->radio.context.p; @@ -128,15 +114,20 @@ void config_protocolbuttons_handler(union control *ctrl, void *dlg, assert(button >= 0 && button < ctrl->radio.nbuttons); cfg->protocol = ctrl->radio.buttondata[button].i; if (oldproto != cfg->protocol) { - defport = -1; - switch (cfg->protocol) { - case PROT_SSH: defport = 22; break; - case PROT_TELNET: defport = 23; break; - case PROT_RLOGIN: defport = 513; break; - } - if (defport > 0 && cfg->port != defport) { - cfg->port = defport; - } + Backend *ob = backend_from_proto(oldproto); + Backend *nb = backend_from_proto(cfg->protocol); + assert(ob); + assert(nb); + /* Iff the user hasn't changed the port from the protocol + * default (if any), update it with the new protocol's + * default. + * (XXX: this isn't perfect; a default can become permanent + * by going via the serial backend. However, it helps with + * the common case of tabbing through the controls in order + * and setting a non-default port.) */ + if (cfg->port == ob->default_port && + cfg->port > 0 && nb->default_port > 0) + cfg->port = nb->default_port; } dlg_refresh(hp->host, dlg); dlg_refresh(hp->port, dlg); @@ -256,6 +247,7 @@ static void kexlist_handler(union control *ctrl, void *dlg, { "Diffie-Hellman group 1", KEX_DHGROUP1 }, { "Diffie-Hellman group 14", KEX_DHGROUP14 }, { "Diffie-Hellman group exchange", KEX_DHGEX }, + { "RSA-based key exchange", KEX_RSA }, { "-- warn below here --", KEX_WARN } }; @@ -1165,7 +1157,7 @@ void setup_config_box(struct controlbox *b, int midsession, hp->port = c; ctrl_columns(s, 1, 100); - if (!have_backend(PROT_SSH)) { + if (!backend_from_proto(PROT_SSH)) { ctrl_radiobuttons(s, "Connection type:", NO_SHORTCUT, 3, HELPCTX(session_hostname), config_protocolbuttons_handler, P(hp), @@ -1256,7 +1248,7 @@ void setup_config_box(struct controlbox *b, int midsession, { char *sshlogname, *sshrawlogname; if ((midsession && protocol == PROT_SSH) || - (!midsession && have_backend(PROT_SSH))) { + (!midsession && backend_from_proto(PROT_SSH))) { sshlogname = "SSH packets"; sshrawlogname = "SSH packets and raw data"; } else { @@ -1292,7 +1284,7 @@ void setup_config_box(struct controlbox *b, int midsession, dlg_stdcheckbox_handler, I(offsetof(Config,logflush))); if ((midsession && protocol == PROT_SSH) || - (!midsession && have_backend(PROT_SSH))) { + (!midsession && backend_from_proto(PROT_SSH))) { s = ctrl_getset(b, "Session/Logging", "ssh", "Options specific to SSH packet logging"); ctrl_checkbox(s, "Omit known password fields", 'k', @@ -1318,6 +1310,9 @@ void setup_config_box(struct controlbox *b, int midsession, ctrl_checkbox(s, "Implicit CR in every LF", 'r', HELPCTX(terminal_lfhascr), dlg_stdcheckbox_handler, I(offsetof(Config,lfhascr))); + ctrl_checkbox(s, "Implicit LF in every CR", 'f', + HELPCTX(terminal_crhaslf), + dlg_stdcheckbox_handler, I(offsetof(Config,crhaslf))); ctrl_checkbox(s, "Use background colour to erase screen", 'e', HELPCTX(terminal_bce), dlg_stdcheckbox_handler, I(offsetof(Config,bce))); @@ -1911,7 +1906,7 @@ void setup_config_box(struct controlbox *b, int midsession, * when we're not doing SSH. */ - if (have_backend(PROT_SSH) && (!midsession || protocol == PROT_SSH)) { + if (backend_from_proto(PROT_SSH) && (!midsession || protocol == PROT_SSH)) { /* * The Connection/SSH panel.