summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 47d0b4f)
raw | patch | inline | side by side (parent: 47d0b4f)
author | Linus Torvalds <torvalds@linux-foundation.org> | |
Sun, 24 Jun 2007 17:29:33 +0000 (10:29 -0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 25 Jun 2007 05:56:40 +0000 (22:56 -0700) |
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>
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>
git.c | patch | blob | history |
index 911fd3dabb7bca08365e9dd68a5b52bcb7bdbe6d..c65e52f3db908f30fba85b9b57e5a72aebd45c3f 100644 (file)
--- a/git.c
+++ b/git.c
static int run_command(struct cmd_struct *p, int argc, const char **argv)
{
+ int status;
+ struct stat st;
const char *prefix;
prefix = NULL;
}
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)