Browse Source Download (without any required ccan dependencies)

Module:

crcsync

Summary:

routines to use crc for an rsync-like protocol.

Author:

Rusty Russell <rusty@rustcorp.com.au>

Dependencies:

Description:

This is a complete library for synchronization using a variant of the rsync protocol.

Example:

// Calculate checksums of file (3-arg mode)
// Or print differences between file and checksums (4+ arg mode)
#include <ccan/crcsync/crcsync.h>
#include <ccan/tal/grab_file/grab_file.h>
#include <ccan/tal/tal.h>
#include <stdio.h>
#include <stdlib.h>
#include <err.h>

static void print_result(long result)
{
        if (result < 0)
                printf("MATCHED CRC %lu\n", -result - 1);
        else if (result > 0)
                printf("%lu literal bytes\n", result);
}

int main(int argc, char *argv[])
{
        size_t len, used, blocksize;
        char *file;
        struct crc_context *ctx;
        uint64_t *crcs;
        long res, i;

        if (argc < 3 || (blocksize = atoi(argv[1])) == 0)
                errx(1, "Usage: %s <blocksize> <file> <crc>...\n"
                     "OR: %s <blocksize> <file>", argv[0], argv[0]);

        file = grab_file(NULL, argv[2]);
        if (!file)
                err(1, "Opening file %s", argv[2]);
        len = tal_count(file) - 1;

        if (argc == 3) {
                // Short form prints CRCs of file for use in long form.
                used = (len + blocksize - 1) / blocksize;
                crcs = malloc(used * sizeof(crcs[0]));
                crc_of_blocks(file, len, blocksize, 32, crcs);
                for (i = 0; i < used; i++)
                        printf("%llu ", (long long)crcs[i]);
                printf("\n");
                return 0;
        }

        crcs = malloc((argc - 3) * sizeof(uint32_t));
        for (i = 0; i < argc-3; i++)
                crcs[i] = atoi(argv[3+i]);

        ctx = crc_context_new(blocksize, 32, crcs, argc-3, 0);
        for (used = 0; used < len; ) {
                used += crc_read_block(ctx, &res, file+used, len-used);
                print_result(res);
        }
        while ((res = crc_read_flush(ctx)) != 0)
                print_result(res);

        return 0;
}

License:

LGPL (v2.1 or any later version)