From: Junio C Hamano Date: Wed, 22 Apr 2020 20:42:46 +0000 (-0700) Subject: Merge branch 'dl/wrapper-fix-indentation' X-Git-Tag: v2.27.0-rc0~124 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b660a76d0f0f6b7bbf7e7d0b619edf0decc9d22e;p=thirdparty%2Fgit.git Merge branch 'dl/wrapper-fix-indentation' Coding style fix. * dl/wrapper-fix-indentation: wrapper: indent with tabs --- b660a76d0f0f6b7bbf7e7d0b619edf0decc9d22e diff --cc wrapper.c index e1eaef2e16,0d5108bab6..3a1c0e0526 --- a/wrapper.c +++ b/wrapper.c @@@ -218,15 -147,11 +218,15 @@@ ssize_t xread(int fd, void *buf, size_ { ssize_t nr; if (len > MAX_IO_SIZE) - len = MAX_IO_SIZE; + len = MAX_IO_SIZE; while (1) { nr = read(fd, buf, len); - if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) - continue; + if (nr < 0) { + if (errno == EINTR) + continue; + if (handle_nonblock(fd, POLLIN, errno)) + continue; + } return nr; } } @@@ -240,32 -165,9 +240,32 @@@ ssize_t xwrite(int fd, const void *buf { ssize_t nr; if (len > MAX_IO_SIZE) - len = MAX_IO_SIZE; + len = MAX_IO_SIZE; while (1) { nr = write(fd, buf, len); + if (nr < 0) { + if (errno == EINTR) + continue; + if (handle_nonblock(fd, POLLOUT, errno)) + continue; + } + + return nr; + } +} + +/* + * xpread() is the same as pread(), but it automatically restarts pread() + * operations with a recoverable error (EAGAIN and EINTR). xpread() DOES + * NOT GUARANTEE that "len" bytes is read even if the data is available. + */ +ssize_t xpread(int fd, void *buf, size_t len, off_t offset) +{ + ssize_t nr; + if (len > MAX_IO_SIZE) + len = MAX_IO_SIZE; + while (1) { + nr = pread(fd, buf, len, offset); if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) continue; return nr;