xref: /llvm-project/libc/src/sys/sendfile/linux/sendfile.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
1b8be3dabSSiva Chandra Reddy //===-- Linux implementation of sendfile ----------------------------------===//
2b8be3dabSSiva Chandra Reddy //
3b8be3dabSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b8be3dabSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5b8be3dabSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b8be3dabSSiva Chandra Reddy //
7b8be3dabSSiva Chandra Reddy //===----------------------------------------------------------------------===//
8b8be3dabSSiva Chandra Reddy 
9b8be3dabSSiva Chandra Reddy #include "src/sys/sendfile/sendfile.h"
10b8be3dabSSiva Chandra Reddy 
11b8be3dabSSiva Chandra Reddy #include "src/__support/OSUtil/syscall.h" // For internal syscall function.
12b8be3dabSSiva Chandra Reddy #include "src/__support/common.h"
13b8be3dabSSiva Chandra Reddy 
14*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
15204587a3SSiva Chandra Reddy #include "src/errno/libc_errno.h"
16b8be3dabSSiva Chandra Reddy #include <sys/sendfile.h>
17b8be3dabSSiva Chandra Reddy #include <sys/syscall.h> // For syscall numbers.
18b8be3dabSSiva Chandra Reddy 
19*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
20b8be3dabSSiva Chandra Reddy 
21b8be3dabSSiva Chandra Reddy LLVM_LIBC_FUNCTION(ssize_t, sendfile,
22b8be3dabSSiva Chandra Reddy                    (int out_fd, int in_fd, off_t *offset, size_t count)) {
23c9783d2bSMikhail R. Gadelha #ifdef SYS_sendfile
24b6bc9d72SGuillaume Chatelet   ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_sendfile, in_fd,
25b6bc9d72SGuillaume Chatelet                                                       out_fd, offset, count);
26c9783d2bSMikhail R. Gadelha #elif defined(SYS_sendfile64)
27c9783d2bSMikhail R. Gadelha   // Same as sendfile but can handle large offsets
28c9783d2bSMikhail R. Gadelha   static_assert(sizeof(off_t) == 8);
29b6bc9d72SGuillaume Chatelet   ssize_t ret = LIBC_NAMESPACE::syscall_impl<ssize_t>(SYS_sendfile64, in_fd,
30f0a3954eSMichael Jones                                                       out_fd, offset, count);
31c9783d2bSMikhail R. Gadelha #else
32c9783d2bSMikhail R. Gadelha #error "sendfile and sendfile64 syscalls not available."
33c9783d2bSMikhail R. Gadelha #endif
34b8be3dabSSiva Chandra Reddy   if (ret < 0) {
35f0a3954eSMichael Jones     libc_errno = static_cast<int>(-ret);
36b8be3dabSSiva Chandra Reddy     return -1;
37b8be3dabSSiva Chandra Reddy   }
38b8be3dabSSiva Chandra Reddy   return ret;
39b8be3dabSSiva Chandra Reddy }
40b8be3dabSSiva Chandra Reddy 
41*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
42