char username[32];
char localusername[32];
int rfc_environ;
+ int passive_telnet;
/* Keyboard options */
int bksp_is_delete;
int rxvt_homeend;
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);
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);
};
static int echoing = TRUE, editing = TRUE;
+static int activated = FALSE;
static int in_synch;
static int sb_opt, sb_len;
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)
/*
* 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;
}
/*
IDC_EMSTATIC,
IDC_EMBSD,
IDC_EMRFC,
+ IDC_ACTSTATIC,
+ IDC_TPASSIVE,
+ IDC_TACTIVE,
telnetpanelend,
rloginpanelstart,
}
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);
}
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) {
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);
}
}
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) {