URI: 
       Put snapshot helpers to utils.c - 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 78273e89af8024ff892a83cdb04b8b2374aa9521
   DIR parent 94596df085ef611772b52d9d7e3ffe0e26db3fb8
  HTML Author: sin <sin@2f30.org>
       Date:   Thu, 18 Apr 2019 10:35:07 +0100
       
       Put snapshot helpers to utils.c
       
       Diffstat:
         M dcheck.c                            |      66 +------------------------------
         M dedup.h                             |      12 ++++++++++++
         M dlist.c                             |      66 +------------------------------
         M dpack.c                             |     115 +------------------------------
         M dunpack.c                           |      66 +------------------------------
         M utils.c                             |     106 ++++++++++++++++++++++++++++++
       
       6 files changed, 124 insertions(+), 307 deletions(-)
       ---
   DIR diff --git a/dcheck.c b/dcheck.c
       @@ -17,11 +17,6 @@
        #define SNAPSF ".snapshots"
        #define STOREF ".store"
        
       -enum {
       -        WALK_CONTINUE,
       -        WALK_STOP
       -};
       -
        static struct snap_hdr snap_hdr;
        static struct blk_hdr blk_hdr;
        static int ifd;
       @@ -41,42 +36,6 @@ print_md(FILE *fp, uint8_t *md, size_t size)
                        fprintf(fp, "%02x", md[i]);
        }
        
       -static struct snap *
       -alloc_snap(void)
       -{
       -        struct snap *snap;
       -
       -        snap = calloc(1, sizeof(*snap));
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
       -static void
       -free_snap(struct snap *snap)
       -{
       -        free(snap);
       -}
       -
       -static struct snap *
       -grow_snap(struct snap *snap, uint64_t nr_blk_descs)
       -{
       -        size_t size;
       -
       -        if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0]))
       -                errx(1, "%s: overflow", __func__);
       -        size = nr_blk_descs * sizeof(snap->blk_desc[0]);
       -
       -        if (size > SIZE_MAX - sizeof(*snap))
       -                errx(1, "%s: overflow", __func__);
       -        size += sizeof(*snap);
       -
       -        snap = realloc(snap, size);
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
        static uint8_t *
        alloc_buf(size_t size)
        {
       @@ -169,29 +128,6 @@ check_snap(struct snap *snap, void *arg)
                return WALK_CONTINUE;
        }
        
       -/* Walk through all snapshots and call fn() on each one */
       -static void
       -walk_snap(int (*fn)(struct snap *, void *), void *arg)
       -{
       -        uint64_t i;
       -
       -        xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET);
       -        for (i = 0; i < snap_hdr.nr_snaps; i++) {
       -                struct snap *snap;
       -                int ret;
       -
       -                snap = alloc_snap();
       -                read_snap(ifd, snap);
       -                snap = grow_snap(snap, snap->nr_blk_descs);
       -                read_snap_descs(ifd, snap);
       -
       -                ret = (*fn)(snap, arg);
       -                free_snap(snap);
       -                if (ret == WALK_STOP)
       -                        break;
       -        }
       -}
       -
        static void
        init(void)
        {
       @@ -257,7 +193,7 @@ main(int argc, char *argv[])
        
                init();
                ret = 0;
       -        walk_snap(check_snap, &ret);
       +        walk_snap(ifd, &snap_hdr, check_snap, &ret);
                if (ret != 0)
                        errx(1, "%s or %s is corrupted", SNAPSF, STOREF);
                term();
   DIR diff --git a/dedup.h b/dedup.h
       @@ -29,6 +29,11 @@
        #define COMPR_ALGO_SHIFT        16
        #define COMPR_ALGO_MASK                0x7        /* max 8 compression algos */
        
       +enum {
       +        WALK_CONTINUE,
       +        WALK_STOP
       +};
       +
        enum compr_algo {
                COMPR_NONE,
                COMPR_LZ4,
       @@ -210,3 +215,10 @@ void init_blk_hdr(struct blk_hdr *hdr, int compr_algo, int hash_algo);
        void init_snap_hdr(struct snap_hdr *hdr);
        void load_blk_hdr(int fd, struct blk_hdr *hdr, int *compr_algo, int *hash_algo);
        void load_snap_hdr(int fd, struct snap_hdr *hdr);
       +struct snap *alloc_snap(void);
       +void free_snap(struct snap *snap);
       +struct snap *grow_snap(struct snap *snap, uint64_t nr_blk_descs);
       +void append_snap(int fd, struct snap_hdr *hdr, struct snap *snap);
       +void hash_snap(struct snap *snap, uint8_t *md, int hash_algo);
       +void walk_snap(int fd, struct snap_hdr *hdr,
       +               int (*fn)(struct snap *, void *), void *arg);
   DIR diff --git a/dlist.c b/dlist.c
       @@ -17,11 +17,6 @@
        #define SNAPSF ".snapshots"
        #define STOREF ".store"
        
       -enum {
       -        WALK_CONTINUE,
       -        WALK_STOP
       -};
       -
        static struct snap_hdr snap_hdr;
        static struct blk_hdr blk_hdr;
        static int ifd;
       @@ -41,42 +36,6 @@ print_md(FILE *fp, uint8_t *md, size_t size)
                        fprintf(fp, "%02x", md[i]);
        }
        
       -static struct snap *
       -alloc_snap(void)
       -{
       -        struct snap *snap;
       -
       -        snap = calloc(1, sizeof(*snap));
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
       -static void
       -free_snap(struct snap *snap)
       -{
       -        free(snap);
       -}
       -
       -static struct snap *
       -grow_snap(struct snap *snap, uint64_t nr_blk_descs)
       -{
       -        size_t size;
       -
       -        if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0]))
       -                errx(1, "%s: overflow", __func__);
       -        size = nr_blk_descs * sizeof(snap->blk_desc[0]);
       -
       -        if (size > SIZE_MAX - sizeof(*snap))
       -                errx(1, "%s: overflow", __func__);
       -        size += sizeof(*snap);
       -
       -        snap = realloc(snap, size);
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
        static int
        list(struct snap *snap, void *arg)
        {
       @@ -88,29 +47,6 @@ list(struct snap *snap, void *arg)
                return WALK_CONTINUE;
        }
        
       -/* Walk through all snapshots and call fn() on each one */
       -static void
       -walk_snap(int (*fn)(struct snap *, void *), void *arg)
       -{
       -        uint64_t i;
       -
       -        xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET);
       -        for (i = 0; i < snap_hdr.nr_snaps; i++) {
       -                struct snap *snap;
       -                int ret;
       -
       -                snap = alloc_snap();
       -                read_snap(ifd, snap);
       -                snap = grow_snap(snap, snap->nr_blk_descs);
       -                read_snap_descs(ifd, snap);
       -
       -                ret = (*fn)(snap, arg);
       -                free_snap(snap);
       -                if (ret == WALK_STOP)
       -                        break;
       -        }
       -}
       -
        static void
        init(void)
        {
       @@ -175,7 +111,7 @@ main(int argc, char *argv[])
                        err(1, "chdir: %s", repo);
        
                init();
       -        walk_snap(list, NULL);
       +        walk_snap(ifd, &snap_hdr, list, NULL);
                term();
                return 0;
        }
   DIR diff --git a/dpack.c b/dpack.c
       @@ -17,11 +17,6 @@
        #define SNAPSF ".snapshots"
        #define STOREF ".store"
        
       -enum {
       -        WALK_CONTINUE,
       -        WALK_STOP
       -};
       -
        static struct snap_hdr snap_hdr;
        static struct blk_hdr blk_hdr;
        static struct icache *icache;
       @@ -33,87 +28,6 @@ static int compr_algo = COMPR_LZ4;
        int verbose;
        char *argv0;
        
       -static struct snap *
       -alloc_snap(void)
       -{
       -        struct snap *snap;
       -
       -        snap = calloc(1, sizeof(*snap));
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
       -static void
       -free_snap(struct snap *snap)
       -{
       -        free(snap);
       -}
       -
       -/*
       - * The snapshot hash is calculated over the
       - * hash of its block descriptors.
       - */
       -static void
       -hash_snap(struct snap *snap, uint8_t *md)
       -{
       -        struct hash_ctx ctx;
       -        uint64_t i;
       -
       -        if (hash_init(&ctx, hash_algo, MD_SIZE) < 0)
       -                errx(1, "hash_init failed");
       -        for (i = 0; i < snap->nr_blk_descs; i++) {
       -                struct blk_desc *blk_desc;
       -
       -                blk_desc = &snap->blk_desc[i];
       -                hash_update(&ctx, blk_desc->md, sizeof(blk_desc->md));
       -        }
       -        hash_final(&ctx, md, MD_SIZE);
       -}
       -
       -static struct snap *
       -grow_snap(struct snap *snap, uint64_t nr_blk_descs)
       -{
       -        size_t size;
       -
       -        if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0]))
       -                errx(1, "%s: overflow", __func__);
       -        size = nr_blk_descs * sizeof(snap->blk_desc[0]);
       -
       -        if (size > SIZE_MAX - sizeof(*snap))
       -                errx(1, "%s: overflow", __func__);
       -        size += sizeof(*snap);
       -
       -        snap = realloc(snap, size);
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
       -static void
       -append_snap(struct snap *snap)
       -{
       -        if (snap->nr_blk_descs > UINT64_MAX / BLK_DESC_SIZE)
       -                errx(1, "%s: overflow", __func__);
       -        snap->size = snap->nr_blk_descs * BLK_DESC_SIZE;
       -
       -        if (snap->size > UINT64_MAX - SNAPSHOT_SIZE)
       -                errx(1, "%s: overflow", __func__);
       -        snap->size += SNAPSHOT_SIZE;
       -
       -        xlseek(ifd, snap_hdr.size, SEEK_SET);
       -        write_snap(ifd, snap);
       -        write_snap_blk_descs(ifd, snap);
       -
       -        if (snap_hdr.size > UINT64_MAX - snap->size)
       -                errx(1, "%s: overflow", __func__);
       -        snap_hdr.size += snap->size;
       -
       -        if (snap_hdr.nr_snaps > UINT64_MAX - 1)
       -                errx(1, "%s: overflow", __func__);
       -        snap_hdr.nr_snaps++;
       -}
       -
        static uint8_t *
        alloc_buf(size_t size)
        {
       @@ -222,8 +136,8 @@ dedup(int fd, char *msg)
                                memcpy(snap->msg, msg, size);
                                snap->msg[size - 1] = '\0';
                        }
       -                hash_snap(snap, snap->md);
       -                append_snap(snap);
       +                hash_snap(snap, snap->md, hash_algo);
       +                append_snap(ifd, &snap_hdr, snap);
                }
        
                free_chunker(chunker);
       @@ -251,29 +165,6 @@ build_icache(struct snap *snap, void *arg)
                return WALK_CONTINUE;
        }
        
       -/* Walk through all snapshots and call fn() on each one */
       -static void
       -walk_snap(int (*fn)(struct snap *, void *), void *arg)
       -{
       -        uint64_t i;
       -
       -        xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET);
       -        for (i = 0; i < snap_hdr.nr_snaps; i++) {
       -                struct snap *snap;
       -                int ret;
       -
       -                snap = alloc_snap();
       -                read_snap(ifd, snap);
       -                snap = grow_snap(snap, snap->nr_blk_descs);
       -                read_snap_descs(ifd, snap);
       -
       -                ret = (*fn)(snap, arg);
       -                free_snap(snap);
       -                if (ret == WALK_STOP)
       -                        break;
       -        }
       -}
       -
        static void
        init(void)
        {
       @@ -296,7 +187,7 @@ init(void)
                load_blk_hdr(sfd, &blk_hdr, &compr_algo, &hash_algo);
        
                icache = alloc_icache();
       -        walk_snap(build_icache, NULL);
       +        walk_snap(ifd, &snap_hdr, build_icache, NULL);
        }
        
        static void
   DIR diff --git a/dunpack.c b/dunpack.c
       @@ -17,11 +17,6 @@
        #define SNAPSF ".snapshots"
        #define STOREF ".store"
        
       -enum {
       -        WALK_CONTINUE,
       -        WALK_STOP
       -};
       -
        struct extract_args {
                uint8_t *md;
                int fd;
       @@ -38,42 +33,6 @@ static int compr_algo = COMPR_LZ4;
        int verbose;
        char *argv0;
        
       -static struct snap *
       -alloc_snap(void)
       -{
       -        struct snap *snap;
       -
       -        snap = calloc(1, sizeof(*snap));
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
       -static void
       -free_snap(struct snap *snap)
       -{
       -        free(snap);
       -}
       -
       -static struct snap *
       -grow_snap(struct snap *snap, uint64_t nr_blk_descs)
       -{
       -        size_t size;
       -
       -        if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0]))
       -                errx(1, "%s: overflow", __func__);
       -        size = nr_blk_descs * sizeof(snap->blk_desc[0]);
       -
       -        if (size > SIZE_MAX - sizeof(*snap))
       -                errx(1, "%s: overflow", __func__);
       -        size += sizeof(*snap);
       -
       -        snap = realloc(snap, size);
       -        if (snap == NULL)
       -                err(1, "%s", __func__);
       -        return snap;
       -}
       -
        static uint8_t *
        alloc_buf(size_t size)
        {
       @@ -135,29 +94,6 @@ extract(struct snap *snap, void *arg)
                return WALK_STOP;
        }
        
       -/* Walk through all snapshots and call fn() on each one */
       -static void
       -walk_snap(int (*fn)(struct snap *, void *), void *arg)
       -{
       -        uint64_t i;
       -
       -        xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET);
       -        for (i = 0; i < snap_hdr.nr_snaps; i++) {
       -                struct snap *snap;
       -                int ret;
       -
       -                snap = alloc_snap();
       -                read_snap(ifd, snap);
       -                snap = grow_snap(snap, snap->nr_blk_descs);
       -                read_snap_descs(ifd, snap);
       -
       -                ret = (*fn)(snap, arg);
       -                free_snap(snap);
       -                if (ret == WALK_STOP)
       -                        break;
       -        }
       -}
       -
        static void
        init(void)
        {
       @@ -229,7 +165,7 @@ main(int argc, char *argv[])
                args.md = md;
                args.fd = STDOUT_FILENO;
                args.ret = -1;
       -        walk_snap(extract, &args);
       +        walk_snap(ifd, &snap_hdr, extract, &args);
                if (args.ret != 0)
                        errx(1, "unknown snapshot: %s", id);
                term();
   DIR diff --git a/utils.c b/utils.c
       @@ -3,6 +3,7 @@
        #include <err.h>
        #include <stdint.h>
        #include <stdio.h>
       +#include <stdlib.h>
        #include <string.h>
        #include <unistd.h>
        
       @@ -128,3 +129,108 @@ load_snap_hdr(int fd, struct snap_hdr *hdr)
                read_snap_hdr(fd, hdr);
                match_ver(hdr->flags);
        }
       +
       +struct snap *
       +alloc_snap(void)
       +{
       +        struct snap *snap;
       +
       +        snap = calloc(1, sizeof(*snap));
       +        if (snap == NULL)
       +                err(1, "%s", __func__);
       +        return snap;
       +}
       +
       +void
       +free_snap(struct snap *snap)
       +{
       +        free(snap);
       +}
       +
       +struct snap *
       +grow_snap(struct snap *snap, uint64_t nr_blk_descs)
       +{
       +        size_t size;
       +
       +        if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0]))
       +                errx(1, "%s: overflow", __func__);
       +        size = nr_blk_descs * sizeof(snap->blk_desc[0]);
       +
       +        if (size > SIZE_MAX - sizeof(*snap))
       +                errx(1, "%s: overflow", __func__);
       +        size += sizeof(*snap);
       +
       +        snap = realloc(snap, size);
       +        if (snap == NULL)
       +                err(1, "%s", __func__);
       +        return snap;
       +}
       +
       +void
       +append_snap(int fd, struct snap_hdr *hdr, struct snap *snap)
       +{
       +        if (snap->nr_blk_descs > UINT64_MAX / BLK_DESC_SIZE)
       +                errx(1, "%s: overflow", __func__);
       +        snap->size = snap->nr_blk_descs * BLK_DESC_SIZE;
       +
       +        if (snap->size > UINT64_MAX - SNAPSHOT_SIZE)
       +                errx(1, "%s: overflow", __func__);
       +        snap->size += SNAPSHOT_SIZE;
       +
       +        xlseek(fd, hdr->size, SEEK_SET);
       +        write_snap(fd, snap);
       +        write_snap_blk_descs(fd, snap);
       +
       +        if (hdr->size > UINT64_MAX - snap->size)
       +                errx(1, "%s: overflow", __func__);
       +        hdr->size += snap->size;
       +
       +        if (hdr->nr_snaps > UINT64_MAX - 1)
       +                errx(1, "%s: overflow", __func__);
       +        hdr->nr_snaps++;
       +}
       +
       +/*
       + * The snapshot hash is calculated over the
       + * hash of its block descriptors.
       + */
       +void
       +hash_snap(struct snap *snap, uint8_t *md, int hash_algo)
       +{
       +        struct hash_ctx ctx;
       +        uint64_t i;
       +
       +        if (hash_init(&ctx, hash_algo, MD_SIZE) < 0)
       +                errx(1, "hash_init failed");
       +        for (i = 0; i < snap->nr_blk_descs; i++) {
       +                struct blk_desc *blk_desc;
       +
       +                blk_desc = &snap->blk_desc[i];
       +                hash_update(&ctx, blk_desc->md, sizeof(blk_desc->md));
       +        }
       +        hash_final(&ctx, md, MD_SIZE);
       +}
       +
       +/* Walk through all snapshots and call fn() on each one */
       +void
       +walk_snap(int fd, struct snap_hdr *hdr,
       +          int (*fn)(struct snap *, void *), void *arg)
       +{
       +        uint64_t i;
       +
       +        xlseek(fd, SNAP_HDR_SIZE, SEEK_SET);
       +        for (i = 0; i < hdr->nr_snaps; i++) {
       +                struct snap *snap;
       +                int ret;
       +
       +                snap = alloc_snap();
       +                read_snap(fd, snap);
       +                snap = grow_snap(snap, snap->nr_blk_descs);
       +                read_snap_descs(fd, snap);
       +
       +                ret = (*fn)(snap, arg);
       +                free_snap(snap);
       +                if (ret == WALK_STOP)
       +                        break;
       +        }
       +}