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