version 1.317, 2019/06/28 13:35:04 |
version 1.318, 2019/09/13 04:27:35 |
|
|
/* Expand a proxy command */ |
/* Expand a proxy command */ |
static char * |
static char * |
expand_proxy_command(const char *proxy_command, const char *user, |
expand_proxy_command(const char *proxy_command, const char *user, |
const char *host, int port) |
const char *host, const char *host_arg, int port) |
{ |
{ |
char *tmp, *ret, strport[NI_MAXSERV]; |
char *tmp, *ret, strport[NI_MAXSERV]; |
|
|
snprintf(strport, sizeof strport, "%d", port); |
snprintf(strport, sizeof strport, "%d", port); |
xasprintf(&tmp, "exec %s", proxy_command); |
xasprintf(&tmp, "exec %s", proxy_command); |
ret = percent_expand(tmp, "h", host, "p", strport, |
ret = percent_expand(tmp, |
"r", options.user, (char *)NULL); |
"h", host, |
|
"n", host_arg, |
|
"p", strport, |
|
"r", options.user, |
|
(char *)NULL); |
free(tmp); |
free(tmp); |
return ret; |
return ret; |
} |
} |
|
|
* a connected fd back to us. |
* a connected fd back to us. |
*/ |
*/ |
static int |
static int |
ssh_proxy_fdpass_connect(struct ssh *ssh, const char *host, u_short port, |
ssh_proxy_fdpass_connect(struct ssh *ssh, const char *host, |
const char *proxy_command) |
const char *host_arg, u_short port, const char *proxy_command) |
{ |
{ |
char *command_string; |
char *command_string; |
int sp[2], sock; |
int sp[2], sock; |
|
|
"proxy dialer: %.100s", strerror(errno)); |
"proxy dialer: %.100s", strerror(errno)); |
|
|
command_string = expand_proxy_command(proxy_command, options.user, |
command_string = expand_proxy_command(proxy_command, options.user, |
host, port); |
host_arg, host, port); |
debug("Executing proxy dialer command: %.500s", command_string); |
debug("Executing proxy dialer command: %.500s", command_string); |
|
|
/* Fork and execute the proxy command. */ |
/* Fork and execute the proxy command. */ |
|
|
* Connect to the given ssh server using a proxy command. |
* Connect to the given ssh server using a proxy command. |
*/ |
*/ |
static int |
static int |
ssh_proxy_connect(struct ssh *ssh, const char *host, u_short port, |
ssh_proxy_connect(struct ssh *ssh, const char *host, const char *host_arg, |
const char *proxy_command) |
u_short port, const char *proxy_command) |
{ |
{ |
char *command_string; |
char *command_string; |
int pin[2], pout[2]; |
int pin[2], pout[2]; |
|
|
strerror(errno)); |
strerror(errno)); |
|
|
command_string = expand_proxy_command(proxy_command, options.user, |
command_string = expand_proxy_command(proxy_command, options.user, |
host, port); |
host_arg, host, port); |
debug("Executing proxy command: %.500s", command_string); |
debug("Executing proxy command: %.500s", command_string); |
|
|
/* Fork and execute the proxy command. */ |
/* Fork and execute the proxy command. */ |
|
|
} |
} |
|
|
int |
int |
ssh_connect(struct ssh *ssh, const char *host, struct addrinfo *addrs, |
ssh_connect(struct ssh *ssh, const char *host, const char *host_arg, |
struct sockaddr_storage *hostaddr, u_short port, int family, |
struct addrinfo *addrs, struct sockaddr_storage *hostaddr, u_short port, |
int connection_attempts, int *timeout_ms, int want_keepalive) |
int family, int connection_attempts, int *timeout_ms, int want_keepalive) |
{ |
{ |
int in, out; |
int in, out; |
|
|
|
|
return -1; /* ssh_packet_set_connection logs error */ |
return -1; /* ssh_packet_set_connection logs error */ |
return 0; |
return 0; |
} else if (options.proxy_use_fdpass) { |
} else if (options.proxy_use_fdpass) { |
return ssh_proxy_fdpass_connect(ssh, host, port, |
return ssh_proxy_fdpass_connect(ssh, host, host_arg, port, |
options.proxy_command); |
options.proxy_command); |
} |
} |
return ssh_proxy_connect(ssh, host, port, options.proxy_command); |
return ssh_proxy_connect(ssh, host, host_arg, port, |
|
options.proxy_command); |
} |
} |
|
|
/* defaults to 'no' */ |
/* defaults to 'no' */ |