summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2007-06-30 11:44:20 -0700
committerJunio C Hamano <gitster@pobox.com>2007-06-30 11:44:20 -0700
commit0227f9887bcc158dcd22ac4f60e5e428b259dd2d (patch)
tree680051d375062ab8882b9b3903d57dea59490f61
parent39741ab1c54c6e7411b983f2a64d5813bc5b4059 (diff)
downloadgit-0227f9887bcc158dcd22ac4f60e5e428b259dd2d.tar.gz
git: Try a bit harder not to lose errno in stdio
This switches the checks around upon the exit codepath of the git wrapper, so that we may recover at least non-transient errors. It's still not perfect. As I've been harping on, stdio simply isn't very good for error reporting. For example, if an IO error happened, you'd want to see EIO, wouldn't you? And yes, that's what the kernel would return. However, with buffered stdio (and flushing outside of our control), what would likely happen is that some intermediate error return _does_ return EIO, but then the kernel might decide to re-mount the filesystem read-only due to the error, and the actual *report* for us might be "write failure on standard output: read-only filesystem" which lost the EIO. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--git.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/git.c b/git.c
index c65e52f3db..cfec5d70ee 100644
--- a/git.c
+++ b/git.c
@@ -251,11 +251,12 @@ static int run_command(struct cmd_struct *p, int argc, const char **argv)
return 0;
/* Check for ENOSPC and EIO errors.. */
- if (ferror(stdout))
- die("write failure on standard output");
- if (fflush(stdout) || fclose(stdout))
+ if (fflush(stdout))
die("write failure on standard output: %s", strerror(errno));
-
+ if (ferror(stdout))
+ die("unknown write failure on standard output");
+ if (fclose(stdout))
+ die("close failed on standard output: %s", strerror(errno));
return 0;
}