From RDB: telnet can now start up in passive mode, in which it
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 9 May 2001 13:51:07 +0000 (13:51 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 9 May 2001 13:51:07 +0000 (13:51 +0000)
doesn't do any negotiation until the remote side does.

git-svn-id: svn://svn.tartarus.org/sgt/putty@1107 cda61777-01e9-0310-a592-d414129be87e

putty.h
settings.c
telnet.c
windlg.c

diff --git a/putty.h b/putty.h
index de93bc2..cd7262f 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -196,6 +196,7 @@ typedef struct {
     char username[32];
     char localusername[32];
     int rfc_environ;
+    int passive_telnet;
     /* Keyboard options */
     int bksp_is_delete;
     int rxvt_homeend;
index 27ab59f..141e9b8 100644 (file)
@@ -86,6 +86,7 @@ void save_settings(char *section, int do_host, Config * cfg)
     write_setting_s(sesskey, "PublicKeyFile", cfg->keyfile);
     write_setting_s(sesskey, "RemoteCommand", cfg->remote_cmd);
     write_setting_i(sesskey, "RFCEnviron", cfg->rfc_environ);
+    write_setting_i(sesskey, "PassiveTelnet", cfg->passive_telnet);
     write_setting_i(sesskey, "BackspaceIsDelete", cfg->bksp_is_delete);
     write_setting_i(sesskey, "RXVTHomeEnd", cfg->rxvt_homeend);
     write_setting_i(sesskey, "LinuxFunctionKeys", cfg->funky_type);
@@ -248,6 +249,7 @@ void load_settings(char *section, int do_host, Config * cfg)
     gpps(sesskey, "RemoteCommand", "", cfg->remote_cmd,
         sizeof(cfg->remote_cmd));
     gppi(sesskey, "RFCEnviron", 0, &cfg->rfc_environ);
+    gppi(sesskey, "PassiveTelnet", 0, &cfg->passive_telnet);
     gppi(sesskey, "BackspaceIsDelete", 1, &cfg->bksp_is_delete);
     gppi(sesskey, "RXVTHomeEnd", 0, &cfg->rxvt_homeend);
     gppi(sesskey, "LinuxFunctionKeys", 0, &cfg->funky_type);
index b2e4999..3cef9c7 100644 (file)
--- a/telnet.c
+++ b/telnet.c
@@ -175,6 +175,7 @@ static struct Opt *opts[] = {
 };
 
 static int echoing = TRUE, editing = TRUE;
+static int activated = FALSE;
 
 static int in_synch;
 static int sb_opt, sb_len;
@@ -226,6 +227,23 @@ static void option_side_effects(struct Opt *o, int enabled)
     else if (o->option == TELOPT_SGA && o->send == DO)
        editing = !enabled;
     ldisc_send(NULL, 0);              /* cause ldisc to notice the change */
+
+    /* Ensure we get the minimum options */
+    if (!activated) {
+       if (o_echo.state == INACTIVE) {
+           o_echo.state = REQUESTED;
+           send_opt(o_echo.send, o_echo.option);
+       }
+       if (o_we_sga.state == INACTIVE) {
+           o_we_sga.state = REQUESTED;
+           send_opt(o_we_sga.send, o_we_sga.option);
+       }
+       if (o_they_sga.state == INACTIVE) {
+           o_they_sga.state = REQUESTED;
+           send_opt(o_they_sga.send, o_they_sga.option);
+       }
+       activated = TRUE;
+    }
 }
 
 static void activate_option(struct Opt *o)
@@ -603,12 +621,19 @@ static char *telnet_init(char *host, int port, char **realhost)
     /*
      * Initialise option states.
      */
-    {
+    if (cfg.passive_telnet) {
+       struct Opt **o;
+
+       for (o = opts; *o; o++)
+           if ((*o)->state == REQUESTED)
+               (*o)->state = INACTIVE;
+    } else {
        struct Opt **o;
 
        for (o = opts; *o; o++)
            if ((*o)->state == REQUESTED)
                send_opt((*o)->send, (*o)->option);
+       activated = TRUE;
     }
 
     /*
index 5b2bac2..eb01fc2 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -408,6 +408,9 @@ enum { IDCX_ABOUT =
     IDC_EMSTATIC,
     IDC_EMBSD,
     IDC_EMRFC,
+    IDC_ACTSTATIC,
+    IDC_TPASSIVE,
+    IDC_TACTIVE,
     telnetpanelend,
 
     rloginpanelstart,
@@ -658,6 +661,8 @@ static void init_dlg_ctrls(HWND hwnd)
     }
     CheckRadioButton(hwnd, IDC_EMBSD, IDC_EMRFC,
                     cfg.rfc_environ ? IDC_EMRFC : IDC_EMBSD);
+    CheckRadioButton(hwnd, IDC_TPASSIVE, IDC_TACTIVE,
+                    cfg.passive_telnet ? IDC_TPASSIVE : IDC_TACTIVE);
 
     SetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype);
     SetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username);
@@ -1102,7 +1107,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
     }
 
     if (panel == telnetpanelstart) {
-       /* The Telnet panel. Accelerators used: [acgo] svldr bf */
+       /* The Telnet panel. Accelerators used: [acgo] svldr bft */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        if (dlgtype == 0) {
@@ -1120,6 +1125,9 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
            radioline(&cp, "Handling of OLD_ENVIRON ambiguity:",
                      IDC_EMSTATIC, 2, "&BSD (commonplace)", IDC_EMBSD,
                      "R&FC 1408 (unusual)", IDC_EMRFC, NULL);
+           radioline(&cp, "&Telnet negotiation mode:", IDC_ACTSTATIC, 2,
+                     "Passive", IDC_TPASSIVE, "Active",
+                     IDC_TACTIVE, NULL);
            endbox(&cp);
        }
     }
@@ -1987,6 +1995,11 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
              case IDC_EMRFC:
                cfg.rfc_environ = IsDlgButtonChecked(hwnd, IDC_EMRFC);
                break;
+             case IDC_TPASSIVE:
+             case IDC_TACTIVE:
+               cfg.passive_telnet =
+                   IsDlgButtonChecked(hwnd, IDC_TPASSIVE);
+               break;
              case IDC_ENVADD:
                if (HIWORD(wParam) == BN_CLICKED ||
                    HIWORD(wParam) == BN_DOUBLECLICKED) {