Subject: [bug#66870] [PATCH v6 08/11] gnu: Add rust-reflink-0.1.

From: Sughosha <[email-masked]>
Date: Thu, 28 Nov 2024 22:45:11 +0530

* gnu/packages/crates-io.scm (rust-reflink-0.1): New variable.
* gnu/packages/patches/rust-reflink-0.1-fix-64bit-toolchain-assumption.patch:
 New file.
* gnu/local.mk: Register the patch file.

Change-Id: I193db0f4e51a133b8791ca9461032655da20137f
---
 gnu/local.mk                                  |  1 +
 gnu/packages/crates-io.scm                    | 25 +++++++++++++++++++
 ...k-0.1-fix-64bit-toolchain-assumption.patch | 24 ++++++++++++++++++
 3 files changed, 50 insertions(+)
 create mode 100644 gnu/packages/patches/rust-reflink-0.1-fix-64bit-toolchain-assumption.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index bc93477fa3..bfe80f3ebe 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -2133,6 +2133,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/rust-1.64-fix-riscv64-bootstrap.patch	\
   %D%/packages/patches/rust-1.70-fix-rustix-build.patch	\
   %D%/packages/patches/rust-cargo-edit-remove-ureq.patch	\
+  %D%/packages/patches/rust-reflink-0.1-fix-64bit-toolchain-assumption.patch	\
   %D%/packages/patches/rust-ring-0.17-ring-core.patch		\
   %D%/packages/patches/rust-ndarray-remove-blas-src-dep.patch	\
   %D%/packages/patches/rust-ndarray-0.13-remove-blas-src.patch	\
diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index ce339eb3d6..bf41835bf7 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -62339,6 +62339,31 @@ (define-public rust-reference-counted-singleton-0.1
 can be recreated as needed.")
     (license license:expat)))
 
+(define-public rust-reflink-0.1
+  (package
+    (name "rust-reflink")
+    (version "0.1.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "reflink" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1glcyqvryv2zj6kjbfji0cldrkincqx3ds3wjwl4qnsnig15wn5w"))
+       (patches
+        (search-patches
+          "rust-reflink-0.1-fix-64bit-toolchain-assumption.patch"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-libc" ,rust-libc-0.2)
+        ("rust-winapi" ,rust-winapi-0.3))))
+    (home-page "https://github.com/nicokoch/reflink")
+    (synopsis "Copy-on-write mechanism on supported file systems")
+    (description "This package provides copy-on-write mechanism on supported
+file systems.")
+    (license (list license:expat license:asl2.0))))
+
 (define-public rust-refpool-0.4
   (package
     (name "rust-refpool")
diff --git a/gnu/packages/patches/rust-reflink-0.1-fix-64bit-toolchain-assumption.patch b/gnu/packages/patches/rust-reflink-0.1-fix-64bit-toolchain-assumption.patch
new file mode 100644
index 0000000000..1fc877815f
--- /dev/null
+++ b/gnu/packages/patches/rust-reflink-0.1-fix-64bit-toolchain-assumption.patch
@@ -0,0 +1,24 @@
+This patch fixes assuming a 64-bit toolchain.
+https://github.com/nicokoch/reflink/pull/5
+
+
+--- reflink-0.1.3/src/sys/unix.rs	2019-04-02 16:13:06.000000000 +0200
++++ "reflink-0.1.3 (Kopie)/src/sys/unix.rs"	2023-06-29 09:47:26.867681403 +0200
+@@ -7,7 +7,7 @@
+     use std::os::unix::io::AsRawFd;
+ 
+     // TODO is this equal on all archs? Just tested on x86_64 and x86.
+-    const IOCTL_FICLONE: u64 = 0x40049409;
++    macro_rules! IOCTL_FICLONE { () => (0x40049409) };
+ 
+     let src = fs::File::open(&from)?;
+ 
+@@ -18,7 +18,7 @@
+         .open(&to)?;
+     let ret = unsafe {
+         // http://man7.org/linux/man-pages/man2/ioctl_ficlonerange.2.html
+-        libc::ioctl(dest.as_raw_fd(), IOCTL_FICLONE, src.as_raw_fd())
++        libc::ioctl(dest.as_raw_fd(), IOCTL_FICLONE!(), src.as_raw_fd())
+     };
+ 
+     if ret == -1 {
\ No newline at end of file
-- 
2.46.0