From 9e164d82c8990d3c8cff58d866fb9938907d4d7b Mon Sep 17 00:00:00 2001 From: jacob Date: Sat, 30 Jun 2007 21:56:44 +0000 Subject: [PATCH] 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 --- be_all.c | 12 ++++++------ be_all_s.c | 14 +++++++------- be_none.c | 13 ++++--------- be_nos_s.c | 12 ++++++------ be_nossh.c | 10 +++++----- config.c | 22 ++++------------------ mac/mac.c | 9 +++------ mac/macterm.c | 7 +------ macosx/osxwin.m | 10 ++-------- putty.h | 10 +++++----- raw.c | 2 ++ rlogin.c | 2 ++ settings.c | 42 +++++++++++++++++++++++++++++++++--------- ssh.c | 2 ++ telnet.c | 2 ++ testback.c | 4 ++-- unix/uxplink.c | 49 ++++++++++++++++--------------------------------- unix/uxpty.c | 2 ++ unix/uxputty.c | 17 ++++------------- unix/uxser.c | 2 ++ windows/window.c | 16 ++++------------ windows/winplink.c | 48 ++++++++++++++++-------------------------------- windows/winser.c | 2 ++ 23 files changed, 132 insertions(+), 177 deletions(-) diff --git a/be_all.c b/be_all.c index 024a39e9..c58903cc 100644 --- a/be_all.c +++ b/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 }; diff --git a/be_all_s.c b/be_all_s.c index 4b3c1983..0ffd0737 100644 --- a/be_all_s.c +++ b/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 }; diff --git a/be_none.c b/be_none.c index 879a20c5..6ec037ac 100644 --- a/be_none.c +++ b/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 #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 }; diff --git a/be_nos_s.c b/be_nos_s.c index ea8cf144..a574ead9 100644 --- a/be_nos_s.c +++ b/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 }; /* diff --git a/be_nossh.c b/be_nossh.c index 18ba32a7..33d783a8 100644 --- a/be_nossh.c +++ b/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 }; /* diff --git a/config.c b/config.c index 41bb4943..39740b8d 100644 --- a/config.c +++ b/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. diff --git a/mac/mac.c b/mac/mac.c index 9e1d1f30..25362061 100644 --- a/mac/mac.c +++ b/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; diff --git a/mac/macterm.c b/mac/macterm.c index dad26883..4a75a0c6 100644 --- a/mac/macterm.c +++ b/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"); diff --git a/macosx/osxwin.m b/macosx/osxwin.m index 361f548f..f61e6bff 100644 --- a/macosx/osxwin.m +++ b/macosx/osxwin.m @@ -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; diff --git a/putty.h b/putty.h index 3583ecf0..30b23bf5 100644 --- a/putty.h +++ b/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); diff --git a/raw.c b/raw.c index d64b6d7f..49ca1ce2 100644 --- a/raw.c +++ b/raw.c @@ -278,5 +278,7 @@ Backend raw_backend = { raw_provide_logctx, raw_unthrottle, raw_cfg_info, + "raw", + PROT_RAW, 1 }; diff --git a/rlogin.c b/rlogin.c index 833d4ea4..f9a546e9 100644 --- a/rlogin.c +++ b/rlogin.c @@ -349,5 +349,7 @@ Backend rlogin_backend = { rlogin_provide_logctx, rlogin_unthrottle, rlogin_cfg_info, + "rlogin", + PROT_RLOGIN, 1 }; diff --git a/settings.c b/settings.c index c937d3c9..44b02cba 100644 --- a/settings.c +++ b/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); diff --git a/ssh.c b/ssh.c index 5196b1b3..e5d2364d 100644 --- a/ssh.c +++ b/ssh.c @@ -9146,5 +9146,7 @@ Backend ssh_backend = { ssh_provide_logctx, ssh_unthrottle, ssh_cfg_info, + "ssh", + PROT_SSH, 22 }; diff --git a/telnet.c b/telnet.c index e6ad83e0..eeaa76f3 100644 --- a/telnet.c +++ b/telnet.c @@ -1106,5 +1106,7 @@ Backend telnet_backend = { telnet_provide_logctx, telnet_unthrottle, telnet_cfg_info, + "telnet", + PROT_TELNET, 23 }; diff --git a/testback.c b/testback.c index 159cdc54..0175e8e7 100644 --- a/testback.c +++ b/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 { diff --git a/unix/uxplink.c b/unix/uxplink.c index e9c6c9e6..6b56d2af 100644 --- a/unix/uxplink.c +++ b/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; } /* diff --git a/unix/uxpty.c b/unix/uxpty.c index 708e82d6..2e165cf2 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -1085,5 +1085,7 @@ Backend pty_backend = { pty_provide_logctx, pty_unthrottle, pty_cfg_info, + "pty", + -1, 1 }; diff --git a/unix/uxputty.c b/unix/uxputty.c index 54e0d71b..f42c428d 100644 --- a/unix/uxputty.c +++ b/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); } diff --git a/unix/uxser.c b/unix/uxser.c index 24b0124c..a12fdec7 100644 --- a/unix/uxser.c +++ b/unix/uxser.c @@ -536,5 +536,7 @@ Backend serial_backend = { serial_provide_logctx, serial_unthrottle, serial_cfg_info, + "serial", + PROT_SERIAL, 1 }; diff --git a/windows/window.c b/windows/window.c index 1df5feeb..1d4b7152 100644 --- a/windows/window.c +++ b/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; diff --git a/windows/winplink.c b/windows/winplink.c index 42426000..60232ffe 100644 --- a/windows/winplink.c +++ b/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; } /* diff --git a/windows/winser.c b/windows/winser.c index 9e6415e3..1188c46a 100644 --- a/windows/winser.c +++ b/windows/winser.c @@ -454,5 +454,7 @@ Backend serial_backend = { serial_provide_logctx, serial_unthrottle, serial_cfg_info, + "serial", + PROT_SERIAL, 1 }; -- 2.11.0