From 0efdb551d80ea81fa040fc4397a246d57d598150 Mon Sep 17 00:00:00 2001 From: Harald Wolff-Thobaben Date: Sun, 21 Aug 2022 22:58:34 +0200 Subject: [PATCH] Add some test and debug helpers --- CMakeLists.txt | 4 ++- src/diffblocks.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ src/fillblocks.c | 60 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/diffblocks.c create mode 100644 src/fillblocks.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 12554bf..facb231 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,4 +10,6 @@ add_executable(mksparse src/mksparse.c) add_executable(hashtest src/hashtest.c src/hash.c) add_executable(test_merkle src/test_merkle.c src/merkle.c) -add_executable(test_mmap src/test_mmap.c) \ No newline at end of file +add_executable(test_mmap src/test_mmap.c) +add_executable(fillblocks src/fillblocks.c) +add_executable(diffblocks src/diffblocks.c src/hash.c) \ No newline at end of file diff --git a/src/diffblocks.c b/src/diffblocks.c new file mode 100644 index 0000000..f0f8abb --- /dev/null +++ b/src/diffblocks.c @@ -0,0 +1,72 @@ +// +// Created by haraldwolff on 21.08.22. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]){ + + int f1 = open(argv[1], O_RDWR); + if (f1 < 0) + { + printf("could not open %s (%s)\n", argv[1], strerror(errno)); + exit(EXIT_FAILURE); + } + long size1 = lseek(f1, 0, SEEK_END); + + void *mm1 = mmap(NULL, size1, PROT_READ | PROT_WRITE, MAP_SHARED, f1, 0); + if (mm1 == MAP_FAILED){ + printf("could not mmap file."); + exit(EXIT_FAILURE); + } + + int f2 = open(argv[2], O_RDWR); + if (f2 < 0) + { + printf("could not open %s (%s)\n", argv[2], strerror(errno)); + exit(EXIT_FAILURE); + } + long size2 = lseek(f2, 0, SEEK_END); + + void *mm2 = mmap(NULL, size2, PROT_READ | PROT_WRITE, MAP_SHARED, f2, 0); + if (mm2 == MAP_FAILED){ + printf("could not mmap file."); + exit(EXIT_FAILURE); + } + + + long offset = 0; + u_int64_t *t1 = (u_int64_t *)mm1; + u_int64_t *t2 = (u_int64_t *)mm2; + + while (offset < size1) { + uint64_t h1 = dhash( &t1[(offset >> 3)], 4096); + uint64_t h2 = dhash( &t2[(offset >> 3)], 4096); + + if (h1 != h2) { + fprintf(stdout,"\r%0lx %0lx %0lx\n", offset, h1, h2); + fflush(stdout); + } + + offset += 4096; + + fprintf(stdout, "\roffset: 0x%llx %d%%", offset, (100 * offset / size1)); + fflush(stdout); + } + + munmap(mm1, size1); + munmap(mm2, size2); + + close(f1); + close(f2); + +} \ No newline at end of file diff --git a/src/fillblocks.c b/src/fillblocks.c new file mode 100644 index 0000000..3befab8 --- /dev/null +++ b/src/fillblocks.c @@ -0,0 +1,60 @@ +// +// Created by haraldwolff on 21.08.22. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]){ + int ch; + char filename[1024] = ""; + + while ((ch = getopt(argc, argv, "f:"))!=-1){ + switch (ch){ + case 'f': + strncpy(filename, optarg, 1024); + break; + } + } + + if (!filename[0]){ + printf("need filename: blockfill -f \n"); + exit(EXIT_FAILURE); + } + + int f = open(filename, O_RDWR); + if (f < 0) + { + printf("could not open %s (%s)\n", filename, strerror(errno)); + exit(EXIT_FAILURE); + } + long size = lseek(f, 0, SEEK_END); + + void *mm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, f, 0); + if (mm == MAP_FAILED){ + printf("could not mmap file."); + } else { + long offset = 0; + u_int64_t *t = (u_int64_t *)mm; + + while (offset < size) { + for (int n = 0; n < 512; n++) { + t[ (offset >> 3) + n ] = offset; + } + offset += 4096; + printf("\roffset: 0x%llx %d%%", offset, (100 * offset / size)); + } + printf("\n"); + + munmap(mm, size); + } + close(f); + +} \ No newline at end of file