Been meaning to do this for years: introduce a configuration option
[u/mdw/putty] / config.c
index 477dc4d..4f01c16 100644 (file)
--- a/config.c
+++ b/config.c
 #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 }
        };
 
@@ -1057,7 +1049,9 @@ static void portfwd_handler(union control *ctrl, void *dlg,
                {
                    static const char *const afs = "A46";
                    char *afp = strchr(afs, *p);
+#ifndef NO_IPV6
                    int idx = afp ? afp-afs : 0;
+#endif
                    if (afp)
                        p++;
 #ifndef NO_IPV6
@@ -1165,7 +1159,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 +1250,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 +1286,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 +1312,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)));
@@ -1724,6 +1721,14 @@ void setup_config_box(struct controlbox *b, int midsession,
                          "IPv6", '6', I(ADDRTYPE_IPV6),
                          NULL);
 #endif
+
+           s = ctrl_getset(b, "Connection", "identity",
+                           "Logical name of remote host");
+           ctrl_editbox(s, "Logical name of remote host (e.g. for SSH key lookup):",
+                        'm', 100,
+                        HELPCTX(connection_loghost),
+                        dlg_stdeditbox_handler, I(offsetof(Config,loghost)),
+                        I(sizeof(((Config *)0)->loghost)));
        }
 
        /*
@@ -1911,7 +1916,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.
@@ -2248,6 +2253,9 @@ void setup_config_box(struct controlbox *b, int midsession,
            ctrl_droplist(s, "Handles SSH-2 key re-exchange badly", 'k', 20,
                          HELPCTX(ssh_bugs_rekey2),
                          sshbug_handler, I(offsetof(Config,sshbug_rekey2)));
+           ctrl_droplist(s, "Ignores SSH-2 maximum packet size", 'x', 20,
+                         HELPCTX(ssh_bugs_maxpkt2),
+                         sshbug_handler, I(offsetof(Config,sshbug_maxpkt2)));
        }
     }
 }