diff options
-rw-r--r-- | git.c | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -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; @@ -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) |