version 1.404, 2014/06/27 16:41:56 |
version 1.405, 2014/07/03 06:39:19 |
|
|
#include "canohost.h" |
#include "canohost.h" |
#include "compat.h" |
#include "compat.h" |
#include "cipher.h" |
#include "cipher.h" |
|
#include "digest.h" |
#include "packet.h" |
#include "packet.h" |
#include "buffer.h" |
#include "buffer.h" |
#include "channels.h" |
#include "channels.h" |
|
|
extern int muxserver_sock; |
extern int muxserver_sock; |
extern u_int muxclient_command; |
extern u_int muxclient_command; |
|
|
|
|
/* Prints a help message to the user. This function never returns. */ |
/* Prints a help message to the user. This function never returns. */ |
|
|
static void |
static void |
|
|
extern char *optarg; |
extern char *optarg; |
Forward fwd; |
Forward fwd; |
struct addrinfo *addrs = NULL; |
struct addrinfo *addrs = NULL; |
|
struct ssh_digest_ctx *md; |
|
u_char conn_hash[SSH_DIGEST_MAX_LENGTH]; |
|
char *conn_hash_hex; |
|
|
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
sanitise_stdfd(); |
sanitise_stdfd(); |
|
|
shorthost[strcspn(thishost, ".")] = '\0'; |
shorthost[strcspn(thishost, ".")] = '\0'; |
snprintf(portstr, sizeof(portstr), "%d", options.port); |
snprintf(portstr, sizeof(portstr), "%d", options.port); |
|
|
|
if ((md = ssh_digest_start(SSH_DIGEST_SHA1)) == NULL || |
|
ssh_digest_update(md, thishost, strlen(thishost)) < 0 || |
|
ssh_digest_update(md, host, strlen(host)) < 0 || |
|
ssh_digest_update(md, portstr, strlen(portstr)) < 0 || |
|
ssh_digest_update(md, options.user, strlen(options.user)) < 0 || |
|
ssh_digest_final(md, conn_hash, sizeof(conn_hash)) < 0) |
|
fatal("%s: mux digest failed", __func__); |
|
ssh_digest_free(md); |
|
conn_hash_hex = tohex(conn_hash, ssh_digest_bytes(SSH_DIGEST_SHA1)); |
|
|
if (options.local_command != NULL) { |
if (options.local_command != NULL) { |
debug3("expanding LocalCommand: %s", options.local_command); |
debug3("expanding LocalCommand: %s", options.local_command); |
cp = options.local_command; |
cp = options.local_command; |
options.local_command = percent_expand(cp, "d", pw->pw_dir, |
options.local_command = percent_expand(cp, |
"h", host, "l", thishost, "n", host_arg, "r", options.user, |
"C", conn_hash_hex, |
"p", portstr, "u", pw->pw_name, "L", shorthost, |
"L", shorthost, |
|
"d", pw->pw_dir, |
|
"h", host, |
|
"l", thishost, |
|
"n", host_arg, |
|
"p", portstr, |
|
"r", options.user, |
|
"u", pw->pw_name, |
(char *)NULL); |
(char *)NULL); |
debug3("expanded LocalCommand: %s", options.local_command); |
debug3("expanded LocalCommand: %s", options.local_command); |
free(cp); |
free(cp); |
|
|
cp = tilde_expand_filename(options.control_path, |
cp = tilde_expand_filename(options.control_path, |
original_real_uid); |
original_real_uid); |
free(options.control_path); |
free(options.control_path); |
options.control_path = percent_expand(cp, "h", host, |
options.control_path = percent_expand(cp, |
"l", thishost, "n", host_arg, "r", options.user, |
"C", conn_hash_hex, |
"p", portstr, "u", pw->pw_name, "L", shorthost, |
"L", shorthost, |
|
"h", host, |
|
"l", thishost, |
|
"n", host_arg, |
|
"p", portstr, |
|
"r", options.user, |
|
"u", pw->pw_name, |
(char *)NULL); |
(char *)NULL); |
free(cp); |
free(cp); |
} |
} |
|
free(conn_hash_hex); |
|
|
if (muxclient_command != 0 && options.control_path == NULL) |
if (muxclient_command != 0 && options.control_path == NULL) |
fatal("No ControlPath specified for \"-O\" command"); |
fatal("No ControlPath specified for \"-O\" command"); |
if (options.control_path != NULL) |
if (options.control_path != NULL) |