#define MAX_STDIN_BACKLOG 4096
-void *logctx;
+static void *logctx;
static struct termios orig_termios;
-void fatalbox(char *p, ...)
+void fatalbox(const char *p, ...)
{
struct termios cf;
va_list ap;
}
cleanup_exit(1);
}
-void modalfatalbox(char *p, ...)
+void modalfatalbox(const char *p, ...)
{
struct termios cf;
va_list ap;
}
cleanup_exit(1);
}
-void nonfatal(char *p, ...)
+void nonfatal(const char *p, ...)
{
struct termios cf;
va_list ap;
fputc('\n', stderr);
postmsg(&cf);
}
-void connection_fatal(void *frontend, char *p, ...)
+void connection_fatal(void *frontend, const char *p, ...)
{
struct termios cf;
va_list ap;
}
cleanup_exit(1);
}
-void cmdline_error(char *p, ...)
+void cmdline_error(const char *p, ...)
{
struct termios cf;
va_list ap;
{
if (!strcmp(name, "TermType"))
return dupstr(getenv("TERM"));
- if (!strcmp(name, "UserName"))
- return get_username();
if (!strcmp(name, "SerialLine"))
return dupstr("/dev/ttyS0");
return NULL;
{
return FALSE;
}
-void ldisc_update(void *frontend, int echo, int edit)
+void frontend_echoedit_update(void *frontend, int echo, int edit)
{
/* Update stdin read mode to reflect changes in line discipline. */
struct termios mode;
mode.c_cc[VMIN] = 1;
mode.c_cc[VTIME] = 0;
/* FIXME: perhaps what we do with IXON/IXOFF should be an
- * argument to ldisc_update(), to allow implementation of SSH-2
- * "xon-xoff" and Rlogin's equivalent? */
+ * argument to frontend_echoedit_update(), to allow
+ * implementation of SSH-2 "xon-xoff" and Rlogin's
+ * equivalent? */
mode.c_iflag &= ~IXON;
mode.c_iflag &= ~IXOFF;
}
return FALSE; /* do not respond to incoming EOF with outgoing */
}
-int get_userpass_input(prompts_t *p, unsigned char *in, int inlen)
+int get_userpass_input(prompts_t *p, const unsigned char *in, int inlen)
{
int ret;
ret = cmdline_get_passwd_input(p, in, inlen);
* In Plink our selects are synchronous, so these functions are
* empty stubs.
*/
-int uxsel_input_add(int fd, int rwx) { return 0; }
-void uxsel_input_remove(int id) { }
+uxsel_id *uxsel_input_add(int fd, int rwx) { return NULL; }
+void uxsel_input_remove(uxsel_id *id) { }
/*
* Short description of parameters.
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);
}
int errors;
int use_subsystem = 0;
int got_host = FALSE;
+ int just_test_share_exists = FALSE;
unsigned long now;
struct winsize size;
--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;
*/
cmdline_run_saved(conf);
+ /*
+ * If we have no better ideas for the remote username, use the local
+ * one, as 'ssh' does.
+ */
+ if (conf_get_str(conf, CONF_username)[0] == '\0') {
+ char *user = get_username();
+ if (user) {
+ conf_set_str(conf, CONF_username, user);
+ sfree(user);
+ }
+ }
+
/*
* Apply subsystem status.
*/
!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.
*/
/* 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),
*/
local_tty = (tcgetattr(STDIN_FILENO, &orig_termios) == 0);
atexit(cleanup_termios);
- ldisc_update(NULL, 1, 1);
+ frontend_echoedit_update(NULL, 1, 1);
sending = FALSE;
now = GETTICKCOUNT();