1*c0da8b53SDaniel Palmer /* SPDX-License-Identifier: LGPL-2.1 OR MIT */
2*c0da8b53SDaniel Palmer /*
3*c0da8b53SDaniel Palmer * sendfile for NOLIBC
4*c0da8b53SDaniel Palmer * Copyright (C) 2026 Daniel Palmer <daniel@thingy.jp>
5*c0da8b53SDaniel Palmer */
6*c0da8b53SDaniel Palmer
7*c0da8b53SDaniel Palmer /* make sure to include all global symbols */
8*c0da8b53SDaniel Palmer #include "../nolibc.h"
9*c0da8b53SDaniel Palmer
10*c0da8b53SDaniel Palmer #ifndef _NOLIBC_SYS_SENDFILE_H
11*c0da8b53SDaniel Palmer #define _NOLIBC_SYS_SENDFILE_H
12*c0da8b53SDaniel Palmer
13*c0da8b53SDaniel Palmer #include "../sys.h"
14*c0da8b53SDaniel Palmer #include <linux/unistd.h>
15*c0da8b53SDaniel Palmer
16*c0da8b53SDaniel Palmer /*
17*c0da8b53SDaniel Palmer * ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
18*c0da8b53SDaniel Palmer */
19*c0da8b53SDaniel Palmer
20*c0da8b53SDaniel Palmer static __attribute__((unused))
_sys_sendfile(int out_fd,int in_fd,off_t * offset,size_t count)21*c0da8b53SDaniel Palmer ssize_t _sys_sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
22*c0da8b53SDaniel Palmer {
23*c0da8b53SDaniel Palmer __nolibc_static_assert(sizeof(*offset) == sizeof(__kernel_loff_t));
24*c0da8b53SDaniel Palmer
25*c0da8b53SDaniel Palmer #ifdef __NR_sendfile64
26*c0da8b53SDaniel Palmer /* 32-bit applications use sendfile64 so offset is treated as a __kernel_loff_t */
27*c0da8b53SDaniel Palmer return __nolibc_syscall4(__NR_sendfile64, out_fd, in_fd, offset, count);
28*c0da8b53SDaniel Palmer #else
29*c0da8b53SDaniel Palmer __nolibc_static_assert(sizeof(*offset) == sizeof(__kernel_off_t));
30*c0da8b53SDaniel Palmer
31*c0da8b53SDaniel Palmer return __nolibc_syscall4(__NR_sendfile, out_fd, in_fd, offset, count);
32*c0da8b53SDaniel Palmer #endif
33*c0da8b53SDaniel Palmer }
34*c0da8b53SDaniel Palmer
35*c0da8b53SDaniel Palmer static __attribute__((unused))
sendfile(int out_fd,int in_fd,off_t * offset,size_t count)36*c0da8b53SDaniel Palmer ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
37*c0da8b53SDaniel Palmer {
38*c0da8b53SDaniel Palmer return __sysret(_sys_sendfile(out_fd, in_fd, offset, count));
39*c0da8b53SDaniel Palmer }
40*c0da8b53SDaniel Palmer
41*c0da8b53SDaniel Palmer #endif /* _NOLIBC_SYS_SENDFILE_H */
42