=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/clientloop.c,v retrieving revision 1.96 retrieving revision 1.97 diff -u -r1.96 -r1.97 --- src/usr.bin/ssh/clientloop.c 2002/02/06 14:55:15 1.96 +++ src/usr.bin/ssh/clientloop.c 2002/03/21 15:17:26 1.97 @@ -59,7 +59,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: clientloop.c,v 1.96 2002/02/06 14:55:15 markus Exp $"); +RCSID("$OpenBSD: clientloop.c,v 1.97 2002/03/21 15:17:26 jakob Exp $"); #include "ssh.h" #include "ssh1.h" @@ -81,6 +81,7 @@ #include "atomicio.h" #include "sshtty.h" #include "misc.h" +#include "readpass.h" /* import options */ extern Options options; @@ -470,6 +471,75 @@ } } +static void +process_cmdline(Buffer *bin, Buffer *bout, Buffer *berr) +{ + char string[1024]; + void (*handler)(int); + char *s, *cmd; + u_short fwd_port, fwd_host_port; + char buf[1024], sfwd_port[6], sfwd_host_port[6]; + int local = 0; + int n; + + leave_raw_mode(); + handler = signal(SIGINT, SIG_IGN); + s = read_passphrase("\r\nssh> ", RP_ECHO); + if (s == NULL) + goto out; + cmd = s; + + while (*s && isspace(*s)) + s++; + + if (*s == 0) + goto out; + + if (strlen(s) < 2 || s[0] != '-' || !(s[1] == 'L' || s[1] == 'R')) { + log("Invalid command"); + goto out; + } + if (s[1] == 'L') + local = 1; + if (!local && !compat20) { + log("Not supported for SSH protocol version 1"); + goto out; + } + + s += 2; + while (*s && isspace(*s)) + s++; + + if (sscanf(s, "%5[0-9]:%255[^:]:%5[0-9]", + sfwd_port, buf, sfwd_host_port) != 3 && + sscanf(s, "%5[0-9]/%255[^/]/%5[0-9]", + sfwd_port, buf, sfwd_host_port) != 3) { + log("Bad forwarding specification"); + goto out; + } + if ((fwd_port = a2port(sfwd_port)) == 0 || + (fwd_host_port = a2port(sfwd_host_port)) == 0) { + log("Bad forwarding port(s)"); + goto out; + } + if (local) { + n = channel_setup_local_fwd_listener(fwd_port, buf, + fwd_host_port, options.gateway_ports); + if (n <= 0) { + log("Port forwarding failed"); + goto out; + } + } else + channel_request_remote_forwarding(fwd_port, buf, + fwd_host_port); + log("Forwarding port"); +out: + signal(SIGINT, handler); + enter_raw_mode(); + if (cmd) + xfree(cmd); +} + /* process the characters one by one */ static int process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len) @@ -574,6 +644,7 @@ "%c?\r\n\ Supported escape sequences:\r\n\ ~. - terminate connection\r\n\ +~C - open a command line\r\n\ ~R - Request rekey (SSH protocol 2 only)\r\n\ ~^Z - suspend ssh\r\n\ ~# - list forwarded connections\r\n\ @@ -591,6 +662,10 @@ s = channel_open_message(); buffer_append(berr, s, strlen(s)); xfree(s); + continue; + + case 'C': + process_cmdline(bin, bout, berr); continue; default: