summaryrefslogtreecommitdiff
path: root/lib/replace
diff options
context:
space:
mode:
authorRalph Boehme <slow@samba.org>2021-08-07 17:18:25 +0200
committerJeremy Allison <jra@samba.org>2021-08-10 19:37:14 +0000
commit4354823c5146753ef8a3791bc8562379096659b8 (patch)
tree0d9664187118fc1dca541e4bcf22a328f0867ea8 /lib/replace
parent22a58a51846749495613e5b572c31ba4752bc61b (diff)
downloadsamba-4354823c5146753ef8a3791bc8562379096659b8.tar.gz
libreplace: properly execute SYS_copy_file_range check
It seems some systems (like Centos 7) have the SYS_copy_file_range define but fail the syscall when actually being called. The current configure check is only compiled, not run so erroneously reports a working SYS_copy_file_range. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14786 RN: Insufficient libreplace check for SYS_copy_file_range check Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Tue Aug 10 19:37:14 UTC 2021 on sn-devel-184
Diffstat (limited to 'lib/replace')
-rw-r--r--lib/replace/wscript26
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/replace/wscript b/lib/replace/wscript
index 3cc0adeeb34..9c23d549dab 100644
--- a/lib/replace/wscript
+++ b/lib/replace/wscript
@@ -456,10 +456,32 @@ def configure(conf):
conf.CHECK_FUNCS('getprogname')
if not conf.CHECK_FUNCS('copy_file_range'):
conf.CHECK_CODE('''
-syscall(SYS_copy_file_range,0,NULL,0,NULL,0,0);
+ int src_fd = -1, dst_fd = -1, ret;
+ ssize_t written;
+ char src[]="/tmp/test.XXXXXX";
+ char dst[]="/tmp/test.XXXXXX";
+ src_fd = mkstemp(src);
+ if (src_fd == -1) {ret = 1; goto cleanup;}
+ dst_fd = mkstemp(dst);
+ if (dst_fd == -1) {ret = 2; goto cleanup;}
+ written = pwrite(src_fd, "x", 1, 0);
+ if (written != 1) {ret = 3; goto cleanup;}
+ written = syscall(SYS_copy_file_range,src_fd,0,dst_fd,0,1,0);
+ if (written != 1) {
+ printf("SYS_copy_file_range failed: %s", strerror(errno));
+ ret = 4; goto cleanup;
+ }
+ ret = 0;
+ cleanup:
+ if (src_fd != -1) close(src_fd);
+ if (dst_fd != -1) close(dst_fd);
+ unlink(src);
+ unlink(dst);
+ return ret;
''',
'HAVE_SYSCALL_COPY_FILE_RANGE',
- headers='sys/syscall.h unistd.h',
+ headers='errno.h string.h stdio.h sys/syscall.h unistd.h sys/types.h sys/stat.h fcntl.h',
+ execute=True,
msg='Checking whether we have copy_file_range system call')
if conf.CONFIG_SET('HAVE_COPY_FILE_RANGE') or conf.CONFIG_SET('HAVE_SYSCALL_COPY_FILE_RANGE'):
conf.DEFINE('USE_COPY_FILE_RANGE', 1)