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