Jeff King wrote: > In an ideal world, callers would always distinguish between > these cases and give a useful message for each. But as an > easy way to make our imperfect world better, let's reset > errno to a known value. The best we can do is "0", which > will yield something like: > > unable to read: Success > > That's not great, but at least it's deterministic and makes > it clear that we didn't see an error from read(). Yuck. Can we set errno to something more specific instead? read(2) also doesn't promise not to clobber errno on success. How about something like the following? -- >8 -- Subject: read_in_full: set errno for partial reads Many callers of read_in_full() complain when we do not read their full byte-count. But a check like: if (read_in_full(fd, buf, len) != len) return error_errno("unable to read"); conflates two problem conditions: 1. A real error from read(). 2. There were fewer than "len" bytes available. In the first case, showing the user strerror(errno) is useful. In the second, we may see a random errno that was set by some previous system call. In an ideal world, callers would always distinguish between these cases and give a useful message for each. But as an easy way to make our imperfect world better, let's set errno in the second case to a known value. There is no standard "Unexpected end of file" errno value, so instead use EILSEQ, which yields a message like unable to read: Illegal byte sequence That's not great, but at least it's deterministic and makes it possible to reverse-engineer what went wrong. Change-Id: I48138052f71b7c6cf35c2d00a10dc8febaca4f10 Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- wrapper.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wrapper.c b/wrapper.c index 61aba0b5c1..1842a99b87 100644 --- a/wrapper.c +++ b/wrapper.c @@ -318,8 +318,10 @@ ssize_t read_in_full(int fd, void *buf, size_t count) ssize_t loaded = xread(fd, p, count); if (loaded < 0) return -1; - if (loaded == 0) + if (loaded == 0) { + errno = EILSEQ; return total; + } count -= loaded; p += loaded; total += loaded; -- 2.14.1.821.g8fa685d3b7