Change git_connect() to return a struct child_process instead of a pid_t.

This prepares the API of git_connect() and finish_connect() to operate on
a struct child_process. Currently, we just use that object as a placeholder
for the pid that we used to return. A follow-up patch will change the
implementation of git_connect() and finish_connect() to make full use
of the object.

Old code had early-return-on-error checks at the calling sites of
git_connect(), but since git_connect() dies on errors anyway, these checks
were removed.

[sp: Corrected style nit of "conn == NULL" to "!conn"]

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Johannes Sixt
2007-10-19 21:47:53 +02:00
committed by Shawn O. Pearce
parent ca5bb5d539
commit 98158e9cfd
7 changed files with 33 additions and 43 deletions

View File

@ -468,21 +468,22 @@ char *get_port(char *host)
}
/*
* This returns 0 if the transport protocol does not need fork(2),
* or a process id if it does. Once done, finish the connection
* This returns NULL if the transport protocol does not need fork(2), or a
* struct child_process object if it does. Once done, finish the connection
* with finish_connect() with the value returned from this function
* (it is safe to call finish_connect() with 0 to support the former
* (it is safe to call finish_connect() with NULL to support the former
* case).
*
* Does not return a negative value on error; it just dies.
* If it returns, the connect is successful; it just dies on errors.
*/
pid_t git_connect(int fd[2], char *url, const char *prog, int flags)
struct child_process *git_connect(int fd[2], char *url,
const char *prog, int flags)
{
char *host, *path = url;
char *end;
int c;
int pipefd[2][2];
pid_t pid;
struct child_process *conn;
enum protocol protocol = PROTO_LOCAL;
int free_path = 0;
char *port = NULL;
@ -568,15 +569,16 @@ pid_t git_connect(int fd[2], char *url, const char *prog, int flags)
free(target_host);
if (free_path)
free(path);
return 0;
return NULL;
}
if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0)
die("unable to create pipe pair for communication");
pid = fork();
if (pid < 0)
conn = xcalloc(1, sizeof(*conn));
conn->pid = fork();
if (conn->pid < 0)
die("unable to fork");
if (!pid) {
if (!conn->pid) {
struct strbuf cmd;
strbuf_init(&cmd, MAX_CMD_LEN);
@ -625,17 +627,18 @@ pid_t git_connect(int fd[2], char *url, const char *prog, int flags)
close(pipefd[1][0]);
if (free_path)
free(path);
return pid;
return conn;
}
int finish_connect(pid_t pid)
int finish_connect(struct child_process *conn)
{
if (pid == 0)
if (!conn)
return 0;
while (waitpid(pid, NULL, 0) < 0) {
while (waitpid(conn->pid, NULL, 0) < 0) {
if (errno != EINTR)
return -1;
}
free(conn);
return 0;
}