diff options
Diffstat (limited to 'be_list.c')
-rw-r--r-- | be_list.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/be_list.c b/be_list.c new file mode 100644 index 00000000..09437a69 --- /dev/null +++ b/be_list.c @@ -0,0 +1,118 @@ +/* + * Source file that is rebuilt per application, and provides the list + * of backends, the default protocol, and the application name. + * + * This file expects the build system to provide some per-application + * definitions on the compiler command line. So you don't just add it + * directly to the sources list for an application. Instead you call + * the be_list() function defined in setup.cmake, e.g. + * + * be_list(target-name AppName [SSH] [SERIAL] [OTHERBACKENDS]) + * + * This translates into the following command-line macro definitions + * used by the code below: + * + * - APPNAME should be defined to the name of the program, in + * user-facing capitalisation (e.g. PuTTY rather than putty). + * Unquoted: it's easier to stringify it in the preprocessor than + * to persuade cmake to put the right quotes on the command line on + * all build platforms. + * + * - The following macros should each be defined to 1 if a given set + * of backends should be added to the backends[] list, or 0 if they + * should not be: + * + * * SSH: the two SSH backends (SSH proper, and bare-ssh-connection) + * + * * SERIAL: the serial port backend + * + * * OTHERBACKENDS: the non-cryptographic network protocol backends + * (Telnet, Rlogin, SUPDUP, Raw) + */ + +#include <stdio.h> +#include "putty.h" + +const char *const appname = STR(APPNAME); + +/* + * Define the default protocol for the application. This is always a + * network backend (serial ports come second behind network, in every + * case). Applications that don't have either (such as pterm) don't + * need this variable anyway, so just set it to -1. + */ +#if SSH +const int be_default_protocol = PROT_SSH; +#elif OTHERBACKENDS +const int be_default_protocol = PROT_TELNET; +#else +const int be_default_protocol = -1; +#endif + +/* + * List all the configured backends, in the order they should appear + * in the config box. + */ +const struct BackendVtable *const backends[] = { + /* + * Start with the most-preferred network-remote-login protocol. + * That's SSH if present, otherwise Telnet if present. + */ +#if SSH + &ssh_backend, +#elif OTHERBACKENDS + &telnet_backend, /* Telnet at the top if SSH is absent */ +#endif + + /* + * Second on the list is the serial-port backend, if available. + */ +#if SERIAL + &serial_backend, +#endif + + /* + * After that come the remaining network protocols: Telnet if it + * hasn't already appeared above, and Rlogin, SUPDUP and Raw. + */ +#if OTHERBACKENDS && SSH + &telnet_backend, /* only if SSH displaced it at the top */ +#endif +#if OTHERBACKENDS + &rlogin_backend, + &supdup_backend, + &raw_backend, +#endif + + /* + * Bare ssh-connection / PSUSAN is a niche protocol and goes well + * down the list. + */ +#if SSH + &sshconn_backend, +#endif + + /* + * Done. Null pointer to mark the end of the list. + */ + NULL +}; + +/* + * Number of backends at the start of the above list that should have + * radio buttons in the config UI. + * + * The rule is: the most-preferred network backend, and Serial, each + * get a radio button if present. + * + * The rest will be relegated to a dropdown list. + */ +const size_t n_ui_backends = + 0 +#if SSH || OTHERBACKENDS + + 1 +#endif +#if SERIAL + + 1 +#endif + ; |