X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/c5e438ecf3f6d7b8caab10e43a452f3555149309..6ee9b735013c0e636b027b77e9f6ba57a96e142f:/unix/uxplink.c diff --git a/unix/uxplink.c b/unix/uxplink.c index 8f828a52..99ace88a 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -111,6 +111,9 @@ void try_output(int is_stderr) void *senddata; int sendlen, ret; + if (bufchain_size(chain) == 0) + return; + bufchain_prefix(chain, &senddata, &sendlen); ret = write(fd, senddata, sendlen); if (ret > 0) @@ -183,7 +186,7 @@ int main(int argc, char **argv) int i, skcount, sksize, socketstate; int connopen; int exitcode; - void *logctx; + int errors; void *ldisc; ssh_get_line = console_get_line; @@ -204,6 +207,7 @@ int main(int argc, char **argv) do_defaults(NULL, &cfg); default_protocol = cfg.protocol; default_port = cfg.port; + errors = 0; { /* * Override the default protocol if PLINK_PROTOCOL is set. @@ -228,16 +232,32 @@ int main(int argc, char **argv) if (ret == -2) { fprintf(stderr, "plink: option \"%s\" requires an argument\n", p); + errors = 1; } else if (ret == 2) { --argc, ++argv; } else if (ret == 1) { continue; } else if (!strcmp(p, "-batch")) { console_batch_mode = 1; + } else if (!strcmp(p, "-o")) { + if (argc <= 1) { + fprintf(stderr, + "plink: option \"-o\" requires an argument\n"); + errors = 1; + } else { + --argc; + provide_xrm_string(*++argv); + } + } else { + fprintf(stderr, "plink: unknown option \"%s\"\n", p); + errors = 1; } } else if (*p) { if (!*cfg.host) { char *q = p; + + do_defaults(NULL, &cfg); + /* * If the hostname starts with "telnet:", set the * protocol to Telnet and process the string as a @@ -355,6 +375,9 @@ int main(int argc, char **argv) } } + if (errors) + return 1; + if (!*cfg.host) { usage(); } @@ -438,6 +461,7 @@ int main(int argc, char **argv) /* * Start up the connection. */ + logctx = log_init(NULL); { char *error; char *realhost; @@ -447,12 +471,11 @@ int main(int argc, char **argv) error = back->init(NULL, &backhandle, cfg.host, cfg.port, &realhost, nodelay); if (error) { - fprintf(stderr, "Unable to open connection:\n%s", error); + fprintf(stderr, "Unable to open connection:\n%s\n", error); return 1; } - logctx = log_init(NULL); back->provide_logctx(backhandle, logctx); - ldisc = ldisc_create(NULL, back, backhandle, NULL); + ldisc = ldisc_create(&cfg, NULL, back, backhandle, NULL); sfree(realhost); } connopen = 1; @@ -532,12 +555,17 @@ int main(int argc, char **argv) for (i = 0; i < skcount; i++) { socket = sklist[i]; + /* + * We must process exceptional notifications before + * ordinary readability ones, or we may go straight + * past the urgent marker. + */ + if (FD_ISSET(socket, &xset)) + select_result(socket, 4); if (FD_ISSET(socket, &rset)) select_result(socket, 1); if (FD_ISSET(socket, &wset)) select_result(socket, 2); - if (FD_ISSET(socket, &xset)) - select_result(socket, 4); } if (FD_ISSET(0, &rset)) { @@ -576,5 +604,6 @@ int main(int argc, char **argv) fprintf(stderr, "Remote process exit code unavailable\n"); exitcode = 1; /* this is an error condition */ } - return exitcode; + cleanup_exit(exitcode); + return exitcode; /* shouldn't happen, but placates gcc */ }