iMake xread/xwrite more robust - dedup - deduplicating backup program Err bitreich.org 70 hgit clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ URL:git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ bitreich.org 70 1Log /scm/dedup/log.gph bitreich.org 70 1Files /scm/dedup/files.gph bitreich.org 70 1Refs /scm/dedup/refs.gph bitreich.org 70 1Tags /scm/dedup/tag bitreich.org 70 1README /scm/dedup/file/README.gph bitreich.org 70 1LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 6a3036917037d4f8688c8c6b3edcfeff96f0f775 /scm/dedup/commit/6a3036917037d4f8688c8c6b3edcfeff96f0f775.gph bitreich.org 70 1parent 9220cd260336728228b3ece0f09864b171fd9217 /scm/dedup/commit/9220cd260336728228b3ece0f09864b171fd9217.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Wed, 21 Mar 2018 23:18:11 +0000 Err bitreich.org 70 i Err bitreich.org 70 iMake xread/xwrite more robust Err bitreich.org 70 i Err bitreich.org 70 iShould work on FIFOs etc. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M TODO | 1 - Err bitreich.org 70 i M dedup.c | 42 ++++++++++++++++++++++--------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 30 insertions(+), 13 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/dedup/file/TODO.gph bitreich.org 70 i@@ -1,4 +1,3 @@ Err bitreich.org 70 i endianness agnostic Err bitreich.org 70 i version field in entry header Err bitreich.org 70 i lseek64 support Err bitreich.org 70 i-loop around in xread/xwrite so it works on FIFOs etc. Err bitreich.org 70 1diff --git a/dedup.c b/dedup.c /scm/dedup/file/dedup.c.gph bitreich.org 70 i@@ -112,23 +112,41 @@ str2bin(char *s, uint8_t *d) Err bitreich.org 70 i ssize_t Err bitreich.org 70 i xread(int fd, void *buf, size_t nbytes) Err bitreich.org 70 i { Err bitreich.org 70 i- ssize_t n; Err bitreich.org 70 i- Err bitreich.org 70 i- n = read(fd, buf, nbytes); Err bitreich.org 70 i- if (n < 0) Err bitreich.org 70 i- err(1, "read"); Err bitreich.org 70 i- return n; Err bitreich.org 70 i+ unsigned char *bp = buf; Err bitreich.org 70 i+ ssize_t total = 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while (nbytes > 0) { Err bitreich.org 70 i+ ssize_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = read(fd, &bp[total], nbytes); Err bitreich.org 70 i+ if (n < 0) Err bitreich.org 70 i+ err(1, "read"); Err bitreich.org 70 i+ else if (n == 0) Err bitreich.org 70 i+ return total; Err bitreich.org 70 i+ total += n; Err bitreich.org 70 i+ nbytes -= n; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ return total; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i ssize_t Err bitreich.org 70 i xwrite(int fd, const void *buf, size_t nbytes) Err bitreich.org 70 i { Err bitreich.org 70 i- ssize_t n; Err bitreich.org 70 i- Err bitreich.org 70 i- n = write(fd, buf, nbytes); Err bitreich.org 70 i- if (n < 0) Err bitreich.org 70 i- err(1, "write"); Err bitreich.org 70 i- return n; Err bitreich.org 70 i+ const unsigned char *bp = buf; Err bitreich.org 70 i+ ssize_t total = 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while (nbytes > 0) { Err bitreich.org 70 i+ ssize_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = write(fd, &bp[total], nbytes); Err bitreich.org 70 i+ if (n < 0) Err bitreich.org 70 i+ err(1, "write"); Err bitreich.org 70 i+ else if (n == 0) Err bitreich.org 70 i+ return total; Err bitreich.org 70 i+ total += n; Err bitreich.org 70 i+ nbytes -= n; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ return total; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 .