On 04/08, Paul Eggert wrote:
> Simply switching from safe_read to full_read would lose an errno value if
> there's an I/O error, so that patch alone wouldn't suffice for GNU 'tar'.
Can you elaborate? I can't find a code path that loses the errno.
'full_read' breaks if safe_read returns an error (-1), preserving errno. It only
overwrites errno if read returns 0/EOF, which should never happen in
create_regular_file's case as we know the exact size of the file at the point,
so the only way it hits that path is if the file really shrunk.
size_t n_rw = safe_rw (fd, ptr, count);
if (n_rw == (size_t) -1)
break;
if (n_rw == 0)
{
errno = ZERO_BYTE_TRANSFER_ERRNO;
break;
}
Perhaps this has to do with some minute detail of how read works that I'm
unfamiliar with?