#include #include #include "config.h" /** * crcsync - routines to use crc for an rsync-like protocol. * * 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 * #include * #include * #include * #include * * 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 ...\n" * "OR: %s ", argv[0], argv[0]); * * file = grab_file(NULL, argv[2], &len); * if (!file) * err(1, "Opening file %s", argv[2]); * * 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 or any later version) * Author: Rusty Russell */ int main(int argc, char *argv[]) { if (argc != 2) return 1; if (strcmp(argv[1], "depends") == 0) { printf("ccan/crc\n"); printf("ccan/array_size\n"); return 0; } return 1; }