1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-07 06:22:47 -05:00

Integrate unfix.org's IPv6 patches up to level 10, with rather a lot

of polishing to bring them to what I think should in principle be
release quality. Unlike the unfix.org patches themselves, this
checkin enables IPv6 by default; if you want to leave it out, you
have to build with COMPAT=-DNO_IPV6.

I have tested that this compiles on Visual C 7 (so the nightlies
_should_ acquire IPv6 support without missing a beat), but since I
don't have IPv6 set up myself I haven't actually tested that it
_works_. It still seems to make correct IPv4 connections, but that's
all I've been able to verify for myself. Further testing is needed.

[originally from svn r5047]
[this svn revision also touched putty-wishlist]
This commit is contained in:
Simon Tatham
2004-12-30 16:45:11 +00:00
parent 7573f3733f
commit 6daf6faede
30 changed files with 583 additions and 309 deletions

146
config.c
View File

@ -666,6 +666,7 @@ static void environ_handler(union control *ctrl, void *dlg,
struct portfwd_data {
union control *addbutton, *rembutton, *listbox;
union control *sourcebox, *destbox, *direction;
union control *addressfamily;
};
static void portfwd_handler(union control *ctrl, void *dlg,
@ -690,25 +691,39 @@ static void portfwd_handler(union control *ctrl, void *dlg,
* Default is Local.
*/
dlg_radiobutton_set(ctrl, dlg, 0);
} else if (ctrl == pfd->addressfamily) {
dlg_radiobutton_set(ctrl, dlg, 0);
}
} else if (event == EVENT_ACTION) {
if (ctrl == pfd->addbutton) {
char str[sizeof(cfg->portfwd)];
char *p;
int whichbutton = dlg_radiobutton_get(pfd->direction, dlg);
int i, type;
int whichbutton;
i = 0;
whichbutton = dlg_radiobutton_get(pfd->addressfamily, dlg);
if (whichbutton == 1)
str[i++] = '4';
else if (whichbutton == 2)
str[i++] = '6';
whichbutton = dlg_radiobutton_get(pfd->direction, dlg);
if (whichbutton == 0)
str[0] = 'L';
type = 'L';
else if (whichbutton == 1)
str[0] = 'R';
type = 'R';
else
str[0] = 'D';
dlg_editbox_get(pfd->sourcebox, dlg, str+1, sizeof(str) - 2);
if (!str[1]) {
type = 'D';
str[i++] = type;
dlg_editbox_get(pfd->sourcebox, dlg, str+i, sizeof(str) - i);
if (!str[2]) {
dlg_error_msg(dlg, "You need to specify a source port number");
return;
}
p = str + strlen(str);
if (str[0] != 'D') {
if (type != 'D') {
*p++ = '\t';
dlg_editbox_get(pfd->destbox, dlg, p,
sizeof(str)-1 - (p - str));
@ -1344,9 +1359,59 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
if (protocol >= 0) {
ctrl_settitle(b, "Connection", "Options controlling the connection");
s = ctrl_getset(b, "Connection", "keepalive",
"Sending of null packets to keep session active");
ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20,
HELPCTX(connection_keepalive),
dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)),
I(-1));
if (!midsession) {
s = ctrl_getset(b, "Connection", "data",
"Data to send to the server");
s = ctrl_getset(b, "Connection", "tcp",
"Low-level TCP connection options");
ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)",
'n', HELPCTX(connection_nodelay),
dlg_stdcheckbox_handler,
I(offsetof(Config,tcp_nodelay)));
ctrl_checkbox(s, "Enable TCP keepalives (SO_KEEPALIVE option)",
'p', HELPCTX(connection_tcpkeepalive),
dlg_stdcheckbox_handler,
I(offsetof(Config,tcp_keepalives)));
s = ctrl_getset(b, "Connection", "ipversion",
"Internet protocol version");
ctrl_radiobuttons(s, NULL, NO_SHORTCUT,
#ifndef NO_IPV6
3,
#else
2,
#endif
HELPCTX(connection_ipversion),
dlg_stdradiobutton_handler,
I(offsetof(Config, addressfamily)),
"Auto", NO_SHORTCUT, I(ADDRTYPE_UNSPEC),
"IPv4", NO_SHORTCUT, I(ADDRTYPE_IPV4),
#ifndef NO_IPV6
"IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6),
#endif
NULL);
}
/*
* A sub-panel Connection/Data, containing options that
* decide on data to send to the server.
*/
if (!midsession) {
ctrl_settitle(b, "Connection/Data", "Data to send to the server");
s = ctrl_getset(b, "Connection/Data", "login",
"Login details");
ctrl_editbox(s, "Auto-login username", 'u', 50,
HELPCTX(connection_username),
dlg_stdeditbox_handler, I(offsetof(Config,username)),
I(sizeof(((Config *)0)->username)));
s = ctrl_getset(b, "Connection/Data", "term",
"Terminal details");
ctrl_editbox(s, "Terminal-type string", 't', 50,
HELPCTX(connection_termtype),
dlg_stdeditbox_handler, I(offsetof(Config,termtype)),
@ -1355,12 +1420,9 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
HELPCTX(connection_termspeed),
dlg_stdeditbox_handler, I(offsetof(Config,termspeed)),
I(sizeof(((Config *)0)->termspeed)));
ctrl_editbox(s, "Auto-login username", 'u', 50,
HELPCTX(connection_username),
dlg_stdeditbox_handler, I(offsetof(Config,username)),
I(sizeof(((Config *)0)->username)));
ctrl_text(s, "Environment variables:", HELPCTX(telnet_environ));
s = ctrl_getset(b, "Connection/Data", "env",
"Environment variables");
ctrl_columns(s, 2, 80, 20);
ed = (struct environ_data *)
ctrl_alloc(b, sizeof(struct environ_data));
@ -1391,26 +1453,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
ed->listbox->listbox.percentages[1] = 70;
}
s = ctrl_getset(b, "Connection", "keepalive",
"Sending of null packets to keep session active");
ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20,
HELPCTX(connection_keepalive),
dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)),
I(-1));
if (!midsession) {
s = ctrl_getset(b, "Connection", "tcp",
"Low-level TCP connection options");
ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)",
'n', HELPCTX(connection_nodelay),
dlg_stdcheckbox_handler,
I(offsetof(Config,tcp_nodelay)));
ctrl_checkbox(s, "Enable TCP keepalives (SO_KEEPALIVE option)",
'p', HELPCTX(connection_tcpkeepalive),
dlg_stdcheckbox_handler,
I(offsetof(Config,tcp_keepalives)));
}
}
if (!midsession) {
@ -1664,15 +1706,14 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
dlg_stdfilesel_handler, I(offsetof(Config, keyfile)));
}
/*
* The Connection/SSH/Tunnels panel. Some of this _is_
* still available in mid-session.
*/
ctrl_settitle(b, "Connection/SSH/Tunnels",
"Options controlling SSH tunnelling");
if (!midsession) {
s = ctrl_getset(b, "Connection/SSH/Tunnels", "x11", "X11 forwarding");
/*
* The Connection/SSH/X11 panel.
*/
ctrl_settitle(b, "Connection/SSH/X11",
"Options controlling SSH X11 forwarding");
s = ctrl_getset(b, "Connection/SSH/X11", "x11", "X11 forwarding");
ctrl_checkbox(s, "Enable X11 forwarding", 'e',
HELPCTX(ssh_tunnels_x11),
dlg_stdcheckbox_handler,I(offsetof(Config,x11_forward)));
@ -1688,6 +1729,12 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
"XDM-Authorization-1", I(X11_XDM), NULL);
}
/*
* The Tunnels panel _is_ still available in mid-session.
*/
ctrl_settitle(b, "Connection/SSH/Tunnels",
"Options controlling SSH port forwarding");
s = ctrl_getset(b, "Connection/SSH/Tunnels", "portfwd",
"Port forwarding");
ctrl_checkbox(s, "Local ports accept connections from other hosts",'t',
@ -1741,6 +1788,21 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
"Remote", 'm', P(NULL),
"Dynamic", 'y', P(NULL),
NULL);
pfd->addressfamily =
ctrl_radiobuttons(s, NULL, NO_SHORTCUT,
#ifndef NO_IPV6
3,
#else
2,
#endif
HELPCTX(ssh_tunnels_portfwd_ipversion),
portfwd_handler, P(pfd),
"Auto", NO_SHORTCUT, I(ADDRTYPE_UNSPEC),
"IPv4", NO_SHORTCUT, I(ADDRTYPE_IPV4),
#ifndef NO_IPV6
"IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6),
#endif
NULL);
ctrl_tabdelay(s, pfd->addbutton);
ctrl_columns(s, 1, 100);