[PATCH] copy.c: use `sendfile()` for in-kernel file copying on Linux
- From
George Hu <integral@archlinux.org>
- Date
- Feb 13, 2026, 12:46 UTC
- Message-ID
- <20260213124656.218396-1-integral@archlinux.org>
The `sendfile()` system call copies data between one file descriptor and another within the kernel, which is more efficient than the combination of `read()` and `write()`.
Signed-off-by: George Hu <integral@archlinux.org> --- copy.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/copy.c b/copy.c index b668209b6c..d4b7cde764 100644 --- a/copy.c +++ b/copy.c @@ -7,8 +7,23 @@ #include "strbuf.h" #include "abspath.h" +#ifdef __linux__ +# include <sys/sendfile.h> +#endif + int copy_fd(int ifd, int ofd) { +#ifdef __linux__ + struct stat ifd_st; + size_t ifd_len; + ssize_t ret = 0; + + fstat(ifd, &ifd_st); + ifd_len = ifd_st.st_size; + + while (ifd_len && (ret = sendfile(ofd, ifd, NULL, ifd_len)) > 0) + ifd_len -= (size_t)ret; +#else while (1) { char buffer[8192]; ssize_t len = xread(ifd, buffer, sizeof(buffer)); @@ -19,6 +34,8 @@ int copy_fd(int ifd, int ofd) if (write_in_full(ofd, buffer, len) < 0) return COPY_WRITE_ERROR; } +#endif + return 0; }
-- 2.53.0