xref: /llvm-project/libc/src/sys/stat/linux/mkdir.cpp (revision 7b663bd9179a205d5a65a34e447fbeffcb43c194)
1b8385162SSiva Chandra Reddy //===-- Linux implementation of mkdir -------------------------------------===//
2b8385162SSiva Chandra Reddy //
3b8385162SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b8385162SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5b8385162SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b8385162SSiva Chandra Reddy //
7b8385162SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8b8385162SSiva Chandra Reddy 
9b8385162SSiva Chandra Reddy #include "src/sys/stat/mkdir.h"
10b8385162SSiva Chandra Reddy 
11b8385162SSiva Chandra Reddy #include "src/__support/OSUtil/syscall.h" // For internal syscall function.
12b8385162SSiva Chandra Reddy #include "src/__support/common.h"
13b8385162SSiva Chandra Reddy 
14*7b663bd9SJob Henandez Lara #include "hdr/fcntl_macros.h"
15abc49cc1SJob Henandez Lara #include "hdr/types/mode_t.h"
165ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
17204587a3SSiva Chandra Reddy #include "src/errno/libc_errno.h"
18b8385162SSiva Chandra Reddy #include <sys/stat.h>
19b8385162SSiva Chandra Reddy #include <sys/syscall.h> // For syscall numbers.
20b8385162SSiva Chandra Reddy 
215ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
22b8385162SSiva Chandra Reddy 
23b8385162SSiva Chandra Reddy LLVM_LIBC_FUNCTION(int, mkdir, (const char *path, mode_t mode)) {
24b8385162SSiva Chandra Reddy #ifdef SYS_mkdir
25b6bc9d72SGuillaume Chatelet   int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_mkdir, path, mode);
26545331abSSiva Chandra Reddy #elif defined(SYS_mkdirat)
27b6bc9d72SGuillaume Chatelet   int ret =
28b6bc9d72SGuillaume Chatelet       LIBC_NAMESPACE::syscall_impl<int>(SYS_mkdirat, AT_FDCWD, path, mode);
29b8385162SSiva Chandra Reddy #else
30b8385162SSiva Chandra Reddy #error "mkdir and mkdirat syscalls not available."
31b8385162SSiva Chandra Reddy #endif
32b8385162SSiva Chandra Reddy 
33b8385162SSiva Chandra Reddy   if (ret < 0) {
34204587a3SSiva Chandra Reddy     libc_errno = -ret;
35b8385162SSiva Chandra Reddy     return -1;
36b8385162SSiva Chandra Reddy   }
37b8385162SSiva Chandra Reddy   return 0;
38b8385162SSiva Chandra Reddy }
39b8385162SSiva Chandra Reddy 
405ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
41