Skip to content
Browse files

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.)


git-svn-id: svn://svn.tartarus.org/sgt/putty@7628 cda61777-01e9-0310-a592-d414129be87e
  • Loading branch information...
1 parent 7108a87 commit 9e164d82c8990d3c8cff58d866fb9938907d4d7b jacob committed Jun 30, 2007
Showing with 132 additions and 177 deletions.
  1. +6 −6 be_all.c
  2. +7 −7 be_all_s.c
  3. +4 −9 be_none.c
  4. +6 −6 be_nos_s.c
  5. +5 −5 be_nossh.c
  6. +4 −18 config.c
  7. +3 −6 mac/mac.c
  8. +1 −6 mac/macterm.c
  9. +2 −8 macosx/osxwin.m
  10. +5 −5 putty.h
  11. +2 −0 raw.c
  12. +2 −0 rlogin.c
  13. +33 −9 settings.c
  14. +2 −0 ssh.c
  15. +2 −0 telnet.c
  16. +2 −2 testback.c
  17. +16 −33 unix/uxplink.c
  18. +2 −0 unix/uxpty.c
  19. +4 −13 unix/uxputty.c
  20. +2 −0 unix/uxser.c
  21. +4 −12 windows/window.c
  22. +16 −32 windows/winplink.c
  23. +2 −0 windows/winser.c
View
12 be_all.c
@@ -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
14 be_all_s.c
@@ -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
13 be_none.c
@@ -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
12 be_nos_s.c
@@ -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
10 be_nossh.c
@@ -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
22 config.c
@@ -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
9 mac/mac.c
@@ -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
7 mac/macterm.c
@@ -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
10 macosx/osxwin.m
@@ -232,15 +232,9 @@ - (id)initWithConfig:(Config)aCfg
/*
* 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;
View
10 putty.h
@@ -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);
View
2 raw.c
@@ -278,5 +278,7 @@ Backend raw_backend = {
raw_provide_logctx,
raw_unthrottle,
raw_cfg_info,
+ "raw",
+ PROT_RAW,
1
};
View
2 rlogin.c
@@ -349,5 +349,7 @@ Backend rlogin_backend = {
rlogin_provide_logctx,
rlogin_unthrottle,
rlogin_cfg_info,
+ "rlogin",
+ PROT_RLOGIN,
1
};
View
42 settings.c
@@ -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);
View
2 ssh.c
@@ -9146,5 +9146,7 @@ Backend ssh_backend = {
ssh_provide_logctx,
ssh_unthrottle,
ssh_cfg_info,
+ "ssh",
+ PROT_SSH,
22
};
View
2 telnet.c
@@ -1106,5 +1106,7 @@ Backend telnet_backend = {
telnet_provide_logctx,
telnet_unthrottle,
telnet_cfg_info,
+ "telnet",
+ PROT_TELNET,
23
};
View
4 testback.c
@@ -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
49 unix/uxplink.c
@@ -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
2 unix/uxpty.c
@@ -1085,5 +1085,7 @@ Backend pty_backend = {
pty_provide_logctx,
pty_unthrottle,
pty_cfg_info,
+ "pty",
+ -1,
1
};
View
17 unix/uxputty.c
@@ -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
2 unix/uxser.c
@@ -536,5 +536,7 @@ Backend serial_backend = {
serial_provide_logctx,
serial_unthrottle,
serial_cfg_info,
+ "serial",
+ PROT_SERIAL,
1
};
View
16 windows/window.c
@@ -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
48 windows/winplink.c
@@ -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
2 windows/winser.c
@@ -454,5 +454,7 @@ Backend serial_backend = {
serial_provide_logctx,
serial_unthrottle,
serial_cfg_info,
+ "serial",
+ PROT_SERIAL,
1
};

0 comments on commit 9e164d8

Please sign in to comment.
Something went wrong with that request. Please try again.