git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] RFC: proxy-command support for git://

From
PCPaul Collins <paul@briny.ondioline.org>
Date
Nov 3, 2005, 15:55 UTC
Message-ID
<87fyqdbuab.fsf@briny.internal.ondioline.org>

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
Next: Junio C Hamano
Message 1 of 13 in “RFC: proxy-command support for git://”
  1. RFC: proxy-command support for git://Paul Collins, Nov 3, 2005
  2. Junio C HamanoNov 3, 2005
  3. Linus TorvaldsNov 3, 2005
  4. Carl BaldwinNov 3, 2005
  5. Junio C HamanoNov 3, 2005
  6. Paul CollinsNov 4, 2005
  7. Junio C HamanoNov 4, 2005
  8. Junio C HamanoNov 4, 2005
  9. Paul CollinsNov 4, 2005
  10. Junio C HamanoNov 4, 2005
  11. Paul CollinsNov 4, 2005
  12. Linus TorvaldsNov 4, 2005
  13. git-proxy updates.Junio C Hamano, Nov 19, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.