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/
|
- https://host.xz/path/to/repo.git/
|
||||||
- git://host.xz/path/to/repo.git/
|
- git://host.xz/path/to/repo.git/
|
||||||
- git://host.xz/~user/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/path/to/repo.git/
|
||||||
- ssh://{startsb}user@{endsb}host.xz/~user/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
|
- 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
|
SSH is the default transport protocol over the network. You can
|
||||||
optionally specify which user to log-in as, and an alternate,
|
optionally specify which user to log-in as, and an alternate,
|
||||||
scp-like syntax is also supported. Both syntaxes support
|
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:
|
three are identical to the last three above, respectively:
|
||||||
|
|
||||||
===============================================================
|
===============================================================
|
||||||
|
28
connect.c
28
connect.c
@ -453,6 +453,22 @@ static void git_proxy_connect(int fd[2], char *host)
|
|||||||
|
|
||||||
#define MAX_CMD_LEN 1024
|
#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),
|
* This returns 0 if the transport protocol does not need fork(2),
|
||||||
* or a process id if it does. Once done, finish the connection
|
* 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;
|
pid_t pid;
|
||||||
enum protocol protocol = PROTO_LOCAL;
|
enum protocol protocol = PROTO_LOCAL;
|
||||||
int free_path = 0;
|
int free_path = 0;
|
||||||
|
char *port = NULL;
|
||||||
|
|
||||||
/* Without this we cannot rely on waitpid() to tell
|
/* Without this we cannot rely on waitpid() to tell
|
||||||
* what happened to our children.
|
* 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';
|
*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) {
|
if (protocol == PROTO_GIT) {
|
||||||
/* These underlying connection commands die() if they
|
/* These underlying connection commands die() if they
|
||||||
* cannot connect.
|
* cannot connect.
|
||||||
@ -583,7 +606,12 @@ pid_t git_connect(int fd[2], char *url, const char *prog, int flags)
|
|||||||
ssh_basename = ssh;
|
ssh_basename = ssh;
|
||||||
else
|
else
|
||||||
ssh_basename++;
|
ssh_basename++;
|
||||||
|
|
||||||
|
if (!port)
|
||||||
execlp(ssh, ssh_basename, host, command, NULL);
|
execlp(ssh, ssh_basename, host, command, NULL);
|
||||||
|
else
|
||||||
|
execlp(ssh, ssh_basename, "-p", port, host,
|
||||||
|
command, NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unsetenv(ALTERNATE_DB_ENVIRONMENT);
|
unsetenv(ALTERNATE_DB_ENVIRONMENT);
|
||||||
|
Loading…
Reference in New Issue
Block a user