2 * Unix PuTTY main program.
16 * - Arrange for the window title not to be `pterm'.
18 * - Fix command-line parsing to be more PuTTYlike and not so
19 * ptermy - in particular non-option arguments should be
20 * hostname and port in the obvious way.
22 * - Session loading and saving; current thinking says the best
23 * way is to have a subdir .putty/sessions containing files
24 * whose names are actually munged saved session names.
26 * - libcharset enumeration.
28 * - fix the printer enum (I think the sensible thing is simply to
29 * have uxcfg.c remove the drop-down list completely, since you
30 * can't sensibly provide an enumerated list of lpr commands!).
32 * - Ctrl+right-click for a context menu (also in Windows for
33 * consistency, I think). This should contain pretty much
34 * everything in the Windows PuTTY menu, and a subset of that in
37 * - Telnet special commands (not in pterm :-)
39 * - Event Log (this means we must implement the Event Log; not
42 * - New Session and Duplicate Session (perhaps in pterm, in fact?!)
43 * + Duplicate Session will be fun, since we must work out
44 * how to pass the config data through.
45 * + In fact this should be easier on Unix, since fork() is
46 * available so we need not even exec (this also saves us
47 * the trouble of scrabbling around trying to find our own
48 * binary). Possible scenario: respond to Duplicate
49 * Session by forking. Parent continues as before; child
50 * unceremoniously frees all extant resources (backend,
51 * terminal, ldisc, frontend etc) and then _longjmps_ (I
52 * kid you not) back to a point in pt_main() which causes
53 * it to go back round to the point of opening a new
54 * terminal window and a new backend.
55 * + A tricky bit here is how to free everything without
56 * also _destroying_ things - calling GTK to free up
57 * existing widgets is liable to send destroy messages to
58 * the X server, which won't go down too well with the
59 * parent process. exec() is a much cleaner solution to
60 * this bit, but requires us to invent some ghastly IPC as
61 * we did in Windows PuTTY.
62 * + Arrgh! Also, this won't work in pterm since we'll
63 * already have dropped privileges by this point, so we
64 * can't get another pty. Sigh. Looks like exec has to be
65 * the way forward then :-/
67 * - Saved Sessions submenu (not in pterm of course)
70 * + we must also implement mid-session reconfig in pterm.c.
71 * + note this also requires config.c and uxcfg.c to be able
72 * to get hold of the application name.
74 * - Copy All to Clipboard (for what that's worth)
76 * - Clear Scrollback and Reset Terminal
78 * - About (and uxcfg.c must also supply the about box)
81 void cmdline_error(char *p
, ...)
84 fprintf(stderr
, "plink: ");
86 vfprintf(stderr
, p
, ap
);
95 void cleanup_exit(int code
)
106 * Another bunch of temporary stub functions. These ones will want
107 * removing by means of implementing them properly: libcharset
108 * should invent its own sensible format for codepage names and a
109 * means of enumerating them, and printer_enum needs to be dealt
110 * with somehow or other too.
113 char *cp_name(int codepage
)
117 char *cp_enumerate(int index
)
121 int decode_codepage(char *cp_name
)
126 printer_enum
*printer_start_enum(int *nprinters_ptr
) {
130 char *printer_get_name(printer_enum
*pe
, int i
) { return NULL
;
132 void printer_finish_enum(printer_enum
*pe
) { }
134 Backend
*select_backend(Config
*cfg
)
137 Backend
*back
= NULL
;
138 for (i
= 0; backends
[i
].backend
!= NULL
; i
++)
139 if (backends
[i
].protocol
== cfg
->protocol
) {
140 back
= backends
[i
].backend
;
143 assert(back
!= NULL
);
147 int cfgbox(Config
*cfg
)
149 extern int do_config_box(const char *title
, Config
*cfg
);
150 return do_config_box("PuTTY Configuration", cfg
);
153 int main(int argc
, char **argv
)
155 extern int pt_main(int argc
, char **argv
);
157 flags
= FLAG_VERBOSE
| FLAG_INTERACTIVE
;
158 default_protocol
= be_default_protocol
;
159 /* Find the appropriate default port. */
162 default_port
= 0; /* illegal */
163 for (i
= 0; backends
[i
].backend
!= NULL
; i
++)
164 if (backends
[i
].protocol
== default_protocol
) {
165 default_port
= backends
[i
].backend
->default_port
;
169 return pt_main(argc
, argv
);