diff options
author | Michael Vogt <mvo@ubuntu.com> | 2012-12-26 23:52:47 +0100 |
---|---|---|
committer | Michael Vogt <mvo@ubuntu.com> | 2012-12-26 23:52:47 +0100 |
commit | d2cca6ec46865a1f5167f846e67150dc19ca2022 (patch) | |
tree | 43d335f69870a72b97fa41a1b208784b8753d354 /methods/rred.cc | |
parent | 7735ad0500b6fefef03b2a3dc2a6843e82353e94 (diff) | |
parent | d663a4c8a8723ae4936d10d0a98ea2c05a29cbc4 (diff) |
merged from the debian-sid branch
Diffstat (limited to 'methods/rred.cc')
-rw-r--r-- | methods/rred.cc | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/methods/rred.cc b/methods/rred.cc index 1e352d0e7..7c65f8f92 100644 --- a/methods/rred.cc +++ b/methods/rred.cc @@ -15,7 +15,6 @@ #include <utime.h> #include <stdio.h> #include <errno.h> -#include <zlib.h> #include <apti18n.h> /*}}}*/ /** \brief RredMethod - ed-style incremential patch method {{{ @@ -227,6 +226,21 @@ struct EdCommand { char type; }; #define IOV_COUNT 1024 /* Don't really want IOV_MAX since it can be arbitrarily large */ +static ssize_t retry_writev(int fd, const struct iovec *iov, int iovcnt) { + ssize_t Res; + errno = 0; + ssize_t i = 0; + do { + Res = writev(fd, iov + i, iovcnt); + if (Res < 0 && errno == EINTR) + continue; + if (Res < 0) + return _error->Errno("writev",_("Write error")); + iovcnt -= Res; + i += Res; + } while (Res > 0 && iovcnt > 0); + return i; +} #endif /*}}}*/ RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From, /*{{{*/ @@ -377,7 +391,7 @@ RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From, /*{{{*/ hash->Add((const unsigned char*) begin, input - begin); if(++iov_size == IOV_COUNT) { - writev(out_file.Fd(), iov, IOV_COUNT); + retry_writev(out_file.Fd(), iov, IOV_COUNT); iov_size = 0; } } @@ -402,7 +416,7 @@ RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From, /*{{{*/ iov[iov_size].iov_len); if(++iov_size == IOV_COUNT) { - writev(out_file.Fd(), iov, IOV_COUNT); + retry_writev(out_file.Fd(), iov, IOV_COUNT); iov_size = 0; } } @@ -417,15 +431,15 @@ RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From, /*{{{*/ } if(iov_size) { - writev(out_file.Fd(), iov, iov_size); + retry_writev(out_file.Fd(), iov, iov_size); iov_size = 0; } for(i = 0; i < iov_size; i += IOV_COUNT) { if(iov_size - i < IOV_COUNT) - writev(out_file.Fd(), iov + i, iov_size - i); + retry_writev(out_file.Fd(), iov + i, iov_size - i); else - writev(out_file.Fd(), iov + i, IOV_COUNT); + retry_writev(out_file.Fd(), iov + i, IOV_COUNT); } delete [] iov; |