iRename stuff - 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 53741db3458c3a8fc633b7a5336d08062fa5e8a6 /scm/dedup/commit/53741db3458c3a8fc633b7a5336d08062fa5e8a6.gph bitreich.org 70 1parent e1c69d4298f03af158a5a5637dad600cdd41f3dc /scm/dedup/commit/e1c69d4298f03af158a5a5637dad600cdd41f3dc.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Wed, 20 Feb 2019 14:06:23 +0000 Err bitreich.org 70 i Err bitreich.org 70 iRename stuff Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 327 +++++++++++++++---------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 161 insertions(+), 166 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@@ -14,7 +14,7 @@ Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i #include "tree.h" Err bitreich.org 70 i Err bitreich.org 70 i-#define INDEXF ".index" Err bitreich.org 70 i+#define SNAPSF ".snapshots" Err bitreich.org 70 i #define STOREF ".store" Err bitreich.org 70 i #define CACHEF ".cache" Err bitreich.org 70 i Err bitreich.org 70 i@@ -41,41 +41,37 @@ struct stats { Err bitreich.org 70 i uint64_t dedup_size; Err bitreich.org 70 i uint64_t min_blk_size; Err bitreich.org 70 i uint64_t max_blk_size; Err bitreich.org 70 i- uint64_t nblks; Err bitreich.org 70 i+ uint64_t nr_blks; Err bitreich.org 70 i uint64_t cache_hits; Err bitreich.org 70 i uint64_t cache_misses; Err bitreich.org 70 i uint64_t reserved[4]; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-/* index file header */ Err bitreich.org 70 i-struct enthdr { Err bitreich.org 70 i+struct snapshot_hdr { Err bitreich.org 70 i uint64_t flags; Err bitreich.org 70 i- uint64_t nents; Err bitreich.org 70 i+ uint64_t nr_snapshots; Err bitreich.org 70 i uint64_t store_size; Err bitreich.org 70 i uint64_t reserved[4]; Err bitreich.org 70 i struct stats st; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-/* block descriptor */ Err bitreich.org 70 i-struct bdescr { Err bitreich.org 70 i+struct blk_desc { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i uint64_t offset; Err bitreich.org 70 i uint64_t size; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-/* index file entry */ Err bitreich.org 70 i-struct ent { Err bitreich.org 70 i+struct snapshot { Err bitreich.org 70 i uint64_t size; Err bitreich.org 70 i uint8_t msg[MSGSIZE]; Err bitreich.org 70 i uint8_t md[MDSIZE]; /* hash of file */ Err bitreich.org 70 i- uint64_t nblks; Err bitreich.org 70 i- struct bdescr bdescr[]; Err bitreich.org 70 i+ uint64_t nr_blk_descs; Err bitreich.org 70 i+ struct blk_desc blk_desc[]; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-/* cache entry */ Err bitreich.org 70 i-struct cent { Err bitreich.org 70 i- struct bdescr bdescr; Err bitreich.org 70 i- RB_ENTRY(cent) e; Err bitreich.org 70 i+struct cache_entry { Err bitreich.org 70 i+ struct blk_desc blk_desc; Err bitreich.org 70 i+ RB_ENTRY(cache_entry) e; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i struct extract_args { Err bitreich.org 70 i@@ -83,8 +79,8 @@ struct extract_args { Err bitreich.org 70 i int fd; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-RB_HEAD(cache, cent) cache_head; Err bitreich.org 70 i-struct enthdr enthdr; Err bitreich.org 70 i+RB_HEAD(cache, cache_entry) cache_head; Err bitreich.org 70 i+struct snapshot_hdr snaphdr; Err bitreich.org 70 i int ifd; Err bitreich.org 70 i int sfd; Err bitreich.org 70 i int cfd; Err bitreich.org 70 i@@ -177,7 +173,8 @@ chunk_blk(uint8_t *buf, size_t size) Err bitreich.org 70 i fp = buzh_init(buf, WINSIZE); Err bitreich.org 70 i for (i = 0; i < size - WINSIZE; i++) { Err bitreich.org 70 i if (i > 0) Err bitreich.org 70 i- fp = buzh_update(fp, buf[i - 1], buf[WINSIZE + i - 1], WINSIZE); Err bitreich.org 70 i+ fp = buzh_update(fp, buf[i - 1], buf[WINSIZE + i - 1], Err bitreich.org 70 i+ WINSIZE); Err bitreich.org 70 i if ((fp & HASHMSK) == 0) Err bitreich.org 70 i return i + WINSIZE; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -224,7 +221,7 @@ print_md(FILE *fp, uint8_t *md, size_t size) Err bitreich.org 70 i void Err bitreich.org 70 i print_stats(struct stats *st) Err bitreich.org 70 i { Err bitreich.org 70 i- if (st->nblks == 0) Err bitreich.org 70 i+ if (st->nr_blks == 0) Err bitreich.org 70 i return; Err bitreich.org 70 i Err bitreich.org 70 i fprintf(stderr, "original size: %llu bytes\n", Err bitreich.org 70 i@@ -235,10 +232,10 @@ print_stats(struct stats *st) Err bitreich.org 70 i (unsigned long long)st->dedup_size); Err bitreich.org 70 i fprintf(stderr, "min/avg/max block size: %llu/%llu/%llu\n", Err bitreich.org 70 i (unsigned long long)st->min_blk_size, Err bitreich.org 70 i- (unsigned long long)st->dedup_size / st->nblks, Err bitreich.org 70 i+ (unsigned long long)st->dedup_size / st->nr_blks, Err bitreich.org 70 i (unsigned long long)st->max_blk_size); Err bitreich.org 70 i fprintf(stderr, "number of blocks: %llu\n", Err bitreich.org 70 i- (unsigned long long)st->nblks); Err bitreich.org 70 i+ (unsigned long long)st->nr_blks); Err bitreich.org 70 i fprintf(stderr, "total cache hits: %llu\n", Err bitreich.org 70 i (unsigned long long)st->cache_hits); Err bitreich.org 70 i fprintf(stderr, "total cache misses: %llu\n", Err bitreich.org 70 i@@ -306,24 +303,24 @@ xwrite(int fd, const void *buf, size_t nbytes) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-cent_cmp(struct cent *e1, struct cent *e2) Err bitreich.org 70 i+cache_entry_cmp(struct cache_entry *e1, struct cache_entry *e2) Err bitreich.org 70 i { Err bitreich.org 70 i int r; Err bitreich.org 70 i Err bitreich.org 70 i- r = memcmp(e1->bdescr.md, e2->bdescr.md, sizeof(e1->bdescr.md)); Err bitreich.org 70 i+ r = memcmp(e1->blk_desc.md, e2->blk_desc.md, sizeof(e1->blk_desc.md)); Err bitreich.org 70 i if (r > 0) Err bitreich.org 70 i return 1; Err bitreich.org 70 i else if (r < 0) Err bitreich.org 70 i return -1; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i-RB_PROTOTYPE(cache, cent, e, cent_cmp); Err bitreich.org 70 i-RB_GENERATE(cache, cent, e, cent_cmp); Err bitreich.org 70 i+RB_PROTOTYPE(cache, cache_entry, e, cache_entry_cmp); Err bitreich.org 70 i+RB_GENERATE(cache, cache_entry, e, cache_entry_cmp); Err bitreich.org 70 i Err bitreich.org 70 i-struct cent * Err bitreich.org 70 i-alloc_cent(void) Err bitreich.org 70 i+struct cache_entry * Err bitreich.org 70 i+alloc_cache_entry(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cent *ent; Err bitreich.org 70 i+ struct cache_entry *ent; Err bitreich.org 70 i Err bitreich.org 70 i ent = calloc(1, sizeof(*ent)); Err bitreich.org 70 i if (ent == NULL) Err bitreich.org 70 i@@ -332,82 +329,82 @@ alloc_cent(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-add_cent(struct cent *cent) Err bitreich.org 70 i+add_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i { Err bitreich.org 70 i- RB_INSERT(cache, &cache_head, cent); Err bitreich.org 70 i+ RB_INSERT(cache, &cache_head, ent); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i flush_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cent *cent; Err bitreich.org 70 i+ struct cache_entry *ent; Err bitreich.org 70 i Err bitreich.org 70 i if (!cache_dirty) Err bitreich.org 70 i return; Err bitreich.org 70 i Err bitreich.org 70 i xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i- RB_FOREACH(cent, cache, &cache_head) Err bitreich.org 70 i- xwrite(cfd, ¢->bdescr, sizeof(cent->bdescr)); Err bitreich.org 70 i+ RB_FOREACH(ent, cache, &cache_head) Err bitreich.org 70 i+ xwrite(cfd, &ent->blk_desc, sizeof(ent->blk_desc)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i free_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cent *cent, *tmp; Err bitreich.org 70 i+ struct cache_entry *ent, *tmp; Err bitreich.org 70 i Err bitreich.org 70 i- RB_FOREACH_SAFE(cent, cache, &cache_head, tmp) { Err bitreich.org 70 i- RB_REMOVE(cache, &cache_head, cent); Err bitreich.org 70 i- free(cent); Err bitreich.org 70 i+ RB_FOREACH_SAFE(ent, cache, &cache_head, tmp) { Err bitreich.org 70 i+ RB_REMOVE(cache, &cache_head, ent); Err bitreich.org 70 i+ free(ent); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i uint64_t Err bitreich.org 70 i-cache_nents(void) Err bitreich.org 70 i+cache_nr_entries(void) Err bitreich.org 70 i { Err bitreich.org 70 i struct stat sb; Err bitreich.org 70 i Err bitreich.org 70 i if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i err(1, "fstat"); Err bitreich.org 70 i- return sb.st_size / sizeof(struct bdescr); Err bitreich.org 70 i+ return sb.st_size / sizeof(struct blk_desc); 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+append_snap(struct snapshot *snap) 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+ /* Update snapshot header */ Err bitreich.org 70 i+ snaphdr.nr_snapshots++; Err bitreich.org 70 i xlseek(ifd, 0, SEEK_SET); Err bitreich.org 70 i- xwrite(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i+ xwrite(ifd, &snaphdr, sizeof(snaphdr)); Err bitreich.org 70 i Err bitreich.org 70 i- /* Append entry */ Err bitreich.org 70 i+ /* Append snapshot */ Err bitreich.org 70 i xlseek(ifd, 0, SEEK_END); Err bitreich.org 70 i- ent->size = sizeof(*ent); Err bitreich.org 70 i- ent->size += ent->nblks * sizeof(ent->bdescr[0]); Err bitreich.org 70 i- xwrite(ifd, ent, ent->size); Err bitreich.org 70 i+ snap->size = sizeof(*snap); Err bitreich.org 70 i+ snap->size += snap->nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i+ xwrite(ifd, snap, snap->size); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-struct ent * Err bitreich.org 70 i-alloc_ent(void) Err bitreich.org 70 i+struct snapshot * Err bitreich.org 70 i+alloc_snap(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct ent *ent; Err bitreich.org 70 i+ struct snapshot *snap; Err bitreich.org 70 i Err bitreich.org 70 i- ent = calloc(1, sizeof(*ent)); Err bitreich.org 70 i- if (ent == NULL) Err bitreich.org 70 i+ snap = calloc(1, sizeof(*snap)); Err bitreich.org 70 i+ if (snap == NULL) Err bitreich.org 70 i err(1, "calloc"); Err bitreich.org 70 i- return ent; Err bitreich.org 70 i+ return snap; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-struct ent * Err bitreich.org 70 i-grow_ent(struct ent *ent, uint64_t nblks) Err bitreich.org 70 i+struct snapshot * Err bitreich.org 70 i+grow_snap(struct snapshot *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i { Err bitreich.org 70 i size_t size; Err bitreich.org 70 i Err bitreich.org 70 i- size = sizeof(*ent); Err bitreich.org 70 i- size += nblks * sizeof(ent->bdescr[0]); Err bitreich.org 70 i- ent = realloc(ent, size); Err bitreich.org 70 i- if (ent == NULL) Err bitreich.org 70 i+ size = sizeof(*snap); Err bitreich.org 70 i+ size += nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i+ snap = realloc(snap, size); Err bitreich.org 70 i+ if (snap == NULL) Err bitreich.org 70 i err(1, "realloc"); Err bitreich.org 70 i- return ent; Err bitreich.org 70 i+ return snap; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i uint8_t * Err bitreich.org 70 i@@ -432,30 +429,30 @@ hash_blk(uint8_t *buf, size_t size, uint8_t *md) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-read_blk(uint8_t *buf, struct bdescr *bdescr) Err bitreich.org 70 i+read_blk(uint8_t *buf, struct blk_desc *blk_desc) Err bitreich.org 70 i { Err bitreich.org 70 i- xlseek(sfd, bdescr->offset, SEEK_SET); Err bitreich.org 70 i- if (xread(sfd, buf, bdescr->size) == 0) Err bitreich.org 70 i+ xlseek(sfd, blk_desc->offset, SEEK_SET); Err bitreich.org 70 i+ if (xread(sfd, buf, blk_desc->size) == 0) Err bitreich.org 70 i errx(1, "read: unexpected EOF"); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-append_blk(uint8_t *buf, struct bdescr *bdescr) Err bitreich.org 70 i+append_blk(uint8_t *buf, struct blk_desc *blk_desc) Err bitreich.org 70 i { Err bitreich.org 70 i- xlseek(sfd, enthdr.store_size, SEEK_SET); Err bitreich.org 70 i- xwrite(sfd, buf, bdescr->size); Err bitreich.org 70 i- enthdr.store_size += bdescr->size; Err bitreich.org 70 i+ xlseek(sfd, snaphdr.store_size, SEEK_SET); Err bitreich.org 70 i+ xwrite(sfd, buf, blk_desc->size); Err bitreich.org 70 i+ snaphdr.store_size += blk_desc->size; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-lookup_bdescr(uint8_t *md, struct bdescr *bdescr) Err bitreich.org 70 i+lookup_blk_desc(uint8_t *md, struct blk_desc *blk_desc) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cent *ent, key; Err bitreich.org 70 i+ struct cache_entry *ent, key; Err bitreich.org 70 i Err bitreich.org 70 i- memcpy(key.bdescr.md, md, sizeof(key.bdescr.md)); Err bitreich.org 70 i+ memcpy(key.blk_desc.md, md, sizeof(key.blk_desc.md)); Err bitreich.org 70 i ent = RB_FIND(cache, &cache_head, &key); Err bitreich.org 70 i if (ent != NULL) { Err bitreich.org 70 i- *bdescr = ent->bdescr; Err bitreich.org 70 i+ *blk_desc = ent->blk_desc; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -465,115 +462,113 @@ void Err bitreich.org 70 i dedup(int fd, char *msg) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t *buf[2]; Err bitreich.org 70 i- struct ent *ent; Err bitreich.org 70 i+ struct snapshot *snap; Err bitreich.org 70 i SHA256_CTX ctx; Err bitreich.org 70 i ssize_t n, bufsize; Err bitreich.org 70 i Err bitreich.org 70 i buf[0] = alloc_buf(BLKSIZE); Err bitreich.org 70 i buf[1] = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i- ent = alloc_ent(); Err bitreich.org 70 i+ snap = alloc_snap(); Err bitreich.org 70 i Err bitreich.org 70 i bufsize = 0; Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i- while ((n = xread(fd, buf[0] + bufsize, BLKSIZE - bufsize)) > 0 || bufsize > 0) { Err bitreich.org 70 i+ while ((n = xread(fd, buf[0] + bufsize, BLKSIZE - bufsize)) > 0 || Err bitreich.org 70 i+ bufsize > 0) { Err bitreich.org 70 i+ Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i- struct bdescr bdescr; Err bitreich.org 70 i+ struct blk_desc blk_desc; Err bitreich.org 70 i size_t blksize, csize; Err bitreich.org 70 i uint8_t *inp = buf[0]; /* input buf */ Err bitreich.org 70 i uint8_t *outp = buf[1]; /* compressed buf */ Err bitreich.org 70 i Err bitreich.org 70 i if (n > 0) { Err bitreich.org 70 i bufsize += n; Err bitreich.org 70 i- enthdr.st.orig_size += n; Err bitreich.org 70 i+ snaphdr.st.orig_size += n; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i blksize = chunk_blk(inp, bufsize); Err bitreich.org 70 i csize = comp(inp, outp, blksize, comp_size(BLKSIZE)); Err bitreich.org 70 i Err bitreich.org 70 i- enthdr.st.comp_size += csize; Err bitreich.org 70 i+ snaphdr.st.comp_size += csize; Err bitreich.org 70 i Err bitreich.org 70 i hash_blk(outp, csize, md); Err bitreich.org 70 i Err bitreich.org 70 i /* Calculate file hash one block at a time */ Err bitreich.org 70 i SHA256_Update(&ctx, inp, blksize); Err bitreich.org 70 i Err bitreich.org 70 i- ent = grow_ent(ent, ent->nblks + 1); Err bitreich.org 70 i+ snap = grow_snap(snap, snap->nr_blk_descs + 1); Err bitreich.org 70 i Err bitreich.org 70 i- if (lookup_bdescr(md, &bdescr) < 0) { Err bitreich.org 70 i- struct cent *cent; Err bitreich.org 70 i+ if (lookup_blk_desc(md, &blk_desc) < 0) { Err bitreich.org 70 i+ struct cache_entry *ent; Err bitreich.org 70 i Err bitreich.org 70 i- memcpy(bdescr.md, md, sizeof(bdescr.md)); Err bitreich.org 70 i- bdescr.offset = enthdr.store_size; Err bitreich.org 70 i- bdescr.size = csize; Err bitreich.org 70 i+ memcpy(blk_desc.md, md, sizeof(blk_desc.md)); Err bitreich.org 70 i+ blk_desc.offset = snaphdr.store_size; Err bitreich.org 70 i+ blk_desc.size = csize; Err bitreich.org 70 i Err bitreich.org 70 i- /* Update index entry */ Err bitreich.org 70 i- ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i+ snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i Err bitreich.org 70 i- /* Store block */ Err bitreich.org 70 i- append_blk(outp, &bdescr); Err bitreich.org 70 i+ append_blk(outp, &blk_desc); Err bitreich.org 70 i Err bitreich.org 70 i- /* Create a cache entry for this block */ Err bitreich.org 70 i- cent = alloc_cent(); Err bitreich.org 70 i- cent->bdescr = bdescr; Err bitreich.org 70 i- add_cent(cent); Err bitreich.org 70 i+ ent = alloc_cache_entry(); Err bitreich.org 70 i+ ent->blk_desc = blk_desc; Err bitreich.org 70 i+ add_cache_entry(ent); Err bitreich.org 70 i cache_dirty = 1; Err bitreich.org 70 i Err bitreich.org 70 i- enthdr.st.dedup_size += bdescr.size; Err bitreich.org 70 i- enthdr.st.nblks++; Err bitreich.org 70 i- enthdr.st.cache_misses++; Err bitreich.org 70 i+ snaphdr.st.dedup_size += blk_desc.size; Err bitreich.org 70 i+ snaphdr.st.nr_blks++; Err bitreich.org 70 i+ snaphdr.st.cache_misses++; Err bitreich.org 70 i Err bitreich.org 70 i- if (bdescr.size > enthdr.st.max_blk_size) Err bitreich.org 70 i- enthdr.st.max_blk_size = bdescr.size; Err bitreich.org 70 i- if (bdescr.size < enthdr.st.min_blk_size) Err bitreich.org 70 i- enthdr.st.min_blk_size = bdescr.size; Err bitreich.org 70 i+ if (blk_desc.size > snaphdr.st.max_blk_size) Err bitreich.org 70 i+ snaphdr.st.max_blk_size = blk_desc.size; Err bitreich.org 70 i+ if (blk_desc.size < snaphdr.st.min_blk_size) Err bitreich.org 70 i+ snaphdr.st.min_blk_size = blk_desc.size; Err bitreich.org 70 i } else { Err bitreich.org 70 i- ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i- enthdr.st.cache_hits++; Err bitreich.org 70 i+ snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i+ snaphdr.st.cache_hits++; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i memmove(inp, inp + blksize, bufsize - blksize); Err bitreich.org 70 i bufsize -= blksize; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (ent->nblks > 0) { 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+ if (snap->nr_blk_descs > 0) { Err bitreich.org 70 i+ SHA256_Final(snap->md, &ctx); Err bitreich.org 70 i Err bitreich.org 70 i if (msg != NULL) { Err bitreich.org 70 i size_t size; Err bitreich.org 70 i Err bitreich.org 70 i size = strlen(msg) + 1; Err bitreich.org 70 i- if (size > sizeof(ent->msg)) Err bitreich.org 70 i- size = sizeof(ent->msg); Err bitreich.org 70 i- memcpy(ent->msg, msg, size); Err bitreich.org 70 i- ent->msg[size - 1] = '\0'; Err bitreich.org 70 i+ if (size > sizeof(snap->msg)) Err bitreich.org 70 i+ size = sizeof(snap->msg); Err bitreich.org 70 i+ memcpy(snap->msg, msg, size); Err bitreich.org 70 i+ snap->msg[size - 1] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- append_ent(ent); Err bitreich.org 70 i+ append_snap(snap); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i+ free(snap); Err bitreich.org 70 i free(buf[1]); Err bitreich.org 70 i free(buf[0]); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-extract(struct ent *ent, void *arg) Err bitreich.org 70 i+extract(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t *buf[2]; Err bitreich.org 70 i struct extract_args *args = arg; Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i- if (memcmp(ent->md, args->md, sizeof(ent->md)) != 0) Err bitreich.org 70 i+ if (memcmp(snap->md, args->md, sizeof(snap->md)) != 0) Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i Err bitreich.org 70 i buf[0] = alloc_buf(BLKSIZE); Err bitreich.org 70 i buf[1] = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i- for (i = 0; i < ent->nblks; i++) { Err bitreich.org 70 i+ for (i = 0; i < snap->nr_blk_descs; i++) { Err bitreich.org 70 i size_t blksize; Err bitreich.org 70 i Err bitreich.org 70 i- read_blk(buf[1], &ent->bdescr[i]); Err bitreich.org 70 i- blksize = decomp(buf[1], buf[0], ent->bdescr[i].size, BLKSIZE); Err bitreich.org 70 i+ read_blk(buf[1], &snap->blk_desc[i]); Err bitreich.org 70 i+ blksize = decomp(buf[1], buf[0], snap->blk_desc[i].size, BLKSIZE); Err bitreich.org 70 i xwrite(args->fd, buf[0], blksize); Err bitreich.org 70 i } Err bitreich.org 70 i free(buf[1]); Err bitreich.org 70 i@@ -582,7 +577,7 @@ extract(struct ent *ent, void *arg) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-check(struct ent *ent, void *arg) Err bitreich.org 70 i+check(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i uint8_t *buf; Err bitreich.org 70 i@@ -592,48 +587,48 @@ check(struct ent *ent, void *arg) Err bitreich.org 70 i buf = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i /* Err bitreich.org 70 i * Calculate hash for each block and compare Err bitreich.org 70 i- * with index entry block descriptor Err bitreich.org 70 i+ * against snapshot entry block descriptor Err bitreich.org 70 i */ Err bitreich.org 70 i- for (i = 0; i < ent->nblks; i++) { Err bitreich.org 70 i- read_blk(buf, &ent->bdescr[i]); Err bitreich.org 70 i+ for (i = 0; i < snap->nr_blk_descs; i++) { Err bitreich.org 70 i+ read_blk(buf, &snap->blk_desc[i]); Err bitreich.org 70 i Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i- SHA256_Update(&ctx, buf, ent->bdescr[i].size); Err bitreich.org 70 i+ SHA256_Update(&ctx, buf, snap->blk_desc[i].size); Err bitreich.org 70 i SHA256_Final(md, &ctx); Err bitreich.org 70 i Err bitreich.org 70 i- if (memcmp(ent->bdescr[i].md, md, Err bitreich.org 70 i- sizeof(ent->bdescr[i]).md) == 0) Err bitreich.org 70 i+ if (memcmp(snap->blk_desc[i].md, md, Err bitreich.org 70 i+ sizeof(snap->blk_desc[i]).md) == 0) Err bitreich.org 70 i continue; Err bitreich.org 70 i Err bitreich.org 70 i fprintf(stderr, "Block hash mismatch\n"); Err bitreich.org 70 i fprintf(stderr, " Expected hash: "); Err bitreich.org 70 i- print_md(stderr, ent->md, sizeof(ent->md)); Err bitreich.org 70 i+ print_md(stderr, snap->md, sizeof(snap->md)); Err bitreich.org 70 i fputc('\n', stderr); Err bitreich.org 70 i fprintf(stderr, " Actual hash: "); Err bitreich.org 70 i print_md(stderr, md, sizeof(md)); Err bitreich.org 70 i fputc('\n', stderr); Err bitreich.org 70 i fprintf(stderr, " Offset: %llu\n", Err bitreich.org 70 i- (unsigned long long)ent->bdescr[i].offset); Err bitreich.org 70 i+ (unsigned long long)snap->blk_desc[i].offset); Err bitreich.org 70 i fprintf(stderr, " Size: %llu\n", Err bitreich.org 70 i- (unsigned long long)ent->bdescr[i].size); Err bitreich.org 70 i+ (unsigned long long)snap->blk_desc[i].size); Err bitreich.org 70 i } Err bitreich.org 70 i free(buf); Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-list(struct ent *ent, void *arg) Err bitreich.org 70 i+list(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i- print_md(stdout, ent->md, sizeof(ent->md)); Err bitreich.org 70 i- if (ent->msg[0] != '\0') Err bitreich.org 70 i- printf("\t%s\n", ent->msg); Err bitreich.org 70 i+ print_md(stdout, snap->md, sizeof(snap->md)); Err bitreich.org 70 i+ if (snap->msg[0] != '\0') Err bitreich.org 70 i+ printf("\t%s\n", snap->msg); Err bitreich.org 70 i else Err bitreich.org 70 i putchar('\n'); Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-rebuild_cache(struct ent *ent, void *arg) Err bitreich.org 70 i+rebuild_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i uint8_t *buf; Err bitreich.org 70 i@@ -641,47 +636,47 @@ rebuild_cache(struct ent *ent, void *arg) Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i buf = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i- for (i = 0; i < ent->nblks; i++) { Err bitreich.org 70 i- struct cent *cent; Err bitreich.org 70 i+ for (i = 0; i < snap->nr_blk_descs; i++) { Err bitreich.org 70 i+ struct cache_entry *ent; Err bitreich.org 70 i Err bitreich.org 70 i- read_blk(buf, &ent->bdescr[i]); Err bitreich.org 70 i+ read_blk(buf, &snap->blk_desc[i]); Err bitreich.org 70 i Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i- SHA256_Update(&ctx, buf, ent->bdescr[i].size); Err bitreich.org 70 i+ SHA256_Update(&ctx, buf, snap->blk_desc[i].size); Err bitreich.org 70 i SHA256_Final(md, &ctx); Err bitreich.org 70 i Err bitreich.org 70 i- cent = alloc_cent(); Err bitreich.org 70 i- memcpy(cent->bdescr.md, md, sizeof(cent->bdescr.md)); Err bitreich.org 70 i- cent->bdescr = ent->bdescr[i]; Err bitreich.org 70 i- add_cent(cent); Err bitreich.org 70 i+ ent = alloc_cache_entry(); Err bitreich.org 70 i+ memcpy(ent->blk_desc.md, md, sizeof(ent->blk_desc.md)); Err bitreich.org 70 i+ ent->blk_desc = snap->blk_desc[i]; Err bitreich.org 70 i+ add_cache_entry(ent); Err bitreich.org 70 i cache_dirty = 1; Err bitreich.org 70 i } Err bitreich.org 70 i free(buf); Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-/* Walk through all index entries and call fn() on each one */ Err bitreich.org 70 i+/* Walk through all snapshots and call fn() on each one */ Err bitreich.org 70 i void Err bitreich.org 70 i-walk(int (*fn)(struct ent *, void *), void *arg) Err bitreich.org 70 i+walk(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i- struct ent *ent; Err bitreich.org 70 i+ struct snapshot *snap; Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i- ent = alloc_ent(); Err bitreich.org 70 i- xlseek(ifd, sizeof(enthdr), SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < enthdr.nents; i++) { Err bitreich.org 70 i- if (xread(ifd, ent, sizeof(*ent)) == 0) Err bitreich.org 70 i+ snap = alloc_snap(); Err bitreich.org 70 i+ xlseek(ifd, sizeof(snaphdr), SEEK_SET); Err bitreich.org 70 i+ for (i = 0; i < snaphdr.nr_snapshots; i++) { Err bitreich.org 70 i+ if (xread(ifd, snap, sizeof(*snap)) == 0) Err bitreich.org 70 i errx(1, "read: unexpected EOF"); Err bitreich.org 70 i Err bitreich.org 70 i- ent = grow_ent(ent, ent->nblks); Err bitreich.org 70 i- if (xread(ifd, ent->bdescr, Err bitreich.org 70 i- ent->nblks * sizeof(ent->bdescr[0])) == 0) Err bitreich.org 70 i+ snap = grow_snap(snap, snap->nr_blk_descs); Err bitreich.org 70 i+ if (xread(ifd, snap->blk_desc, Err bitreich.org 70 i+ snap->nr_blk_descs * sizeof(snap->blk_desc[0])) == 0) Err bitreich.org 70 i errx(1, "read: unexpected EOF"); Err bitreich.org 70 i Err bitreich.org 70 i- if ((*fn)(ent, arg) == WALK_STOP) Err bitreich.org 70 i+ if ((*fn)(snap, arg) == WALK_STOP) Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i+ free(snap); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -689,15 +684,15 @@ init_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i uint64_t nents, i; Err bitreich.org 70 i Err bitreich.org 70 i- nents = cache_nents(); Err bitreich.org 70 i+ nents = cache_nr_entries(); Err bitreich.org 70 i xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i for (i = 0; i < nents; i++) { Err bitreich.org 70 i- struct cent *cent; Err bitreich.org 70 i+ struct cache_entry *ent; Err bitreich.org 70 i Err bitreich.org 70 i- cent = alloc_cent(); Err bitreich.org 70 i- if (xread(cfd, ¢->bdescr, sizeof(cent->bdescr)) == 0) Err bitreich.org 70 i+ ent = alloc_cache_entry(); Err bitreich.org 70 i+ if (xread(cfd, &ent->blk_desc, sizeof(ent->blk_desc)) == 0) Err bitreich.org 70 i errx(1, "read: unexpected EOF"); Err bitreich.org 70 i- add_cent(cent); Err bitreich.org 70 i+ add_cache_entry(ent); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -706,9 +701,9 @@ init(void) Err bitreich.org 70 i { Err bitreich.org 70 i struct stat sb; Err bitreich.org 70 i Err bitreich.org 70 i- ifd = open(INDEXF, O_RDWR | O_CREAT, 0600); Err bitreich.org 70 i+ ifd = open(SNAPSF, O_RDWR | O_CREAT, 0600); Err bitreich.org 70 i if (ifd < 0) Err bitreich.org 70 i- err(1, "open %s", INDEXF); Err bitreich.org 70 i+ err(1, "open %s", SNAPSF); Err bitreich.org 70 i Err bitreich.org 70 i sfd = open(STOREF, O_RDWR | O_CREAT, 0600); Err bitreich.org 70 i if (sfd < 0) Err bitreich.org 70 i@@ -724,24 +719,24 @@ init(void) Err bitreich.org 70 i errx(1, "busy lock"); Err bitreich.org 70 i Err bitreich.org 70 i if (fstat(ifd, &sb) < 0) Err bitreich.org 70 i- err(1, "fstat %s", INDEXF); Err bitreich.org 70 i+ err(1, "fstat %s", SNAPSF); Err bitreich.org 70 i if (sb.st_size != 0) { Err bitreich.org 70 i uint8_t maj, min; Err bitreich.org 70 i Err bitreich.org 70 i- xread(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i- min = enthdr.flags & 0xff; Err bitreich.org 70 i- maj = (enthdr.flags >> 8) & 0xff; Err bitreich.org 70 i+ xread(ifd, &snaphdr, sizeof(snaphdr)); Err bitreich.org 70 i+ min = snaphdr.flags & 0xff; Err bitreich.org 70 i+ maj = (snaphdr.flags >> 8) & 0xff; Err bitreich.org 70 i Err bitreich.org 70 i if (maj != VER_MAJ || min != VER_MIN) Err bitreich.org 70 i- errx(1, "expected index format version %u.%u but got %u.%u", Err bitreich.org 70 i+ errx(1, "expected snapshot format version %u.%u but got %u.%u", Err bitreich.org 70 i VER_MAJ, VER_MIN, maj, min); Err bitreich.org 70 i } else { Err bitreich.org 70 i- enthdr.flags = (VER_MAJ << 8) | VER_MIN; Err bitreich.org 70 i- xwrite(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i- enthdr.st.min_blk_size = comp_size(BLKSIZE); Err bitreich.org 70 i+ snaphdr.flags = (VER_MAJ << 8) | VER_MIN; Err bitreich.org 70 i+ xwrite(ifd, &snaphdr, sizeof(snaphdr)); Err bitreich.org 70 i+ snaphdr.st.min_blk_size = comp_size(BLKSIZE); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (cache_nents() != 0) Err bitreich.org 70 i+ if (cache_nr_entries() != 0) Err bitreich.org 70 i init_cache(); Err bitreich.org 70 i else Err bitreich.org 70 i walk(rebuild_cache, NULL); Err bitreich.org 70 i@@ -751,7 +746,7 @@ void Err bitreich.org 70 i term(void) Err bitreich.org 70 i { Err bitreich.org 70 i if (verbose) Err bitreich.org 70 i- print_stats(&enthdr.st); Err bitreich.org 70 i+ print_stats(&snaphdr.st); Err bitreich.org 70 i flush_cache(); Err bitreich.org 70 i free_cache(); Err bitreich.org 70 i Err bitreich.org 70 .