Factor out the ssh connection stuff from send-pack.c

I want to use it for git-fetch-pack too.
diff --git a/Makefile b/Makefile
index f55169e..e7a2644 100644
--- a/Makefile
+++ b/Makefile
@@ -52,7 +52,7 @@
 
 LIB_OBJS=read-cache.o sha1_file.o usage.o object.o commit.o tree.o blob.o \
 	 tag.o date.o index.o diff-delta.o patch-delta.o entry.o \
-	 epoch.o refs.o csum-file.o pack-check.o pkt-line.o
+	 epoch.o refs.o csum-file.o pack-check.o pkt-line.o connect.o
 LIB_FILE=libgit.a
 LIB_H=cache.h object.h blob.h tree.h commit.h tag.h delta.h epoch.h csum-file.h \
 	pack.h pkt-line.h refs.h
diff --git a/cache.h b/cache.h
index bf589a8..52842a0 100644
--- a/cache.h
+++ b/cache.h
@@ -259,6 +259,9 @@
 	struct packed_git *p;
 };
 
+extern int git_connect(int fd[2], char *url, const char *prog);
+extern int finish_connect(pid_t pid);
+
 extern void prepare_packed_git(void);
 extern int use_packed_git(struct packed_git *);
 extern void unuse_packed_git(struct packed_git *);
diff --git a/connect.c b/connect.c
new file mode 100644
index 0000000..60b87f5
--- /dev/null
+++ b/connect.c
@@ -0,0 +1,86 @@
+#include "cache.h"
+#include <sys/wait.h>
+
+/*
+ * First, make it shell-safe.  We do this by just disallowing any
+ * special characters. Somebody who cares can do escaping and let
+ * through the rest. But since we're doing to feed this to ssh as
+ * a command line, we're going to be pretty damn anal for now.
+ */
+static char *shell_safe(char *url)
+{
+	char *n = url;
+	unsigned char c;
+	static const char flags[256] = {
+		['0'...'9'] = 1,
+		['a'...'z'] = 1,
+		['A'...'Z'] = 1,
+		['.'] = 1, ['/'] = 1,
+		['-'] = 1, ['+'] = 1,
+		[':'] = 1
+	};
+
+	while ((c = *n++) != 0) {
+		if (flags[c] != 1)
+			die("I don't like '%c'. Sue me.", c);
+	}
+	return url;
+}
+
+/*
+ * Yeah, yeah, fixme. Need to pass in the heads etc.
+ */
+int git_connect(int fd[2], char *url, const char *prog)
+{
+	char command[1024];
+	const char *host, *path;
+	char *colon;
+	int pipefd[2][2];
+	pid_t pid;
+
+	url = shell_safe(url);
+	host = NULL;
+	path = url;
+	colon = strchr(url, ':');
+	if (colon) {
+		*colon = 0;
+		host = url;
+		path = colon+1;
+	}
+	snprintf(command, sizeof(command), "%s %s", prog, path);
+	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]);
+		if (host)
+			execlp("ssh", "ssh", host, command, NULL);
+		else
+			execlp("sh", "sh", "-c", command, NULL);
+		die("exec failed");
+	}		
+	fd[0] = pipefd[0][0];
+	fd[1] = pipefd[1][1];
+	close(pipefd[0][1]);
+	close(pipefd[1][0]);
+	return pid;
+}
+
+int finish_connect(pid_t pid)
+{
+	int ret;
+
+	for (;;) {
+		ret = waitpid(pid, NULL, 0);
+		if (!ret)
+			break;
+		if (errno != EINTR)
+			break;
+	}
+	return ret;
+}
diff --git a/send-pack.c b/send-pack.c
index 3c6abae..57e88a7 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -1,6 +1,5 @@
 #include "cache.h"
 #include "pkt-line.h"
-#include <sys/wait.h>
 
 static const char send_pack_usage[] = "git-send-pack [--exec=other] destination [heads]*";
 static const char *exec = "git-receive-pack";
@@ -184,76 +183,6 @@
 	return 0;
 }
 
-/*
- * First, make it shell-safe.  We do this by just disallowing any
- * special characters. Somebody who cares can do escaping and let
- * through the rest. But since we're doing to feed this to ssh as
- * a command line, we're going to be pretty damn anal for now.
- */
-static char *shell_safe(char *url)
-{
-	char *n = url;
-	unsigned char c;
-	static const char flags[256] = {
-		['0'...'9'] = 1,
-		['a'...'z'] = 1,
-		['A'...'Z'] = 1,
-		['.'] = 1, ['/'] = 1,
-		['-'] = 1, ['+'] = 1,
-		[':'] = 1
-	};
-
-	while ((c = *n++) != 0) {
-		if (flags[c] != 1)
-			die("I don't like '%c'. Sue me.", c);
-	}
-	return url;
-}
-
-/*
- * Yeah, yeah, fixme. Need to pass in the heads etc.
- */
-static int setup_connection(int fd[2], char *url, char **heads)
-{
-	char command[1024];
-	const char *host, *path;
-	char *colon;
-	int pipefd[2][2];
-	pid_t pid;
-
-	url = shell_safe(url);
-	host = NULL;
-	path = url;
-	colon = strchr(url, ':');
-	if (colon) {
-		*colon = 0;
-		host = url;
-		path = colon+1;
-	}
-	snprintf(command, sizeof(command), "%s %s", exec, path);
-	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]);
-		if (host)
-			execlp("ssh", "ssh", host, command, NULL);
-		else
-			execlp("sh", "sh", "-c", command, NULL);
-		die("exec failed");
-	}		
-	fd[0] = pipefd[0][0];
-	fd[1] = pipefd[1][1];
-	close(pipefd[0][1]);
-	close(pipefd[1][0]);
-	return pid;
-}
-
 int main(int argc, char **argv)
 {
 	int i, nr_heads = 0;
@@ -280,12 +209,12 @@
 	}
 	if (!dest)
 		usage(send_pack_usage);
-	pid = setup_connection(fd, dest, heads);
+	pid = git_connect(fd, dest, exec);
 	if (pid < 0)
 		return 1;
 	ret = send_pack(fd[0], fd[1], nr_heads, heads);
 	close(fd[0]);
 	close(fd[1]);
-	waitpid(pid, NULL, 0);
+	finish_connect(pid);
 	return ret;
 }