iWrapper to check for read/write failures - 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 d0b30d153d3b50be6952cfdf5613239ad46d576f /scm/dedup/commit/d0b30d153d3b50be6952cfdf5613239ad46d576f.gph bitreich.org 70 1parent 6f277b62999ea260b734120ad894fa3d16357daf /scm/dedup/commit/6f277b62999ea260b734120ad894fa3d16357daf.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Wed, 21 Mar 2018 09:44:12 +0000 Err bitreich.org 70 i Err bitreich.org 70 iWrapper to check for read/write failures Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 46 ++++++++++++++++++++++--------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 33 insertions(+), 13 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/dedup.c b/dedup.c /scm/dedup/file/dedup.c.gph bitreich.org 70 i@@ -88,19 +88,41 @@ dump_blk(struct blk *blk) Err bitreich.org 70 i fprintf(stderr, "blk->sz: %lld\n", (unsigned long long)blk->sz); Err bitreich.org 70 i } Err bitreich.org 70 i 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+} 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+} Err bitreich.org 70 i+ Err bitreich.org 70 i void Err bitreich.org 70 i append_ent(struct ent *ent) Err bitreich.org 70 i { Err bitreich.org 70 i /* Update index header */ Err bitreich.org 70 i enthdr.nents++; Err bitreich.org 70 i lseek(ifd, 0, SEEK_SET); Err bitreich.org 70 i- write(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i+ xwrite(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i Err bitreich.org 70 i /* Append entry */ Err bitreich.org 70 i lseek(ifd, 0, SEEK_END); Err bitreich.org 70 i ent->sz = sizeof(*ent); Err bitreich.org 70 i ent->sz += ent->nblks * sizeof(ent->blks[0]); Err bitreich.org 70 i- write(ifd, ent, ent->sz); Err bitreich.org 70 i+ xwrite(ifd, ent, ent->sz); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i struct ent * Err bitreich.org 70 i@@ -142,14 +164,14 @@ void Err bitreich.org 70 i read_blk(struct blk *blk, off_t blkidx) Err bitreich.org 70 i { Err bitreich.org 70 i lseek(sfd, blkidx * sizeof(*blk), SEEK_SET); Err bitreich.org 70 i- read(sfd, blk, sizeof(*blk)); Err bitreich.org 70 i+ xread(sfd, blk, sizeof(*blk)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i append_blk(struct blk *blk) Err bitreich.org 70 i { Err bitreich.org 70 i lseek(sfd, 0, SEEK_END); Err bitreich.org 70 i- write(sfd, blk, sizeof(*blk)); Err bitreich.org 70 i+ xwrite(sfd, blk, sizeof(*blk)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i@@ -182,7 +204,7 @@ dedup(int fd) Err bitreich.org 70 i Err bitreich.org 70 i ent = alloc_ent(); Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i- while ((n = read(fd, blk.data, BLKSIZ)) > 0) { Err bitreich.org 70 i+ while ((n = xread(fd, blk.data, BLKSIZ)) > 0) { Err bitreich.org 70 i uint64_t blkidx; Err bitreich.org 70 i Err bitreich.org 70 i blk.sz = n; Err bitreich.org 70 i@@ -207,8 +229,6 @@ dedup(int fd) Err bitreich.org 70 i ent->blks[ent->nblks++] = blkidx; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i- if (n < 0) Err bitreich.org 70 i- err(1, "read"); Err bitreich.org 70 i Err bitreich.org 70 i /* Calculate hash and add this entry to the index */ Err bitreich.org 70 i SHA256_Final(ent->md, &ctx); Err bitreich.org 70 i@@ -236,9 +256,9 @@ extract(unsigned char *id, int fd) Err bitreich.org 70 i lseek(ifd, sizeof(enthdr), SEEK_SET); Err bitreich.org 70 i for (i = 0; i < enthdr.nents; i++) { Err bitreich.org 70 i ent = alloc_ent(); Err bitreich.org 70 i- read(ifd, ent, sizeof(*ent)); Err bitreich.org 70 i+ xread(ifd, ent, sizeof(*ent)); Err bitreich.org 70 i ent = grow_ent(ent, ent->nblks); Err bitreich.org 70 i- read(ifd, ent->blks, ent->nblks * sizeof(ent->blks[0])); Err bitreich.org 70 i+ xread(ifd, ent->blks, ent->nblks * sizeof(ent->blks[0])); Err bitreich.org 70 i if (memcmp(ent->md, md, sizeof(ent->md)) == 0) { Err bitreich.org 70 i uint64_t j; Err bitreich.org 70 i Err bitreich.org 70 i@@ -246,7 +266,7 @@ extract(unsigned char *id, int fd) Err bitreich.org 70 i struct blk blk; Err bitreich.org 70 i Err bitreich.org 70 i read_blk(&blk, ent->blks[j]); Err bitreich.org 70 i- write(1, blk.data, blk.sz); Err bitreich.org 70 i+ xwrite(1, blk.data, blk.sz); Err bitreich.org 70 i } Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -270,7 +290,7 @@ init(void) Err bitreich.org 70 i if (fstat(ifd, &sb) == -1) Err bitreich.org 70 i err(1, "stat index"); Err bitreich.org 70 i if (sb.st_size != 0) Err bitreich.org 70 i- read(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i+ xread(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -292,9 +312,9 @@ dump_index(void) Err bitreich.org 70 i lseek(ifd, sizeof(enthdr), SEEK_SET); Err bitreich.org 70 i for (i = 0; i < enthdr.nents; i++) { Err bitreich.org 70 i ent = alloc_ent(); Err bitreich.org 70 i- read(ifd, ent, sizeof(*ent)); Err bitreich.org 70 i+ xread(ifd, ent, sizeof(*ent)); Err bitreich.org 70 i ent = grow_ent(ent, ent->nblks); Err bitreich.org 70 i- read(ifd, ent->blks, ent->nblks * sizeof(ent->blks[0])); Err bitreich.org 70 i+ xread(ifd, ent->blks, ent->nblks * sizeof(ent->blks[0])); Err bitreich.org 70 i dump_ent(ent); Err bitreich.org 70 i free(ent); Err bitreich.org 70 i } Err bitreich.org 70 .