[PATCH] RFC: proxy-command support for git://
From: Paul Collins <hidden>
Date: 2016-06-15 22:42:10
I spend some of my time using a network that only allows outgoing TCP connections to certain ports, and the git-daemon port is not one of them. This patch below implements an analogue to ssh's ProxyCommand feature for git, as a less messy alternative to ssh port forwarding. One can use it to ssh to a bastion host and netcat to the destination: $ cat ~/bin/my-git-proxy-command #!/bin/sh exec ssh bastionhost nc "$1" "$2" I've done a few pulls and a clone with it, and it seems to work. Questions: * Can git already do this and I just failed to notice? * Where should git_use_proxy() look? Some git configuration file? An environment variable? Both? Somewhere else? It also needs to support non-default ports and probably other things I missed.
diff --git a/connect.c b/connect.c
index c2badc7..646e26f 100644
--- a/connect.c
+++ b/connect.c@@ -448,6 +448,40 @@ static int git_tcp_connect(int fd[2], co #endif /* NO_IPV6 */ +static int git_proxy_connect(int fd[2], const char *prog, char *host, char *path) +{ + char *command = "my-git-proxy-command"; /* FIXME: cf. git_use_proxy() */ + char *port = STR(DEFAULT_GIT_PORT); + int pipefd[2][2]; + pid_t pid; + + if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0) + die("unable to create pipe pair for communication"); + pid = fork(); + if (!pid) { + dup2(pipefd[1][0], 0); + dup2(pipefd[0][1], 1); + close(pipefd[0][0]); + close(pipefd[0][1]); + close(pipefd[1][0]); + close(pipefd[1][1]); + execlp(command, command, host, port, NULL); + die("exec failed"); + } + fd[0] = pipefd[0][0]; + fd[1] = pipefd[1][1]; + close(pipefd[0][1]); + close(pipefd[1][0]); + packet_write(fd[1], "%s %s\n", prog, path); + return pid; +} + +static int git_use_proxy(void) +{ + /* FIXME: look for the proxy command somewhere - repo's config? environment? */ + return 1; +} + /* * Yeah, yeah, fixme. Need to pass in the heads etc. */
@@ -482,8 +516,11 @@ int git_connect(int fd[2], char *url, co } } - if (protocol == PROTO_GIT) + if (protocol == PROTO_GIT) { + if (git_use_proxy()) + return git_proxy_connect(fd, prog, host, path); return git_tcp_connect(fd, prog, host, path); + } if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0) die("unable to create pipe pair for communication");
--
Dag vijandelijk luchtschip de huismeester is dood