1 //===-- Implementation of openat ------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/fcntl/openat.h" 10 11 #include "src/__support/OSUtil/syscall.h" // For internal syscall function. 12 #include "src/__support/common.h" 13 #include "src/errno/libc_errno.h" 14 15 #include <fcntl.h> 16 #include <stdarg.h> 17 #include <sys/syscall.h> // For syscall numbers. 18 19 namespace LIBC_NAMESPACE { 20 21 LLVM_LIBC_FUNCTION(int, openat, (int dfd, const char *path, int flags, ...)) { 22 mode_t mode_flags = 0; 23 // O_TMPFILE is a multi-bit flag so we test all bits by checking for equality 24 // with O_TMPFILE 25 if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) { 26 va_list varargs; 27 va_start(varargs, flags); 28 mode_flags = va_arg(varargs, mode_t); 29 va_end(varargs); 30 } 31 32 int fd = LIBC_NAMESPACE::syscall_impl<int>(SYS_openat, dfd, path, flags, 33 mode_flags); 34 if (fd > 0) 35 return fd; 36 37 libc_errno = -fd; 38 return -1; 39 } 40 41 } // namespace LIBC_NAMESPACE 42