Skip to content

Commit

Permalink
URL: allow port specification in ssh:// URLs
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Luben Tuikov authored and Junio C Hamano committed Sep 1, 2007
1 parent c7965af commit 2e77666
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
4 changes: 3 additions & 1 deletion Documentation/urls.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:

===============================================================
Expand Down
30 changes: 29 additions & 1 deletion connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 2e77666

Please sign in to comment.