mirror of
https://github.com/samba-team/samba.git
synced 2025-01-10 01:18:15 +03:00
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
This commit is contained in:
parent
22a58a5184
commit
4354823c51
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user