X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxplink.c;h=bf55ea73e93b875ebf262edcdad1b913869b3c93;hb=737cb2d24ea61d49f258b2d5f596f43e5e91ba93;hp=40b126615e31f3b3662a29ac8585ba2e4c100b84;hpb=b5423b51d468b76eb2b6cd19bb2c900b882e24f3;p=PuTTY.git diff --git a/unix/uxplink.c b/unix/uxplink.c index 40b12661..bf55ea73 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -25,7 +25,7 @@ #define MAX_STDIN_BACKLOG 4096 -void *logctx; +static void *logctx; static struct termios orig_termios; @@ -305,6 +305,9 @@ char *get_ttymode(void *frontend, const char *mode) #endif #if defined(XCASE) GET_BOOL("XCASE", XCASE, c_lflag, ); +#endif +#if defined(IUTF8) + GET_BOOL("IUTF8", IUTF8, c_iflag, ); #endif /* Configuration of ECHO */ #if defined(ECHOCTL) @@ -581,12 +584,19 @@ static void usage(void) printf(" -N don't start a shell/command (SSH-2 only)\n"); printf(" -nc host:port\n"); printf(" open tunnel in place of session (SSH-2 only)\n"); + printf(" -sshlog file\n"); + printf(" -sshrawlog file\n"); + printf(" log protocol details to a file\n"); + printf(" -shareexists\n"); + printf(" test whether a connection-sharing upstream exists\n"); exit(1); } static void version(void) { - printf("plink: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("plink: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); exit(1); } @@ -607,6 +617,7 @@ int main(int argc, char **argv) int errors; int use_subsystem = 0; int got_host = FALSE; + int just_test_share_exists = FALSE; unsigned long now; struct winsize size; @@ -685,6 +696,12 @@ int main(int argc, char **argv) --argc; provide_xrm_string(*++argv); } + } else if (!strcmp(p, "-shareexists")) { + just_test_share_exists = TRUE; + } else if (!strcmp(p, "-fuzznet")) { + conf_set_int(conf, CONF_proxy_type, PROXY_FUZZ); + conf_set_str(conf, CONF_proxy_telnet_command, + "%host"); } else { fprintf(stderr, "plink: unknown option \"%s\"\n", p); errors = 1; @@ -934,6 +951,11 @@ int main(int argc, char **argv) perror("pipe"); exit(1); } + /* We don't want the signal handler to block if the pipe's full. */ + nonblock(signalpipe[0]); + nonblock(signalpipe[1]); + cloexec(signalpipe[0]); + cloexec(signalpipe[1]); putty_signal(SIGWINCH, sigwinch); /* @@ -949,7 +971,7 @@ int main(int argc, char **argv) uxsel_init(); /* - * Unix Plink doesn't provide any way to add forwardings after the + * Plink doesn't provide any way to add forwardings after the * connection is set up, so if there are none now, we can safely set * the "simple" flag. */ @@ -959,6 +981,19 @@ int main(int argc, char **argv) !conf_get_str_nthstrkey(conf, CONF_portfwd, 0)) conf_set_int(conf, CONF_ssh_simple, TRUE); + if (just_test_share_exists) { + if (!back->test_for_upstream) { + fprintf(stderr, "Connection sharing not supported for connection " + "type '%s'\n", back->name); + return 1; + } + if (back->test_for_upstream(conf_get_str(conf, CONF_host), + conf_get_int(conf, CONF_port), conf)) + return 0; + else + return 1; + } + /* * Start up the connection. */ @@ -970,6 +1005,11 @@ int main(int argc, char **argv) /* nodelay is only useful if stdin is a terminal device */ int nodelay = conf_get_int(conf, CONF_tcp_nodelay) && isatty(0); + /* This is a good place for a fuzzer to fork us. */ +#ifdef __AFL_HAVE_MANUAL_CONTROL + __AFL_INIT(); +#endif + error = back->init(NULL, &backhandle, conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), @@ -1084,6 +1124,9 @@ int main(int argc, char **argv) ret = select(maxfd, &rset, &wset, &xset, NULL); } + if (ret < 0 && errno == EINTR) + continue; + if (ret < 0) { perror("select"); exit(1);