Browse Source

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>
maint
Luben Tuikov 18 years ago committed by Junio C Hamano
parent
commit
2e7766655a
  1. 4
      Documentation/urls.txt
  2. 30
      connect.c

4
Documentation/urls.txt

@ -10,6 +10,7 @@ to name the remote repository: @@ -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: @@ -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

@ -453,6 +453,22 @@ static void git_proxy_connect(int fd[2], char *host) @@ -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) @@ -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) @@ -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) @@ -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…
Cancel
Save