Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mRemoteNG/PuTTYNG.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'windows/putty.c')
-rw-r--r--windows/putty.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/windows/putty.c b/windows/putty.c
new file mode 100644
index 00000000..3c41b557
--- /dev/null
+++ b/windows/putty.c
@@ -0,0 +1,203 @@
+#include "putty.h"
+#include "storage.h"
+
+extern bool sesslist_demo_mode;
+extern const char *dialog_box_demo_screenshot_filename;
+static strbuf *demo_terminal_data = NULL;
+static const char *terminal_demo_screenshot_filename;
+
+const unsigned cmdline_tooltype =
+ TOOLTYPE_HOST_ARG |
+ TOOLTYPE_PORT_ARG |
+ TOOLTYPE_NO_VERBOSE_OPTION;
+
+void gui_term_process_cmdline(Conf *conf, char *cmdline)
+{
+ char *p;
+ bool special_launchable_argument = false;
+ bool demo_config_box = false;
+
+ settings_set_default_protocol(be_default_protocol);
+ /* Find the appropriate default port. */
+ {
+ const struct BackendVtable *vt =
+ backend_vt_from_proto(be_default_protocol);
+ settings_set_default_port(0); /* illegal */
+ if (vt)
+ settings_set_default_port(vt->default_port);
+ }
+ conf_set_int(conf, CONF_logtype, LGTYP_NONE);
+
+ do_defaults(NULL, conf);
+
+ p = handle_restrict_acl_cmdline_prefix(cmdline);
+
+ if (handle_special_sessionname_cmdline(p, conf)) {
+ if (!conf_launchable(conf) && !do_config(conf)) {
+ cleanup_exit(0);
+ }
+ special_launchable_argument = true;
+ } else if (handle_special_filemapping_cmdline(p, conf)) {
+ special_launchable_argument = true;
+ } else if (!*p) {
+ /* Do-nothing case for an empty command line - or rather,
+ * for a command line that's empty _after_ we strip off
+ * the &R prefix. */
+ } else {
+ /*
+ * Otherwise, break up the command line and deal with
+ * it sensibly.
+ */
+ int argc, i;
+ char **argv;
+
+ split_into_argv(cmdline, &argc, &argv, NULL);
+
+ for (i = 0; i < argc; i++) {
+ char *p = argv[i];
+ int ret;
+
+ ret = cmdline_process_param(p, i+1<argc?argv[i+1]:NULL,
+ 1, conf);
+ if (ret == -2) {
+ cmdline_error("option \"%s\" requires an argument", p);
+ } else if (ret == 2) {
+ i++; /* skip next argument */
+ } else if (ret == 1) {
+ continue; /* nothing further needs doing */
+ } else if (!strcmp(p, "-cleanup")) {
+ /*
+ * `putty -cleanup'. Remove all registry
+ * entries associated with PuTTY, and also find
+ * and delete the random seed file.
+ */
+ char *s1, *s2;
+ s1 = dupprintf("This procedure will remove ALL Registry entries\n"
+ "associated with %s, and will also remove\n"
+ "the random seed file. (This only affects the\n"
+ "currently logged-in user.)\n"
+ "\n"
+ "THIS PROCESS WILL DESTROY YOUR SAVED SESSIONS.\n"
+ "Are you really sure you want to continue?",
+ appname);
+ s2 = dupprintf("%s Warning", appname);
+ if (message_box(NULL, s1, s2,
+ MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2,
+ HELPCTXID(option_cleanup)) == IDYES) {
+ cleanup_all();
+ }
+ sfree(s1);
+ sfree(s2);
+ exit(0);
+ } else if (!strcmp(p, "-pgpfp")) {
+ pgp_fingerprints_msgbox(NULL);
+ exit(1);
+ } else if (has_ca_config_box &&
+ (!strcmp(p, "-host-ca") || !strcmp(p, "--host-ca") ||
+ !strcmp(p, "-host_ca") || !strcmp(p, "--host_ca"))) {
+ show_ca_config_box(NULL);
+ exit(0);
+ } else if (!strcmp(p, "-demo-config-box")) {
+ if (i+1 >= argc) {
+ cmdline_error("%s expects an output filename", p);
+ } else {
+ demo_config_box = true;
+ dialog_box_demo_screenshot_filename = argv[++i];
+ }
+ } else if (!strcmp(p, "-demo-terminal")) {
+ if (i+2 >= argc) {
+ cmdline_error("%s expects input and output filenames", p);
+ } else {
+ const char *infile = argv[++i];
+ terminal_demo_screenshot_filename = argv[++i];
+ FILE *fp = fopen(infile, "rb");
+ if (!fp)
+ cmdline_error("can't open input file '%s'", infile);
+ demo_terminal_data = strbuf_new();
+ char buf[4096];
+ int retd;
+ while ((retd = fread(buf, 1, sizeof(buf), fp)) > 0)
+ put_data(demo_terminal_data, buf, retd);
+ fclose(fp);
+ }
+ } else if (*p != '-') {
+ cmdline_error("unexpected argument \"%s\"", p);
+ } else {
+ cmdline_error("unknown option \"%s\"", p);
+ }
+ }
+ }
+
+ cmdline_run_saved(conf);
+
+ if (demo_config_box) {
+ sesslist_demo_mode = true;
+ load_open_settings(NULL, conf);
+ conf_set_str(conf, CONF_host, "demo-server.example.com");
+ do_config(conf);
+ cleanup_exit(0);
+ } else if (demo_terminal_data) {
+ /* Ensure conf will cause an immediate session launch */
+ load_open_settings(NULL, conf);
+ conf_set_str(conf, CONF_host, "demo-server.example.com");
+ conf_set_int(conf, CONF_close_on_exit, FORCE_OFF);
+ } else {
+ /*
+ * Bring up the config dialog if the command line hasn't
+ * (explicitly) specified a launchable configuration.
+ */
+ if (!(special_launchable_argument || cmdline_host_ok(conf))) {
+ if (!do_config(conf))
+ cleanup_exit(0);
+ }
+ }
+
+ prepare_session(conf);
+}
+
+const struct BackendVtable *backend_vt_from_conf(Conf *conf)
+{
+ if (demo_terminal_data) {
+ return &null_backend;
+ }
+
+ /*
+ * Select protocol. This is farmed out into a table in a
+ * separate file to enable an ssh-free variant.
+ */
+ const struct BackendVtable *vt = backend_vt_from_proto(
+ conf_get_int(conf, CONF_protocol));
+ if (!vt) {
+ char *str = dupprintf("%s Internal Error", appname);
+ MessageBox(NULL, "Unsupported protocol number found",
+ str, MB_OK | MB_ICONEXCLAMATION);
+ sfree(str);
+ cleanup_exit(1);
+ }
+ return vt;
+}
+
+const wchar_t *get_app_user_model_id(void)
+{
+ return L"SimonTatham.PuTTY";
+}
+
+static void demo_terminal_screenshot(void *ctx, unsigned long now)
+{
+ HWND hwnd = (HWND)ctx;
+ char *err = save_screenshot(hwnd, terminal_demo_screenshot_filename);
+ if (err) {
+ MessageBox(hwnd, err, "Demo screenshot failure", MB_OK | MB_ICONERROR);
+ sfree(err);
+ }
+ cleanup_exit(0);
+}
+
+void gui_terminal_ready(HWND hwnd, Seat *seat, Backend *backend)
+{
+ if (demo_terminal_data) {
+ ptrlen data = ptrlen_from_strbuf(demo_terminal_data);
+ seat_stdout(seat, data.ptr, data.len);
+ schedule_timer(TICKSPERSEC, demo_terminal_screenshot, (void *)hwnd);
+ }
+}