1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 09:27:59 +00:00

Rationalise access to, and content of, backends[] array.

Should be no significant change in behaviour.
(Well, entering usernames containing commas on Plink's command line will be
a little harder now.)

[originally from svn r7628]
This commit is contained in:
Jacob Nevins 2007-06-30 21:56:44 +00:00
parent 90e7bf4228
commit 46c00b0f38
23 changed files with 132 additions and 177 deletions

View File

@ -22,10 +22,10 @@ const int be_default_protocol = PROT_TELNET;
const int be_default_protocol = PROT_SSH;
#endif
struct backend_list backends[] = {
{PROT_SSH, "ssh", &ssh_backend},
{PROT_TELNET, "telnet", &telnet_backend},
{PROT_RLOGIN, "rlogin", &rlogin_backend},
{PROT_RAW, "raw", &raw_backend},
{0, NULL}
Backend *backends[] = {
&ssh_backend,
&telnet_backend,
&rlogin_backend,
&raw_backend,
NULL
};

View File

@ -22,11 +22,11 @@ const int be_default_protocol = PROT_TELNET;
const int be_default_protocol = PROT_SSH;
#endif
struct backend_list backends[] = {
{PROT_SSH, "ssh", &ssh_backend},
{PROT_TELNET, "telnet", &telnet_backend},
{PROT_RLOGIN, "rlogin", &rlogin_backend},
{PROT_RAW, "raw", &raw_backend},
{PROT_SERIAL, "serial", &serial_backend},
{0, NULL}
Backend *backends[] = {
&ssh_backend,
&telnet_backend,
&rlogin_backend,
&raw_backend,
&serial_backend,
NULL
};

View File

@ -1,16 +1,11 @@
/*
* Linking module for PSCP: list the available backends, but
* without accompanying function suites. Used only for name
* lookups.
* Linking module for programs that do not support selection of backend
* (such as pscp or pterm).
*/
#include <stdio.h>
#include "putty.h"
struct backend_list backends[] = {
{PROT_SSH, "ssh", NULL},
{PROT_TELNET, "telnet", NULL},
{PROT_RLOGIN, "rlogin", NULL},
{PROT_RAW, "raw", NULL},
{0, NULL}
Backend *backends[] = {
NULL
};

View File

@ -10,12 +10,12 @@ const int be_default_protocol = PROT_TELNET;
const char *const appname = "PuTTYtel";
struct backend_list backends[] = {
{PROT_TELNET, "telnet", &telnet_backend},
{PROT_RLOGIN, "rlogin", &rlogin_backend},
{PROT_RAW, "raw", &raw_backend},
{PROT_SERIAL, "serial", &serial_backend},
{0, NULL}
Backend *backends[] = {
&telnet_backend,
&rlogin_backend,
&raw_backend,
&serial_backend,
NULL
};
/*

View File

@ -10,11 +10,11 @@ const int be_default_protocol = PROT_TELNET;
const char *const appname = "PuTTYtel";
struct backend_list backends[] = {
{PROT_TELNET, "telnet", &telnet_backend},
{PROT_RLOGIN, "rlogin", &rlogin_backend},
{PROT_RAW, "raw", &raw_backend},
{0, NULL}
Backend *backends[] = {
&telnet_backend,
&rlogin_backend,
&raw_backend,
NULL
};
/*

View File

@ -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)
{
@ -1166,7 +1152,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),
@ -1257,7 +1243,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 {
@ -1293,7 +1279,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',
@ -1912,7 +1898,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.

View File

@ -210,13 +210,10 @@ static void mac_startup(void) {
default_protocol = be_default_protocol;
/* Find the appropriate default port. */
{
int i;
Backend *b = backend_from_proto(default_protocol);
default_port = 0; /* illegal */
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == default_protocol) {
default_port = backends[i].backend->default_port;
break;
}
if (b)
default_port = b->default_port;
}
flags = FLAG_INTERACTIVE;

View File

@ -115,12 +115,7 @@ void mac_startsession(Session *s)
* Select protocol. This is farmed out into a table in a
* separate file to enable an ssh-free variant.
*/
s->back = NULL;
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == s->cfg.protocol) {
s->back = backends[i].backend;
break;
}
s->back = backend_from_proto(s->cfg.protocol);
if (s->back == NULL)
fatalbox("Unsupported protocol number found");

View File

@ -232,15 +232,9 @@
/*
* Set up a backend.
*/
{
int i;
back = backend_from_proto(cfg.protocol);
if (!back)
back = &pty_backend;
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == cfg.protocol) {
back = backends[i].backend;
break;
}
}
{
const char *error;

10
putty.h
View File

@ -389,14 +389,12 @@ struct backend_tag {
*/
void (*unthrottle) (void *handle, int);
int (*cfg_info) (void *handle);
char *name;
int protocol;
int default_port;
};
extern struct backend_list {
int protocol;
char *name;
Backend *backend;
} backends[];
extern Backend *backends[];
/*
* Suggested default protocol provided by the backend link module.
@ -778,6 +776,8 @@ void random_destroy_seed(void);
/*
* Exports from settings.c.
*/
Backend *backend_from_name(const char *name);
Backend *backend_from_proto(int proto);
char *save_settings(char *section, Config * cfg);
void save_open_settings(void *sesskey, Config *cfg);
void load_settings(char *section, Config * cfg);

2
raw.c
View File

@ -278,5 +278,7 @@ Backend raw_backend = {
raw_provide_logctx,
raw_unthrottle,
raw_cfg_info,
"raw",
PROT_RAW,
1
};

View File

@ -349,5 +349,7 @@ Backend rlogin_backend = {
rlogin_provide_logctx,
rlogin_unthrottle,
rlogin_cfg_info,
"rlogin",
PROT_RLOGIN,
1
};

View File

@ -52,6 +52,29 @@ const char *const ttymodes[] = {
"CS8", "PARENB", "PARODD", NULL
};
/*
* Convenience functions to access the backends[] array
* (which is only present in tools that manage settings).
*/
Backend *backend_from_name(const char *name)
{
Backend **p;
for (p = backends; *p != NULL; p++)
if (!strcmp((*p)->name, name))
return *p;
return NULL;
}
Backend *backend_from_proto(int proto)
{
Backend **p;
for (p = backends; *p != NULL; p++)
if ((*p)->protocol == proto)
return *p;
return NULL;
}
static void gpps(void *handle, const char *name, const char *def,
char *val, int len)
{
@ -259,11 +282,11 @@ void save_open_settings(void *sesskey, Config *cfg)
write_setting_i(sesskey, "SSHLogOmitPasswords", cfg->logomitpass);
write_setting_i(sesskey, "SSHLogOmitData", cfg->logomitdata);
p = "raw";
for (i = 0; backends[i].name != NULL; i++)
if (backends[i].protocol == cfg->protocol) {
p = backends[i].name;
break;
}
{
const Backend *b = backend_from_proto(cfg->protocol);
if (b)
p = b->name;
}
write_setting_s(sesskey, "Protocol", p);
write_setting_i(sesskey, "PortNumber", cfg->port);
/* The CloseOnExit numbers are arranged in a different order from
@ -476,12 +499,13 @@ void load_open_settings(void *sesskey, Config *cfg)
gpps(sesskey, "Protocol", "default", prot, 10);
cfg->protocol = default_protocol;
cfg->port = default_port;
for (i = 0; backends[i].name != NULL; i++)
if (!strcmp(prot, backends[i].name)) {
cfg->protocol = backends[i].protocol;
{
const Backend *b = backend_from_name(prot);
if (b) {
cfg->protocol = b->protocol;
gppi(sesskey, "PortNumber", default_port, &cfg->port);
break;
}
}
/* Address family selection */
gppi(sesskey, "AddressFamily", ADDRTYPE_UNSPEC, &cfg->addressfamily);

2
ssh.c
View File

@ -9146,5 +9146,7 @@ Backend ssh_backend = {
ssh_provide_logctx,
ssh_unthrottle,
ssh_cfg_info,
"ssh",
PROT_SSH,
22
};

View File

@ -1106,5 +1106,7 @@ Backend telnet_backend = {
telnet_provide_logctx,
telnet_unthrottle,
telnet_cfg_info,
"telnet",
PROT_TELNET,
23
};

View File

@ -59,14 +59,14 @@ Backend null_backend = {
null_init, null_free, null_reconfig, null_send, null_sendbuffer, null_size,
null_special, null_get_specials, null_connected, null_exitcode, null_sendok,
null_ldisc, null_provide_ldisc, null_provide_logctx, null_unthrottle,
null_cfg_info, 0
null_cfg_info, "null", -1, 0
};
Backend loop_backend = {
loop_init, loop_free, null_reconfig, loop_send, null_sendbuffer, null_size,
null_special, null_get_specials, null_connected, null_exitcode, null_sendok,
null_ldisc, null_provide_ldisc, null_provide_logctx, null_unthrottle,
null_cfg_info, 0
null_cfg_info, "loop", -1, 0
};
struct loop_state {

View File

@ -596,15 +596,11 @@ int main(int argc, char **argv)
* Override the default protocol if PLINK_PROTOCOL is set.
*/
char *p = getenv("PLINK_PROTOCOL");
int i;
if (p) {
for (i = 0; backends[i].backend != NULL; i++) {
if (!strcmp(backends[i].name, p)) {
default_protocol = cfg.protocol = backends[i].protocol;
default_port = cfg.port =
backends[i].backend->default_port;
break;
}
const Backend *b = backend_from_name(p);
if (b) {
default_protocol = cfg.protocol = b->protocol;
default_port = cfg.port = b->default_port;
}
}
}
@ -681,19 +677,14 @@ int main(int argc, char **argv)
*/
r = strchr(p, ',');
if (r) {
int i, j;
for (i = 0; backends[i].backend != NULL; i++) {
j = strlen(backends[i].name);
if (j == r - p &&
!memcmp(backends[i].name, p, j)) {
default_protocol = cfg.protocol =
backends[i].protocol;
portnumber =
backends[i].backend->default_port;
p = r + 1;
break;
}
const Backend *b;
*r = '\0';
b = backend_from_name(p);
if (b) {
default_protocol = cfg.protocol = b->protocol;
portnumber = b->default_port;
}
p = r + 1;
}
/*
@ -836,19 +827,11 @@ int main(int argc, char **argv)
* Select protocol. This is farmed out into a table in a
* separate file to enable an ssh-free variant.
*/
{
int i;
back = NULL;
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == cfg.protocol) {
back = backends[i].backend;
break;
}
if (back == NULL) {
fprintf(stderr,
"Internal fault: Unsupported protocol found\n");
return 1;
}
back = backend_from_proto(cfg.protocol);
if (back == NULL) {
fprintf(stderr,
"Internal fault: Unsupported protocol found\n");
return 1;
}
/*

View File

@ -1085,5 +1085,7 @@ Backend pty_backend = {
pty_provide_logctx,
pty_unthrottle,
pty_cfg_info,
"pty",
-1,
1
};

View File

@ -33,13 +33,7 @@ void cleanup_exit(int code)
Backend *select_backend(Config *cfg)
{
int i;
Backend *back = NULL;
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == cfg->protocol) {
back = backends[i].backend;
break;
}
Backend *back = backend_from_proto(cfg->protocol);
assert(back != NULL);
return back;
}
@ -137,13 +131,10 @@ int main(int argc, char **argv)
default_protocol = be_default_protocol;
/* Find the appropriate default port. */
{
int i;
Backend *b = backend_from_proto(default_protocol);
default_port = 0; /* illegal */
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == default_protocol) {
default_port = backends[i].backend->default_port;
break;
}
if (b)
default_port = b->default_port;
}
return pt_main(argc, argv);
}

View File

@ -536,5 +536,7 @@ Backend serial_backend = {
serial_provide_logctx,
serial_unthrottle,
serial_cfg_info,
"serial",
PROT_SERIAL,
1
};

View File

@ -219,12 +219,7 @@ static void start_backend(void)
* Select protocol. This is farmed out into a table in a
* separate file to enable an ssh-free variant.
*/
back = NULL;
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == cfg.protocol) {
back = backends[i].backend;
break;
}
back = backend_from_proto(cfg.protocol);
if (back == NULL) {
char *str = dupprintf("%s Internal Error", appname);
MessageBox(NULL, "Unsupported protocol number found",
@ -369,13 +364,10 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
default_protocol = be_default_protocol;
/* Find the appropriate default port. */
{
int i;
Backend *b = backend_from_proto(default_protocol);
default_port = 0; /* illegal */
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == default_protocol) {
default_port = backends[i].backend->default_port;
break;
}
if (b)
default_port = b->default_port;
}
cfg.logtype = LGTYP_NONE;

View File

@ -307,13 +307,10 @@ int main(int argc, char **argv)
char *p = getenv("PLINK_PROTOCOL");
int i;
if (p) {
for (i = 0; backends[i].backend != NULL; i++) {
if (!strcmp(backends[i].name, p)) {
default_protocol = cfg.protocol = backends[i].protocol;
default_port = cfg.port =
backends[i].backend->default_port;
break;
}
const Backend *b = backend_from_name(p);
if (b) {
default_protocol = cfg.protocol = b->protocol;
default_port = cfg.port = b->default_port;
}
}
}
@ -380,19 +377,14 @@ int main(int argc, char **argv)
*/
r = strchr(p, ',');
if (r) {
int i, j;
for (i = 0; backends[i].backend != NULL; i++) {
j = strlen(backends[i].name);
if (j == r - p &&
!memcmp(backends[i].name, p, j)) {
default_protocol = cfg.protocol =
backends[i].protocol;
portnumber =
backends[i].backend->default_port;
p = r + 1;
break;
}
const Backend *b;
*r = '\0';
b = backend_from_name(p);
if (b) {
default_protocol = cfg.protocol = b->protocol;
portnumber = b->default_port;
}
p = r + 1;
}
/*
@ -535,19 +527,11 @@ int main(int argc, char **argv)
* Select protocol. This is farmed out into a table in a
* separate file to enable an ssh-free variant.
*/
{
int i;
back = NULL;
for (i = 0; backends[i].backend != NULL; i++)
if (backends[i].protocol == cfg.protocol) {
back = backends[i].backend;
break;
}
if (back == NULL) {
fprintf(stderr,
"Internal fault: Unsupported protocol found\n");
return 1;
}
back = backend_from_proto(cfg.protocol);
if (back == NULL) {
fprintf(stderr,
"Internal fault: Unsupported protocol found\n");
return 1;
}
/*

View File

@ -454,5 +454,7 @@ Backend serial_backend = {
serial_provide_logctx,
serial_unthrottle,
serial_cfg_info,
"serial",
PROT_SERIAL,
1
};