I just noticed that dd may discard read data in the presence of I/O errors. Would something like this suffice?
cheers, Pádraig. diff --git a/src/dd.c b/src/dd.c index 1a0e177..a1d47ff 100644 --- a/src/dd.c +++ b/src/dd.c @@ -811,12 +811,28 @@ static ssize_t iread_fullblock (int fd, char *buf, size_t size) { ssize_t nread = 0; + static iread_errno; + + /* Return a pending error. */ + if (iread_errno) + { + errno = iread_errno; + iread_errno = 0; + return -1; + } while (0 < size) { ssize_t ncurr = iread (fd, buf, size); if (ncurr < 0) - return ncurr; + { + if (nread > 0) + { + iread_errno = errno; + ncurr = nread; + } + return ncurr; + } if (ncurr == 0) break; nread += ncurr;