From: Jonas Fonseca Date: Fri, 22 Aug 2008 10:10:35 GMT Subject: Re: [tig PATCH] continue updates when pipe read has errno "Success" Message-ID: <2c6b72b30808220310v1083e860tef9fd6efa57767e3@mail.gmail.com> In-Reply-To: <20080821014043.GA14452@coredump.intra.peff.net> On Thu, Aug 21, 2008 at 03:40, Jeff King wrote: > When we are reading from a pipe and receive a signal, our > read call fails and ferror() returns true. The current > behavior is to call end_update and report failure. However, > we can detect this situation by checking that errno is set > to success and continue the reading process. Thanks for the fix/workaround! > I am not convinced this is the right solution. Specifically: > > - there are a few other calls to ferror. Maybe they should be > converted, too, which implies that perhaps there is a better idiom > for checking this. Well, perhaps something like this can work around the issue for tig-0.12: bool check_ferror(FILE *file) { return ferror(file) && errno != 0; } For a possible "better" fix, I have been working on moving tig to use the run-command.[ch] code from git, which means that ferror() will no longer be needed. It is still not ready but looks promising. > - I have no idea how portable this is. Do all stdio implementations > fail to restart on signal? Do they all set ferror and have errno == > 0 (I would have expected EINTR, or at the very least a 0-read > without ferror set)? > > But it works for me (Linux, glibc 2.7). I have tested it on FreeBSD which doesn't seem to have this problem with ferror(). Anyway, the workaround doesn't break anything so applied. -- Jonas Fonseca