From: Jim Meyering <jim@meyering.net>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [PATCH 2/2] Check for IO errors after running a command
Date: Mon, 25 Jun 2007 21:54:54 +0200 [thread overview]
Message-ID: <871wfzvmgh.fsf@rho.meyering.net> (raw)
In-Reply-To: <alpine.LFD.0.98.0706241010480.3593@woody.linux-foundation.org> (Linus Torvalds's message of "Sun\, 24 Jun 2007 10\:29\:33 -0700 \(PDT\)")
Linus Torvalds <torvalds@linux-foundation.org> wrote:
> 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.
...
> Hmm? I'm not saying this is the only way to do this, but I think this is
> at least likely to be obviously just an improvement, and it leaves room
> for further tweaking of the logic if Jim or others find other cases that
> should be handled.
...
> + /* Check for ENOSPC and EIO errors.. */
> + if (!fstat(fileno(stdout), &st) && S_ISREG(st.st_mode)) {
> + if (ferror(stdout))
> + die("write failure on standard output");
> + if (fflush(stdout) || fclose(stdout))
> + die("write failure on standard output: %s", strerror(errno));
> + }
> + exit(0);
Here is a patch relative to "next", to restore some of the
functionality that was provided by my initially-proposed change.
>From 379aee16596d29b83c95068964c349399b9b9f47 Mon Sep 17 00:00:00 2001
From: Jim Meyering <jim@meyering.net>
Date: Mon, 25 Jun 2007 18:54:12 +0200
Subject: [PATCH] When detecting write failure, print strerror when possible.
Do not call "die" solely on the basis of ferror.
Instead, call both ferror and fclose, and *then* decide whether/how to die.
Without this patch, some commands unnecessarily omit strerror(errno)
when they fail:
$ ./git-ls-tree HEAD > /dev/full
fatal: write failure on standard output
With the patch, git reports the desired ENOSPC diagnostic:
fatal: write failure on standard output: No space left on device
FWIW, this version of close_stream is similar to the one
I included in another recent patch, but, is slightly cleaner.
Also, rather than returning zero or EOF, this one simply returns
zero or nonzero.
* git.c (close_stream): New function.
(run_command): Don't die solely because of ferror. Use close_stream.
Signed-off-by: Jim Meyering <jim@meyering.net>
---
git.c | 26 ++++++++++++++++++++++----
1 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/git.c b/git.c
index b949cbb..b00bb1c 100644
--- a/git.c
+++ b/git.c
@@ -246,6 +246,21 @@ struct cmd_struct {
int option;
};
+static int
+close_stream(FILE *stream)
+{
+ int prev_fail = ferror(stream);
+ int fclose_fail = fclose(stream);
+
+ /* If there was a previous failure, but fclose succeeded,
+ clear errno, since ferror does not set it, and its value
+ may be unrelated to the ferror-reported failure. */
+ if (prev_fail && !fclose_fail)
+ errno = 0;
+
+ return prev_fail || fclose_fail;
+}
+
static int run_command(struct cmd_struct *p, int argc, const char **argv)
{
int status;
@@ -274,10 +289,13 @@ 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))
- die("write failure on standard output: %s", strerror(errno));
+ if (close_stream(stdout)) {
+ if (errno == 0)
+ die("write failure on standard output");
+ else
+ die("write failure on standard output: %s",
+ strerror(errno));
+ }
return 0;
}
next prev parent reply other threads:[~2007-06-25 19:54 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-23 15:13 (resend) [PATCH] Don't ignore write failure from git-diff, git-log, etc Jim Meyering
2007-06-24 9:01 ` Junio C Hamano
2007-06-24 17:08 ` Linus Torvalds
2007-06-24 17:10 ` [PATCH 1/2] Clean up internal command handling Linus Torvalds
2007-06-24 17:29 ` [PATCH 2/2] Check for IO errors after running a command Linus Torvalds
2007-06-25 9:44 ` Junio C Hamano
2007-06-25 13:20 ` Johannes Schindelin
2007-06-25 13:42 ` Johannes Sixt
2007-06-25 14:01 ` Jim Meyering
2007-06-25 15:57 ` Linus Torvalds
2007-06-26 13:33 ` Matthias Lederhofer
2007-06-25 19:54 ` Jim Meyering [this message]
2007-06-24 19:13 ` (resend) [PATCH] Don't ignore write failure from git-diff, git-log, etc Jim Meyering
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871wfzvmgh.fsf@rho.meyering.net \
--to=jim@meyering.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.