From aef91306e38b72a9704c056e4c951c04b8843ca9 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Mon, 10 Jan 2022 22:42:19 -0500 Subject: switch to C ficlonerange instead of Python --- Makefile | 4 +++- src/partvi | 2 +- src/samizdat-ficlonerange.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/samizdat-ficlonerange.c diff --git a/Makefile b/Makefile index bb35b13..3445d1f 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ prefix?=/usr/local -cc_files=wait_for_files samizdat-pinentry krng-add-entropy +cc_files=wait_for_files samizdat-pinentry krng-add-entropy samizdat-ficlonerange cpp_files=dynmenu compiled_programs=${cc_files} ${cpp_files} @@ -34,6 +34,8 @@ krng-add-entropy: src/krng-add-entropy.c | build-deps $(CC) $(CFLAGS) $< -o $@ wait_for_files: src/wait_for_files.c | build-deps $(CC) $(CFLAGS) $< -o $@ +%: src/%.c | build-deps + $(CC) $(CFLAGS) $< -o $@ dyndns_realprog = dyndns.ssh-rsa.cryptonomic.net dyndns_links = dyndns.ssh-dss.cryptonomic.net \ diff --git a/src/partvi b/src/partvi index a0ac679..3b622ed 100755 --- a/src/partvi +++ b/src/partvi @@ -272,7 +272,7 @@ clone_parts_to_target() { f=$(readlink -e "$builddir"/"${f%.conf}") || return - ficlonerange.py "$f" "$target" + samizdat-ficlonerange "$f" "$target" 0 0 0 } cleanup() diff --git a/src/samizdat-ficlonerange.c b/src/samizdat-ficlonerange.c new file mode 100644 index 0000000..a620cbf --- /dev/null +++ b/src/samizdat-ficlonerange.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + if (argc != 6) + { + fputs("Error: usage: wrong number of arguments\n", stderr); + return -1; + } + char *src_name = argv[1]; + char *dest_name = argv[2]; + u_int64_t src_offset = atoll(argv[3]); + u_int64_t src_length = atoll(argv[4]); + u_int64_t dest_offset = atoll(argv[5]); + + int src, dest; + if ((src = open(src_name, O_RDONLY)) < 0) + { + perror("Error opening input file"); + return 1; + } + if ((dest = open(dest_name, O_RDWR | O_CREAT)) < 0) + { + perror("Error opening output file"); + return 2; + } + if (dest_offset == 0) + { + struct stat buf; + stat(dest_name, &buf); + dest_offset = buf.st_size; + } + + struct file_clone_range s = {src, src_offset, src_length, dest_offset}; + if (ioctl(dest, FICLONERANGE, &s)) + { + perror("ioctl FICLONERANGE failed"); + return 3; + } + else + { + return 0; + } +} + -- cgit v1.2.3