Linux: consolidate sendfile implementation

This is similar to other LFS consolidation, where the non-LFS is only
built if __OFF_T_MATCHES_OFF64_T is not defined and the LFS version
is aliased to non-LFS name if __OFF_T_MATCHES_OFF64_T is defined.

For non-LFS variant, use sendfile syscall if defined, otherwise use
sendfile64 plus the offset overflow check (as generic implementation).

Checked on x86_64-linux-gnu.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Adhemerval Zanella Netto 2022-10-19 19:14:18 -03:00 committed by Adhemerval Zanella
parent 9cffb295e3
commit 04e7e2658c
7 changed files with 49 additions and 11 deletions

View File

@ -1 +0,0 @@
/* sendfile64 is alias of sendfile syscall. */

View File

@ -1,3 +0,0 @@
# File name Caller Syscall name # args Strong name Weak names
sendfile - sendfile i:iipi sendfile sendfile64

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2011-2022 Free Software Foundation, Inc.
/* Transfer data between file descriptors. Linux version.
Copyright (C) 2011-2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -20,11 +21,16 @@
#include <errno.h>
#include <sysdep.h>
#ifndef __OFF_T_MATCHES_OFF64_T
/* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
descriptor OUT_FD. */
ssize_t
sendfile (int out_fd, int in_fd, off_t *offset, size_t count)
{
# ifdef __NR_sendfile
return INLINE_SYSCALL_CALL (sendfile, out_fd, in_fd, offset, count);
# else
__off64_t off64;
int rc;
@ -38,9 +44,12 @@ sendfile (int out_fd, int in_fd, off_t *offset, size_t count)
off64 = *offset;
}
rc = INLINE_SYSCALL (sendfile64, 4, out_fd, in_fd,
offset ? &off64 : NULL, count);
rc = INLINE_SYSCALL_CALL (sendfile64, out_fd, in_fd, offset ? &off64 : NULL,
count);
if (offset)
*offset = off64;
return rc;
# endif
}
#endif

View File

@ -0,0 +1,37 @@
/* Transfer data between file descriptors. Linux version.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
#include <sys/sendfile.h>
#include <stddef.h>
#include <errno.h>
#include <sysdep.h>
/* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
descriptor OUT_FD. */
ssize_t
sendfile64 (int out_fd, int in_fd, off64_t *offset, size_t count)
{
#ifndef __NR_sendfile64
# define __NR_sendfile64 __NR_sendfile
#endif
return INLINE_SYSCALL_CALL (sendfile64, out_fd, in_fd, offset, count);
}
#ifdef __OFF_T_MATCHES_OFF64_T
strong_alias (sendfile64, sendfile)
#endif

View File

@ -62,8 +62,6 @@ sched_primin - sched_get_priority_min i:i __sched_get_priority_min sched_get_pri
sched_setp - sched_setparam i:ip __sched_setparam sched_setparam
sched_sets - sched_setscheduler i:iip __sched_setscheduler sched_setscheduler
sched_yield - sched_yield i: __sched_yield sched_yield
sendfile - sendfile i:iipU sendfile
sendfile64 - sendfile64 i:iipU sendfile64
setfsgid EXTRA setfsgid i:i setfsgid
setfsuid EXTRA setfsuid i:i setfsuid
setpgid - setpgid i:ii __setpgid setpgid

View File

@ -1 +0,0 @@
/* sendfile64 is alias of sendfile syscall. */

View File

@ -1,4 +1,3 @@
# File name Caller Syscall name # args Strong name Weak names
sendfile - sendfile i:iipi sendfile sendfile64
personality EXTRA personality i:i __personality personality