version 1.84.2.2, 2002/03/07 17:37:46 |
version 1.84.2.3, 2002/05/17 00:03:23 |
|
|
#include "atomicio.h" |
#include "atomicio.h" |
#include "sshtty.h" |
#include "sshtty.h" |
#include "misc.h" |
#include "misc.h" |
|
#include "readpass.h" |
|
|
/* import options */ |
/* import options */ |
extern Options options; |
extern Options options; |
|
|
} |
} |
} |
} |
|
|
|
static void |
|
process_cmdline(void) |
|
{ |
|
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; |
|
|
|
leave_raw_mode(); |
|
handler = signal(SIGINT, SIG_IGN); |
|
cmd = s = read_passphrase("\r\nssh> ", RP_ECHO); |
|
if (s == NULL) |
|
goto out; |
|
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) { |
|
if (channel_setup_local_fwd_listener(fwd_port, buf, |
|
fwd_host_port, options.gateway_ports) < 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 */ |
/* process the characters one by one */ |
static int |
static int |
process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len) |
process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len) |
|
|
"%c?\r\n\ |
"%c?\r\n\ |
Supported escape sequences:\r\n\ |
Supported escape sequences:\r\n\ |
~. - terminate connection\r\n\ |
~. - terminate connection\r\n\ |
|
~C - open a command line\r\n\ |
~R - Request rekey (SSH protocol 2 only)\r\n\ |
~R - Request rekey (SSH protocol 2 only)\r\n\ |
~^Z - suspend ssh\r\n\ |
~^Z - suspend ssh\r\n\ |
~# - list forwarded connections\r\n\ |
~# - list forwarded connections\r\n\ |
|
|
xfree(s); |
xfree(s); |
continue; |
continue; |
|
|
|
case 'C': |
|
process_cmdline(); |
|
continue; |
|
|
default: |
default: |
if (ch != escape_char) { |
if (ch != escape_char) { |
buffer_put_char(bin, escape_char); |
buffer_put_char(bin, escape_char); |
|
|
client_init_dispatch_20(void) |
client_init_dispatch_20(void) |
{ |
{ |
dispatch_init(&dispatch_protocol_error); |
dispatch_init(&dispatch_protocol_error); |
|
|
dispatch_set(SSH2_MSG_CHANNEL_CLOSE, &channel_input_oclose); |
dispatch_set(SSH2_MSG_CHANNEL_CLOSE, &channel_input_oclose); |
dispatch_set(SSH2_MSG_CHANNEL_DATA, &channel_input_data); |
dispatch_set(SSH2_MSG_CHANNEL_DATA, &channel_input_data); |
dispatch_set(SSH2_MSG_CHANNEL_EOF, &channel_input_ieof); |
dispatch_set(SSH2_MSG_CHANNEL_EOF, &channel_input_ieof); |
|
|
|
|
/* rekeying */ |
/* rekeying */ |
dispatch_set(SSH2_MSG_KEXINIT, &kex_input_kexinit); |
dispatch_set(SSH2_MSG_KEXINIT, &kex_input_kexinit); |
|
|
|
/* global request reply messages */ |
|
dispatch_set(SSH2_MSG_REQUEST_FAILURE, &client_global_request_reply); |
|
dispatch_set(SSH2_MSG_REQUEST_SUCCESS, &client_global_request_reply); |
} |
} |
static void |
static void |
client_init_dispatch_13(void) |
client_init_dispatch_13(void) |