version 1.159, 2002/01/14 13:55:55 |
version 1.160, 2002/01/16 13:17:51 |
|
|
IPv4or6 = af; |
IPv4or6 = af; |
} |
} |
|
|
/* |
static int |
* Initiate forwarding of connections to local port "port" through the secure |
channel_setup_fwd_listener(int type, const char *listen_addr, u_short listen_port, |
* channel to host:port from remote side. |
const char *host_to_connect, u_short port_to_connect, int gateway_ports) |
*/ |
|
int |
|
channel_request_local_forwarding(u_short listen_port, const char *host_to_connect, |
|
u_short port_to_connect, int gateway_ports) |
|
{ |
{ |
return channel_request_forwarding( |
|
NULL, listen_port, |
|
host_to_connect, port_to_connect, |
|
gateway_ports, /*remote_fwd*/ 0); |
|
} |
|
|
|
/* |
|
* If 'remote_fwd' is true we have a '-R style' listener for protocol 2 |
|
* (SSH_CHANNEL_RPORT_LISTENER). |
|
*/ |
|
int |
|
channel_request_forwarding( |
|
const char *listen_address, u_short listen_port, |
|
const char *host_to_connect, u_short port_to_connect, |
|
int gateway_ports, int remote_fwd) |
|
{ |
|
Channel *c; |
Channel *c; |
int success, sock, on = 1, type; |
int success, sock, on = 1; |
struct addrinfo hints, *ai, *aitop; |
struct addrinfo hints, *ai, *aitop; |
char ntop[NI_MAXHOST], strport[NI_MAXSERV]; |
|
const char *host; |
const char *host; |
|
char ntop[NI_MAXHOST], strport[NI_MAXSERV]; |
struct linger linger; |
struct linger linger; |
|
|
success = 0; |
success = 0; |
|
host = (type == SSH_CHANNEL_RPORT_LISTENER) ? |
|
listen_addr : host_to_connect; |
|
|
if (remote_fwd) { |
if (host == NULL) { |
host = listen_address; |
error("No forward host name."); |
type = SSH_CHANNEL_RPORT_LISTENER; |
return success; |
} else { |
|
host = host_to_connect; |
|
type = SSH_CHANNEL_PORT_LISTENER; |
|
} |
} |
|
|
if (strlen(host) > SSH_CHANNEL_PATH_LEN - 1) { |
if (strlen(host) > SSH_CHANNEL_PATH_LEN - 1) { |
error("Forward host name too long."); |
error("Forward host name too long."); |
return success; |
return success; |
} |
} |
|
|
/* XXX listen_address is currently ignored */ |
|
/* |
/* |
* getaddrinfo returns a loopback address if the hostname is |
* getaddrinfo returns a loopback address if the hostname is |
* set to NULL and hints.ai_flags is not AI_PASSIVE |
* set to NULL and hints.ai_flags is not AI_PASSIVE |
|
|
continue; |
continue; |
if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop), |
if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop), |
strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) { |
strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) { |
error("channel_request_forwarding: getnameinfo failed"); |
error("channel_setup_fwd_listener: getnameinfo failed"); |
continue; |
continue; |
} |
} |
/* Create a port to listen for the host. */ |
/* Create a port to listen for the host. */ |
|
|
CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, |
CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, |
0, xstrdup("port listener"), 1); |
0, xstrdup("port listener"), 1); |
if (c == NULL) { |
if (c == NULL) { |
error("channel_request_forwarding: channel_new failed"); |
error("channel_setup_fwd_listener: channel_new failed"); |
close(sock); |
close(sock); |
continue; |
continue; |
} |
} |
|
|
success = 1; |
success = 1; |
} |
} |
if (success == 0) |
if (success == 0) |
error("channel_request_forwarding: cannot listen to port: %d", |
error("channel_setup_fwd_listener: cannot listen to port: %d", |
listen_port); |
listen_port); |
freeaddrinfo(aitop); |
freeaddrinfo(aitop); |
return success; |
return success; |
} |
} |
|
|
|
/* protocol local port fwd, used by ssh (and sshd in v1) */ |
|
int |
|
channel_setup_local_fwd_listener(u_short listen_port, |
|
const char *host_to_connect, u_short port_to_connect, int gateway_ports) |
|
{ |
|
return channel_setup_fwd_listener(SSH_CHANNEL_PORT_LISTENER, |
|
NULL, listen_port, host_to_connect, port_to_connect, gateway_ports); |
|
} |
|
|
|
/* protocol v2 remote port fwd, used by sshd */ |
|
int |
|
channel_setup_remote_fwd_listener(const char *listen_address, |
|
u_short listen_port, int gateway_ports) |
|
{ |
|
return channel_setup_fwd_listener(SSH_CHANNEL_RPORT_LISTENER, |
|
listen_address, listen_port, NULL, 0, gateway_ports); |
|
} |
|
|
/* |
/* |
* Initiate forwarding of connections to port "port" on remote host through |
* Initiate forwarding of connections to port "port" on remote host through |
* the secure channel to host:port from local side. |
* the secure channel to host:port from local side. |
|
|
packet_disconnect("Requested forwarding of port %d but user is not root.", |
packet_disconnect("Requested forwarding of port %d but user is not root.", |
port); |
port); |
/* Initiate forwarding */ |
/* Initiate forwarding */ |
channel_request_local_forwarding(port, hostname, host_port, gateway_ports); |
channel_setup_local_fwd_listener(port, hostname, host_port, gateway_ports); |
|
|
/* Free the argument string. */ |
/* Free the argument string. */ |
xfree(hostname); |
xfree(hostname); |