Skip to content

Commit

Permalink
Avoid a dup2(2) in apply_filter() - start_command() can do it for us.
Browse files Browse the repository at this point in the history
When apply_filter() runs the external (clean or smudge) filter program, it
needs to pass the writable end of a pipe as its stdout. For this purpose,
it used to dup2(2) the file descriptor explicitly to stdout. Now we use
the facilities of start_command() to do it for us.

Furthermore, the path argument of a subordinate function, filter_buffer(),
was not used, so here we replace it to pass the fd instead.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
Johannes Sixt authored and Shawn O. Pearce committed Oct 21, 2007
1 parent a0ae35a commit 7683b6e
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len,
return 1;
}

static int filter_buffer(const char *path, const char *src,
static int filter_buffer(int fd, const char *src,
unsigned long size, const char *cmd)
{
/*
Expand All @@ -205,6 +205,7 @@ static int filter_buffer(const char *path, const char *src,
memset(&child_process, 0, sizeof(child_process));
child_process.argv = argv;
child_process.in = -1;
child_process.out = fd;

if (start_command(&child_process))
return error("cannot fork to run external filter %s", cmd);
Expand Down Expand Up @@ -254,10 +255,8 @@ static int apply_filter(const char *path, const char *src, size_t len,
return 0;
}
if (!child_process.pid) {
dup2(pipe_feed[1], 1);
close(pipe_feed[0]);
close(pipe_feed[1]);
exit(filter_buffer(path, src, len, cmd));
exit(filter_buffer(pipe_feed[1], src, len, cmd));
}
close(pipe_feed[1]);

Expand Down

0 comments on commit 7683b6e

Please sign in to comment.