1f6506ec4SSiva Chandra Reddy //===-- Linux implementation of truncate ----------------------------------===// 2f6506ec4SSiva Chandra Reddy // 3f6506ec4SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f6506ec4SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5f6506ec4SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f6506ec4SSiva Chandra Reddy // 7f6506ec4SSiva Chandra Reddy //===----------------------------------------------------------------------===// 8f6506ec4SSiva Chandra Reddy 9f6506ec4SSiva Chandra Reddy #include "src/unistd/truncate.h" 10f6506ec4SSiva Chandra Reddy 11f6506ec4SSiva Chandra Reddy #include "src/__support/OSUtil/syscall.h" // For internal syscall function. 12f6506ec4SSiva Chandra Reddy #include "src/__support/common.h" 135ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 14204587a3SSiva Chandra Reddy #include "src/errno/libc_errno.h" 15f6506ec4SSiva Chandra Reddy 16*7477b61bSTristan Ross #include "hdr/unistd_macros.h" 17c9783d2bSMikhail R. Gadelha #include <stdint.h> // For uint64_t. 18f6506ec4SSiva Chandra Reddy #include <sys/syscall.h> // For syscall numbers. 19f6506ec4SSiva Chandra Reddy 205ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 21f6506ec4SSiva Chandra Reddy 22f6506ec4SSiva Chandra Reddy LLVM_LIBC_FUNCTION(int, truncate, (const char *path, off_t len)) { 23c9783d2bSMikhail R. Gadelha #ifdef SYS_truncate 24b6bc9d72SGuillaume Chatelet int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_truncate, path, len); 25c9783d2bSMikhail R. Gadelha #elif defined(SYS_truncate64) 26c9783d2bSMikhail R. Gadelha // Same as truncate but can handle large offsets 27c9783d2bSMikhail R. Gadelha static_assert(sizeof(off_t) == 8); 28b6bc9d72SGuillaume Chatelet int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_truncate64, path, (long)len, 29c9783d2bSMikhail R. Gadelha (long)(((uint64_t)(len)) >> 32)); 30c9783d2bSMikhail R. Gadelha #else 31c9783d2bSMikhail R. Gadelha #error "truncate and truncate64 syscalls not available." 32c9783d2bSMikhail R. Gadelha #endif 33f6506ec4SSiva Chandra Reddy if (ret < 0) { 34204587a3SSiva Chandra Reddy libc_errno = -ret; 35f6506ec4SSiva Chandra Reddy return -1; 36f6506ec4SSiva Chandra Reddy } 37f6506ec4SSiva Chandra Reddy return 0; 38f6506ec4SSiva Chandra Reddy } 39f6506ec4SSiva Chandra Reddy 405ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 41