URL: allow port specification in ssh:// URLs

Allow port specification in ssh:// URLs in the
usual notation:

	ssh://[user@]host.domain[:<port>]/<path>

This allows git to be used over ssh-tunneling
networks.

Signed-off-by: Luben Tuikov <ltuikov@yahoo.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Luben Tuikov
2007-09-01 02:36:31 -07:00
committed by Junio C Hamano
parent c7965afd3d
commit 2e7766655a
2 changed files with 32 additions and 2 deletions

View File

@ -453,6 +453,22 @@ static void git_proxy_connect(int fd[2], char *host)
#define MAX_CMD_LEN 1024
char *get_port(char *host)
{
char *end;
char *p = strchr(host, ':');
if (p) {
strtol(p+1, &end, 10);
if (*end == '\0') {
*p = '\0';
return p+1;
}
}
return NULL;
}
/*
* This returns 0 if the transport protocol does not need fork(2),
* or a process id if it does. Once done, finish the connection
@ -471,6 +487,7 @@ pid_t git_connect(int fd[2], char *url, const char *prog, int flags)
pid_t pid;
enum protocol protocol = PROTO_LOCAL;
int free_path = 0;
char *port = NULL;
/* Without this we cannot rely on waitpid() to tell
* what happened to our children.
@ -527,6 +544,12 @@ pid_t git_connect(int fd[2], char *url, const char *prog, int flags)
*ptr = '\0';
}
/*
* Add support for ssh port: ssh://host.xy:<port>/...
*/
if (protocol == PROTO_SSH && host != url)
port = get_port(host);
if (protocol == PROTO_GIT) {
/* These underlying connection commands die() if they
* cannot connect.
@ -583,7 +606,12 @@ pid_t git_connect(int fd[2], char *url, const char *prog, int flags)
ssh_basename = ssh;
else
ssh_basename++;
execlp(ssh, ssh_basename, host, command, NULL);
if (!port)
execlp(ssh, ssh_basename, host, command, NULL);
else
execlp(ssh, ssh_basename, "-p", port, host,
command, NULL);
}
else {
unsetenv(ALTERNATE_DB_ENVIRONMENT);