1 //===-- Implementation of open --------------------------------------------===// 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/open.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 __llvm_libc { 20 21 LLVM_LIBC_FUNCTION(int, open, (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 #ifdef SYS_open 33 int fd = __llvm_libc::syscall_impl<int>(SYS_open, path, flags, mode_flags); 34 #else 35 int fd = __llvm_libc::syscall_impl<int>(SYS_openat, AT_FDCWD, path, flags, 36 mode_flags); 37 #endif 38 if (fd > 0) 39 return fd; 40 41 libc_errno = -fd; 42 return -1; 43 } 44 45 } // namespace __llvm_libc 46