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:

committed by
Junio C Hamano

parent
c7965afd3d
commit
2e7766655a
30
connect.c
30
connect.c
@ -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);
|
||||
|
Reference in New Issue
Block a user