All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Refactor git_tcp_connect() functions a little.
@ 2006-06-07  3:58 Jon Loeliger
  2006-06-07  4:53 ` Junio C Hamano
  0 siblings, 1 reply; 2+ messages in thread
From: Jon Loeliger @ 2006-06-07  3:58 UTC (permalink / raw)
  To: git

Add client side sending of "\0host=%s\0" extended
arg for git native protocol, backwards compatibly.

Signed-off-by: Jon Loeliger <jdl@jdl.com>
---
 connect.c |   42 ++++++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 10 deletions(-)

I've tested this against an "old" daemon, and my new daemon
running on jdl.com that understands the new host=%s parameter.
Both appear to work still.

However, I don't have a setup to test a proxy connection,
and I left FIXME: down there asking the question if it is
even needed in this case as well.  I _think_ so, but I am
just not sure.  (It should be a straight pass-through to
another git: native protocol, right?)

And if it is needed there too, do you want to refactor
these two packet_writes() for commonality again?


diff --git a/connect.c b/connect.c
index 54f7bf7..3fa890d 100644
--- a/connect.c
+++ b/connect.c
@@ -322,7 +322,10 @@ #define STR(s)	STR_(s)
 
 #ifndef NO_IPV6
 
-static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
+/*
+ * Returns a connected socket() fd, or else die()s.
+ */
+static int git_tcp_connect_sock(char *host)
 {
 	int sockfd = -1;
 	char *colon, *end;
@@ -356,7 +359,8 @@ static int git_tcp_connect(int fd[2], co
 		die("Unable to look up %s (%s)", host, gai_strerror(gai));
 
 	for (ai0 = ai; ai; ai = ai->ai_next) {
-		sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+		sockfd = socket(ai->ai_family,
+				ai->ai_socktype, ai->ai_protocol);
 		if (sockfd < 0)
 			continue;
 		if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
@@ -372,15 +376,15 @@ static int git_tcp_connect(int fd[2], co
 	if (sockfd < 0)
 		die("unable to connect a socket (%s)", strerror(errno));
 
-	fd[0] = sockfd;
-	fd[1] = sockfd;
-	packet_write(sockfd, "%s %s\n", prog, path);
-	return 0;
+	return sockfd;
 }
 
 #else /* NO_IPV6 */
 
-static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
+/*
+ * Returns a connected socket() fd, or else die()s.
+ */
+static int git_tcp_connect_sock(char *host)
 {
 	int sockfd = -1;
 	char *colon, *end;
@@ -407,7 +411,6 @@ static int git_tcp_connect(int fd[2], co
 		port = colon + 1;
 	}
 
-
 	he = gethostbyname(host);
 	if (!he)
 		die("Unable to look up %s (%s)", host, hstrerror(h_errno));
@@ -441,13 +444,29 @@ static int git_tcp_connect(int fd[2], co
 	if (sockfd < 0)
 		die("unable to connect a socket (%s)", strerror(errno));
 
+	return sockfd;
+}
+
+#endif /* NO_IPV6 */
+
+
+static int git_tcp_connect(int fd[2],
+			   const char *prog, char *host, char *path)
+{
+	int sockfd = git_tcp_connect_sock(host);
+
 	fd[0] = sockfd;
 	fd[1] = sockfd;
-	packet_write(sockfd, "%s %s\n", prog, path);
+
+	/*
+	 * Separate original protocol components prog and path
+	 * from extended components with a NUL byte.
+	 */
+	packet_write(sockfd, "%s %s%chost=%s%c", prog, path, 0, host, 0);
+
 	return 0;
 }
 
-#endif /* NO_IPV6 */
 
 static char *git_proxy_command = NULL;
 static const char *rhost_name = NULL;
@@ -551,7 +570,10 @@ static int git_proxy_connect(int fd[2], 
 	fd[1] = pipefd[1][1];
 	close(pipefd[0][1]);
 	close(pipefd[1][0]);
+
+	/* FIXME: Does this need %chost=%s%c tacked on here too? */
 	packet_write(fd[1], "%s %s\n", prog, path);
+
 	return pid;
 }
 
-- 
1.4.0.rc1.ga6a5-dirty

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-06-07  4:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-07  3:58 [PATCH] Refactor git_tcp_connect() functions a little Jon Loeliger
2006-06-07  4:53 ` Junio C Hamano

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.