iAdd error reporting to bstorage.c - 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 b30db499a59ec215edb9a96f4b0d7fd517dab34b /scm/dedup/commit/b30db499a59ec215edb9a96f4b0d7fd517dab34b.gph bitreich.org 70 1parent 9be48e61285e87fff2638f5b2acee3e15a00046c /scm/dedup/commit/9be48e61285e87fff2638f5b2acee3e15a00046c.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Fri, 3 May 2019 15:18:53 +0100 Err bitreich.org 70 i Err bitreich.org 70 iAdd error reporting to bstorage.c Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M bstorage.c | 107 +++++++++++++++++++++++++------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 86 insertions(+), 21 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -219,22 +219,27 @@ loadbd(struct sctx *sctx) Err bitreich.org 70 i struct bd *bd; Err bitreich.org 70 i Err bitreich.org 70 i bd = calloc(1, sizeof(*bd)); Err bitreich.org 70 i- if (bd == NULL) Err bitreich.org 70 i+ if (bd == NULL) { Err bitreich.org 70 i+ bseterr("out of memory"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i if (unpackbd(sctx->fd, bd) < 0) { Err bitreich.org 70 i free(bd); Err bitreich.org 70 i+ bseterr("failed to unpack block descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (bd->type != BDTYPE) { Err bitreich.org 70 i free(bd); Err bitreich.org 70 i+ bseterr("invalid block descriptor type: %d", bd->type); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* Move to the next block descriptor */ Err bitreich.org 70 i if (lseek(sctx->fd, bd->size, SEEK_CUR) < 0) { Err bitreich.org 70 i free(bd); Err bitreich.org 70 i+ bseterr("failed to seek on storage descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -294,16 +299,21 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i struct bhdr *bhdr; Err bitreich.org 70 i int fd; Err bitreich.org 70 i Err bitreich.org 70 i- if (sodium_init() < 0) Err bitreich.org 70 i+ if (sodium_init() < 0) { Err bitreich.org 70 i+ bseterr("crypto library failed to initialize"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i fd = open(path, O_RDWR | O_CREAT | O_EXCL, mode); Err bitreich.org 70 i- if (fd < 0) Err bitreich.org 70 i+ if (fd < 0) { Err bitreich.org 70 i+ bseterr("failed to open"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i bctx->sctx = calloc(1, sizeof(struct sctx)); Err bitreich.org 70 i if (bctx->sctx == NULL) { Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("out of memory"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -322,6 +332,7 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i } else { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("invalid compression type: %s", bpar->calgo); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -333,6 +344,7 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i } else { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("invalid encryption type: %s", bpar->ealgo); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -343,6 +355,7 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i if (packbhdr(fd, bhdr) < 0) { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("failed to write block header entry"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i return 0; Err bitreich.org 70 i@@ -364,19 +377,25 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i flags = O_RDWR; Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i+ bseterr("invalid params"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (sodium_init() < 0) Err bitreich.org 70 i+ if (sodium_init() < 0) { Err bitreich.org 70 i+ bseterr("crypto library failed to initialize"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i fd = open(path, flags, mode); Err bitreich.org 70 i- if (fd < 0) Err bitreich.org 70 i+ if (fd < 0) { Err bitreich.org 70 i+ bseterr("failed to open"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i bctx->sctx = calloc(1, sizeof(struct sctx)); Err bitreich.org 70 i if (bctx->sctx == NULL) { Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("out of memory"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -389,6 +408,7 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i if (unpackbhdr(fd, bhdr) < 0) { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("failed to read block header entry"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -396,6 +416,7 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i if (memcmp(bhdr->magic, BHDRMAGIC, NBHDRMAGIC) != 0) { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("unknown block header magic"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -403,6 +424,7 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i if (((bhdr->flags >> VMAJSHIFT) & VMAJMASK) != VMAJ) { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("block header version mismatch"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -418,6 +440,7 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i default: Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("invalid compression type: %d", algo); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -433,6 +456,7 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i default: Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i+ bseterr("invalid encryption type: %d", algo); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -460,8 +484,10 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i struct bd key, *bd; Err bitreich.org 70 i off_t offs; Err bitreich.org 70 i Err bitreich.org 70 i- if (bhash(buf, n, key.md) < 0) Err bitreich.org 70 i+ if (bhash(buf, n, key.md) < 0) { Err bitreich.org 70 i+ bseterr("failed to hash block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * If the block is already present in the cache Err bitreich.org 70 i@@ -474,12 +500,15 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i off_t bdoffs; Err bitreich.org 70 i Err bitreich.org 70 i bdoffs = bd->offset - BDSIZE; Err bitreich.org 70 i- if (lseek(sctx->fd, bdoffs, SEEK_SET) < 0) Err bitreich.org 70 i+ if (lseek(sctx->fd, bdoffs, SEEK_SET) < 0) { Err bitreich.org 70 i+ bseterr("failed to seek on storage descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i bd->refcnt++; Err bitreich.org 70 i if (packbd(sctx->fd, bd) < 0) { Err bitreich.org 70 i bd->refcnt--; Err bitreich.org 70 i+ bseterr("failed to write block descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -489,13 +518,17 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i Err bitreich.org 70 i /* New blocks are always appended to the storage file */ Err bitreich.org 70 i offs = lseek(sctx->fd, 0, SEEK_END); Err bitreich.org 70 i- if (offs < 0) Err bitreich.org 70 i+ if (offs < 0) { Err bitreich.org 70 i+ bseterr("failed to seek on storage descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i /* Allocate a new block descriptor */ Err bitreich.org 70 i bd = calloc(1, sizeof(*bd)); Err bitreich.org 70 i- if (bd == NULL) Err bitreich.org 70 i+ if (bd == NULL) { Err bitreich.org 70 i+ bseterr("out of memory"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i bd->type = BDTYPE; Err bitreich.org 70 i bd->offset = offs + BDSIZE; Err bitreich.org 70 i bd->size = n; Err bitreich.org 70 i@@ -505,6 +538,7 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i /* Write block descriptor to storage file */ Err bitreich.org 70 i if (packbd(sctx->fd, bd) < 0) { Err bitreich.org 70 i free(bd); Err bitreich.org 70 i+ bseterr("failed to write block descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -513,6 +547,7 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i /* Shouldn't fail but if it does rewind storage file state */ Err bitreich.org 70 i ftruncate(sctx->fd, offs); Err bitreich.org 70 i free(bd); Err bitreich.org 70 i+ bseterr("failed to write block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -541,16 +576,24 @@ bsget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i /* Lookup block in the cache */ Err bitreich.org 70 i memcpy(key.md, md, MDSIZE); Err bitreich.org 70 i bd = RB_FIND(bdcache, &sctx->bdcache, &key); Err bitreich.org 70 i- if (bd == NULL) Err bitreich.org 70 i+ if (bd == NULL) { Err bitreich.org 70 i+ bseterr("unknown block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i- if (*n < bd->size) Err bitreich.org 70 i+ if (*n < bd->size) { Err bitreich.org 70 i+ bseterr("buffer too small"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i- if (lseek(sctx->fd, bd->offset, SEEK_SET) < 0) Err bitreich.org 70 i+ if (lseek(sctx->fd, bd->offset, SEEK_SET) < 0) { Err bitreich.org 70 i+ bseterr("failed to seek on storage descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i- if (xread(sctx->fd, buf, bd->size) != bd->size) Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (xread(sctx->fd, buf, bd->size) != bd->size) { Err bitreich.org 70 i+ bseterr("failed to read block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i *n = bd->size; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -568,16 +611,21 @@ bsrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i /* Lookup block in the cache */ Err bitreich.org 70 i memcpy(key.md, md, MDSIZE); Err bitreich.org 70 i bd = RB_FIND(bdcache, &sctx->bdcache, &key); Err bitreich.org 70 i- if (bd == NULL) Err bitreich.org 70 i+ if (bd == NULL) { Err bitreich.org 70 i+ bseterr("unknown block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i bdoffs = bd->offset - BDSIZE; Err bitreich.org 70 i- if (lseek(sctx->fd, bdoffs, SEEK_SET) < 0) Err bitreich.org 70 i+ if (lseek(sctx->fd, bdoffs, SEEK_SET) < 0) { Err bitreich.org 70 i+ bseterr("failed to seek on storage descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i bd->refcnt--; Err bitreich.org 70 i if (packbd(sctx->fd, bd) < 0) { Err bitreich.org 70 i bd->refcnt++; Err bitreich.org 70 i+ bseterr("failed to write block descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -593,6 +641,7 @@ bsrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i lseek(sctx->fd, bdoffs, SEEK_SET); Err bitreich.org 70 i bd->refcnt++; Err bitreich.org 70 i packbd(sctx->fd, bd); Err bitreich.org 70 i+ bseterr("operation not supported"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -644,28 +693,38 @@ bscheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i /* Lookup block in the cache */ Err bitreich.org 70 i memcpy(key.md, md, MDSIZE); Err bitreich.org 70 i bd = RB_FIND(bdcache, &sctx->bdcache, &key); Err bitreich.org 70 i- if (bd == NULL) Err bitreich.org 70 i+ if (bd == NULL) { Err bitreich.org 70 i+ bseterr("unknown block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i- if (lseek(sctx->fd, bd->offset, SEEK_SET) < 0) Err bitreich.org 70 i+ if (lseek(sctx->fd, bd->offset, SEEK_SET) < 0) { Err bitreich.org 70 i+ bseterr("failed to seek on storage descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i buf = malloc(bd->size); Err bitreich.org 70 i- if (buf == NULL) Err bitreich.org 70 i+ if (buf == NULL) { Err bitreich.org 70 i+ bseterr("out of memory"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i if (xread(sctx->fd, buf, bd->size) != bd->size) { Err bitreich.org 70 i free(buf); Err bitreich.org 70 i+ bseterr("failed to read block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (bhash(buf, bd->size, key.md) < 0) { Err bitreich.org 70 i free(buf); Err bitreich.org 70 i+ bseterr("failed to hash block"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (memcmp(key.md, md, MDSIZE) != 0) Err bitreich.org 70 i+ if (memcmp(key.md, md, MDSIZE) != 0) { Err bitreich.org 70 i+ bseterr("block mismatch"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -680,11 +739,15 @@ bssync(struct bctx *bctx) Err bitreich.org 70 i if (sctx->rdonly) Err bitreich.org 70 i return 0; Err bitreich.org 70 i Err bitreich.org 70 i- if (lseek(sctx->fd, 0, SEEK_SET) < 0) Err bitreich.org 70 i+ if (lseek(sctx->fd, 0, SEEK_SET) < 0) { Err bitreich.org 70 i+ bseterr("failed to seek on storage descriptor"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i bhdr = &sctx->bhdr; Err bitreich.org 70 i- if (packbhdr(sctx->fd, bhdr) < 0) Err bitreich.org 70 i+ if (packbhdr(sctx->fd, bhdr) < 0) { Err bitreich.org 70 i+ bseterr("failed to write block header"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i fsync(sctx->fd); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -714,6 +777,8 @@ bsclose(struct bctx *bctx) Err bitreich.org 70 i Err bitreich.org 70 i r = close(sctx->fd); Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i+ if (r < 0) Err bitreich.org 70 i+ bseterr("failed to close storage descriptor"); Err bitreich.org 70 i return r; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 .