1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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
;
|