summaryrefslogtreecommitdiff
path: root/connect.c
diff options
context:
space:
mode:
authorLuben Tuikov <ltuikov@yahoo.com>2007-09-01 02:36:31 -0700
committerJunio C Hamano <gitster@pobox.com>2007-09-01 03:35:29 -0700
commit2e7766655abd0312a6bf4db6a6ff141e7e4ac8b6 (patch)
tree4a30f8f91f641f3b89bdf4204045e6de92df3303 /connect.c
parentc7965afd3dac7b9b6c1d4da27d3757e7d41aa060 (diff)
downloadgit-2e7766655abd0312a6bf4db6a6ff141e7e4ac8b6.tar.gz
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>
Diffstat (limited to 'connect.c')
-rw-r--r--connect.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/connect.c b/connect.c
index ae49c5a367..8b1e9935a8 100644
--- a/connect.c
+++ b/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);