From 779fc0a3e637fe8b339c04b7a79984a324edfcf8 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 11 Aug 2018 19:33:38 -0400 Subject: fastsum --- .gitignore | 1 + Makefile | 1 + go/src/cow-dedupe/dedupe.go | 2 +- src/fastsum.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/fastsum.c diff --git a/.gitignore b/.gitignore index 59a4ba5..0f4733c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /cow-* *.o +/fastsum diff --git a/Makefile b/Makefile index fe3d2ca..2d52dd6 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ CPPFLAGS += -O2 -D_FORTIFY_SOURCE=2 all: cow-dedupe-range all: cow-extent-map all: cow-dedupe +all: fastsum .PHONY: all %: src/%.o diff --git a/go/src/cow-dedupe/dedupe.go b/go/src/cow-dedupe/dedupe.go index 0c40d4a..42a0178 100644 --- a/go/src/cow-dedupe/dedupe.go +++ b/go/src/cow-dedupe/dedupe.go @@ -264,7 +264,7 @@ func main() { sl = myStatusLine() size2filenames := getChecksums(sl, "Getting sizes for files... %v/%v", - []string{"stat", "--printf=%s %n\\n", "--"}, spanningFiles) + []string{"./fastsum"}, spanningFiles) sl.End(true) fmt.Fprintf(os.Stderr, " -> %d sets", len(size2filenames)) diff --git a/src/fastsum.c b/src/fastsum.c new file mode 100644 index 0000000..4578ff2 --- /dev/null +++ b/src/fastsum.c @@ -0,0 +1,53 @@ +#include /* for errno */ +#include /* for error(3gnu) */ +#include /* for O_RDONLY */ +#include /* for PRI*, uint*_t, int*_t */ +#include /* for bool */ +#include /* for printf */ +#include /* for open(2), fstat(2) and struct stat */ +#include /* for close(2), read(2), lseek(2), SEEK_SET */ + +int main(int argc, char *argv[]) { + bool err = false; + for (int i = 1; i < argc; i++) { + const char *filename = argv[i]; + + int fd = open(filename, O_RDONLY); + if (fd < 0) { + err = true; + error(0, errno, "open %s", filename); + continue; + } + + struct stat st; + if (fstat(fd, &st) < 0) { + err = true; + error(0, errno, "fstat %s", filename); + close(fd); + continue; + } + + if (lseek(fd, st.st_size/2, SEEK_SET) < 0) { + err = true; + error(0, errno, "lseek %s", filename); + close(fd); + continue; + } + + uint8_t b; + int n = read(fd, &b, sizeof(b)); + if (n <= 0) { + if (n == 0) + error(0, 0, "read %s: unexpected end of file", filename); + else + error(0, errno, "read %s", filename); + err = true; + close(fd); + continue; + } + + printf("%"PRId64":%"PRIx8" %s\n", (int64_t)st.st_size, b, filename); + close(fd); + } + return err ? 1 : 0; +} -- cgit v1.2.3