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:
parent
c7965afd3d
commit
2e7766655a
@ -10,6 +10,7 @@ to name the remote repository:
|
||||
- https://host.xz/path/to/repo.git/
|
||||
- git://host.xz/path/to/repo.git/
|
||||
- git://host.xz/~user/path/to/repo.git/
|
||||
- ssh://{startsb}user@{endsb}host.xz{startsb}:port{endsb}/path/to/repo.git/
|
||||
- ssh://{startsb}user@{endsb}host.xz/path/to/repo.git/
|
||||
- ssh://{startsb}user@{endsb}host.xz/~user/path/to/repo.git/
|
||||
- ssh://{startsb}user@{endsb}host.xz/~/path/to/repo.git
|
||||
@ -18,7 +19,8 @@ to name the remote repository:
|
||||
SSH is the default transport protocol over the network. You can
|
||||
optionally specify which user to log-in as, and an alternate,
|
||||
scp-like syntax is also supported. Both syntaxes support
|
||||
username expansion, as does the native git protocol. The following
|
||||
username expansion, as does the native git protocol, but
|
||||
only the former supports port specification. The following
|
||||
three are identical to the last three above, respectively:
|
||||
|
||||
===============================================================
|
||||
|
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);
|
||||
|
Loading…
Reference in New Issue
Block a user