Browse Source

connect: split ssh command line options into separate function

The git_connect function is growing long.  Split the portion that
discovers an ssh command and options it accepts before the service
name and path to a separate function to make it easier to read.

No functional change intended.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jonathan Nieder 7 years ago committed by Junio C Hamano
parent
commit
fce54ce422
  1. 113
      connect.c

113
connect.c

@ -919,6 +919,65 @@ static struct child_process *git_connect_git(int fd[2], char *hostandport,
return conn; return conn;
} }


/* Prepare a child_process for use by Git's SSH-tunneled transport. */
static void fill_ssh_args(struct child_process *conn, const char *ssh_host,
const char *port, int flags)
{
const char *ssh;
enum ssh_variant variant;

if (looks_like_command_line_option(ssh_host))
die("strange hostname '%s' blocked", ssh_host);

ssh = get_ssh_command();
if (ssh) {
variant = determine_ssh_variant(ssh, 1);
} else {
/*
* GIT_SSH is the no-shell version of
* GIT_SSH_COMMAND (and must remain so for
* historical compatibility).
*/
conn->use_shell = 0;

ssh = getenv("GIT_SSH");
if (!ssh)
ssh = "ssh";
variant = determine_ssh_variant(ssh, 0);
}

argv_array_push(&conn->args, ssh);

if (variant == VARIANT_SSH &&
get_protocol_version_config() > 0) {
argv_array_push(&conn->args, "-o");
argv_array_push(&conn->args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
get_protocol_version_config());
}

if (variant != VARIANT_SIMPLE) {
if (flags & CONNECT_IPV4)
argv_array_push(&conn->args, "-4");
else if (flags & CONNECT_IPV6)
argv_array_push(&conn->args, "-6");
}

if (variant == VARIANT_TORTOISEPLINK)
argv_array_push(&conn->args, "-batch");

if (port && variant != VARIANT_SIMPLE) {
if (variant == VARIANT_SSH)
argv_array_push(&conn->args, "-p");
else
argv_array_push(&conn->args, "-P");

argv_array_push(&conn->args, port);
}

argv_array_push(&conn->args, ssh_host);
}

/* /*
* This returns the dummy child_process `no_fork` if the transport protocol * This returns the dummy child_process `no_fork` if the transport protocol
* does not need fork(2), or a struct child_process object if it does. Once * does not need fork(2), or a struct child_process object if it does. Once
@ -972,8 +1031,6 @@ struct child_process *git_connect(int fd[2], const char *url,
conn->use_shell = 1; conn->use_shell = 1;
conn->in = conn->out = -1; conn->in = conn->out = -1;
if (protocol == PROTO_SSH) { if (protocol == PROTO_SSH) {
const char *ssh;
enum ssh_variant variant;
char *ssh_host = hostandport; char *ssh_host = hostandport;
const char *port = NULL; const char *port = NULL;
transport_check_allowed("ssh"); transport_check_allowed("ssh");
@ -995,57 +1052,7 @@ struct child_process *git_connect(int fd[2], const char *url,
strbuf_release(&cmd); strbuf_release(&cmd);
return NULL; return NULL;
} }

fill_ssh_args(conn, ssh_host, port, flags);
if (looks_like_command_line_option(ssh_host))
die("strange hostname '%s' blocked", ssh_host);

ssh = get_ssh_command();
if (ssh) {
variant = determine_ssh_variant(ssh, 1);
} else {
/*
* GIT_SSH is the no-shell version of
* GIT_SSH_COMMAND (and must remain so for
* historical compatibility).
*/
conn->use_shell = 0;

ssh = getenv("GIT_SSH");
if (!ssh)
ssh = "ssh";
variant = determine_ssh_variant(ssh, 0);
}

argv_array_push(&conn->args, ssh);

if (variant == VARIANT_SSH &&
get_protocol_version_config() > 0) {
argv_array_push(&conn->args, "-o");
argv_array_push(&conn->args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
get_protocol_version_config());
}

if (variant != VARIANT_SIMPLE) {
if (flags & CONNECT_IPV4)
argv_array_push(&conn->args, "-4");
else if (flags & CONNECT_IPV6)
argv_array_push(&conn->args, "-6");
}

if (variant == VARIANT_TORTOISEPLINK)
argv_array_push(&conn->args, "-batch");

if (port && variant != VARIANT_SIMPLE) {
if (variant == VARIANT_SSH)
argv_array_push(&conn->args, "-p");
else
argv_array_push(&conn->args, "-P");

argv_array_push(&conn->args, port);
}

argv_array_push(&conn->args, ssh_host);
} else { } else {
transport_check_allowed("file"); transport_check_allowed("file");
if (get_protocol_version_config() > 0) { if (get_protocol_version_config() > 0) {

Loading…
Cancel
Save