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