Skip to content

Commit

Permalink
Check for IO errors after running a command
Browse files Browse the repository at this point in the history
This is trying to implement the strict IO error checks that Jim Meyering
suggested, but explicitly limits it to just regular files. If a pipe gets
closed on us, we shouldn't complain about it.

If the subcommand already returned an error, that takes precedence (and we
assume that the subcommand already printed out any relevant messages
relating to it)

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Jun 25, 2007
1 parent 47d0b4f commit 0f15731
Showing 1 changed file with 20 additions and 1 deletion.
21 changes: 20 additions & 1 deletion git.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ struct cmd_struct {

static int run_command(struct cmd_struct *p, int argc, const char **argv)
{
int status;
struct stat st;
const char *prefix;

prefix = NULL;
Expand All @@ -237,7 +239,24 @@ static int run_command(struct cmd_struct *p, int argc, const char **argv)
}
trace_argv_printf(argv, argc, "trace: built-in: git");

return p->fn(argc, argv, prefix);
status = p->fn(argc, argv, prefix);
if (status)
return status;

/* Somebody closed stdout? */
if (fstat(fileno(stdout), &st))
return 0;
/* Ignore write errors for pipes and sockets.. */
if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode))
return 0;

/* Check for ENOSPC and EIO errors.. */
if (ferror(stdout))
die("write failure on standard output");
if (fflush(stdout) || fclose(stdout))
die("write failure on standard output: %s", strerror(errno));

return 0;
}

static void handle_internal_command(int argc, const char **argv)
Expand Down

0 comments on commit 0f15731

Please sign in to comment.