summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-03-15 19:26:30 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-03-17 13:02:18 -0400
commit1d4b557d1b5cd200b27562808c690653658ffadf (patch)
tree0f49973729ab79de05e5522a2c8e88af26d5fbf1
parent7a827fcb115b6e03e351599db76f247e199d6351 (diff)
basic/missing: add copy_file_range
syscall numbers based on: https://fedora.juszkiewicz.com.pl/syscalls.html
-rw-r--r--configure.ac15
-rw-r--r--src/basic/missing.h30
2 files changed, 43 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index 79340bcca9..cb14abda05 100644
--- a/configure.ac
+++ b/configure.ac
@@ -296,8 +296,19 @@ LIBS="$save_LIBS"
AC_SUBST(CAP_LIBS)
AC_CHECK_FUNCS([__secure_getenv secure_getenv])
-AC_CHECK_DECLS([memfd_create, gettid, pivot_root, name_to_handle_at, setns, getrandom, renameat2, kcmp, keyctl, LO_FLAGS_PARTSCAN],
- [], [], [[
+AC_CHECK_DECLS([
+ memfd_create,
+ gettid,
+ pivot_root,
+ name_to_handle_at,
+ setns,
+ getrandom,
+ renameat2,
+ kcmp,
+ keyctl,
+ LO_FLAGS_PARTSCAN,
+ copy_file_range],
+ [], [], [[
#include <sys/types.h>
#include <unistd.h>
#include <sys/mount.h>
diff --git a/src/basic/missing.h b/src/basic/missing.h
index 417604aa64..bdea7606e6 100644
--- a/src/basic/missing.h
+++ b/src/basic/missing.h
@@ -1177,3 +1177,33 @@ static inline key_serial_t request_key(const char *type, const char *description
#endif
#endif
+
+#ifndef __NR_copy_file_range
+# if defined(__x86_64__)
+# define __NR_copy_file_range 326
+# elif defined(__i386__)
+# define __NR_copy_file_range 377
+# elif defined __s390__
+# define __NR_copy_file_range 375
+# elif defined __arm__
+# define __NR_copy_file_range 391
+# elif defined __aarch64__
+# define __NR_copy_file_range 285
+# else
+# warning "__NR_copy_file_range not defined for your architecture"
+# endif
+#endif
+
+#if !HAVE_DECL_COPY_FILE_RANGE
+static inline ssize_t copy_file_range(int fd_in, loff_t *off_in,
+ int fd_out, loff_t *off_out,
+ size_t len,
+ unsigned int flags) {
+#ifdef __NR_copy_file_range
+ return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+#endif