14abfe47eSSiva Chandra Reddy //===-- Implementation of creat -------------------------------------------===// 24abfe47eSSiva Chandra Reddy // 34abfe47eSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 44abfe47eSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 54abfe47eSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64abfe47eSSiva Chandra Reddy // 74abfe47eSSiva Chandra Reddy //===----------------------------------------------------------------------===// 84abfe47eSSiva Chandra Reddy 94abfe47eSSiva Chandra Reddy #include "src/fcntl/creat.h" 104abfe47eSSiva Chandra Reddy 114abfe47eSSiva Chandra Reddy #include "src/__support/OSUtil/syscall.h" // For internal syscall function. 124abfe47eSSiva Chandra Reddy #include "src/__support/common.h" 134abfe47eSSiva Chandra Reddy 144abfe47eSSiva Chandra Reddy #include <errno.h> 154abfe47eSSiva Chandra Reddy #include <fcntl.h> 164abfe47eSSiva Chandra Reddy #include <sys/syscall.h> // For syscall numbers. 174abfe47eSSiva Chandra Reddy 184abfe47eSSiva Chandra Reddy namespace __llvm_libc { 194abfe47eSSiva Chandra Reddy 204abfe47eSSiva Chandra Reddy LLVM_LIBC_FUNCTION(int, creat, (const char *path, int mode_flags)) { 21*0e91c48dSSiva Chandra #ifdef SYS_open 224abfe47eSSiva Chandra Reddy int fd = __llvm_libc::syscall(SYS_open, path, O_CREAT | O_WRONLY | O_TRUNC, 234abfe47eSSiva Chandra Reddy mode_flags); 24*0e91c48dSSiva Chandra #else 25*0e91c48dSSiva Chandra int fd = __llvm_libc::syscall(SYS_openat, AT_FDCWD, path, 26*0e91c48dSSiva Chandra O_CREAT | O_WRONLY | O_TRUNC, mode_flags); 27*0e91c48dSSiva Chandra #endif 28*0e91c48dSSiva Chandra 294abfe47eSSiva Chandra Reddy if (fd > 0) 304abfe47eSSiva Chandra Reddy return fd; 314abfe47eSSiva Chandra Reddy 324abfe47eSSiva Chandra Reddy errno = -fd; 334abfe47eSSiva Chandra Reddy return -1; 344abfe47eSSiva Chandra Reddy } 354abfe47eSSiva Chandra Reddy 364abfe47eSSiva Chandra Reddy } // namespace __llvm_libc 37