From eb5389e933bec98735e71c3bab3706841647af48 Mon Sep 17 00:00:00 2001 From: sin-ack Date: Sat, 1 Oct 2022 11:36:24 +0000 Subject: [PATCH] Kernel+LibC+LibCore: Implement `mkdirat(2)` --- Kernel/Process.h | 2 +- Kernel/Syscalls/mkdir.cpp | 4 ++-- Userland/Libraries/LibC/stat.cpp | 8 +++++++- Userland/Libraries/LibC/sys/stat.h | 1 + Userland/Libraries/LibCore/System.cpp | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Kernel/Process.h b/Kernel/Process.h index 3147965db38..cc1410d9e05 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -374,7 +374,7 @@ public: ErrorOr sys$access(Userspace pathname, size_t path_length, int mode); ErrorOr sys$fcntl(int fd, int cmd, uintptr_t extra_arg); ErrorOr sys$ioctl(int fd, unsigned request, FlatPtr arg); - ErrorOr sys$mkdir(Userspace pathname, size_t path_length, mode_t mode); + ErrorOr sys$mkdir(int dirfd, Userspace pathname, size_t path_length, mode_t mode); ErrorOr sys$times(Userspace); ErrorOr sys$utime(Userspace pathname, size_t path_length, Userspace); ErrorOr sys$utimensat(Userspace); diff --git a/Kernel/Syscalls/mkdir.cpp b/Kernel/Syscalls/mkdir.cpp index 7cd0de8cbdc..e614316c8b8 100644 --- a/Kernel/Syscalls/mkdir.cpp +++ b/Kernel/Syscalls/mkdir.cpp @@ -10,12 +10,12 @@ namespace Kernel { -ErrorOr Process::sys$mkdir(Userspace user_path, size_t path_length, mode_t mode) +ErrorOr Process::sys$mkdir(int dirfd, Userspace user_path, size_t path_length, mode_t mode) { VERIFY_NO_PROCESS_BIG_LOCK(this); TRY(require_promise(Pledge::cpath)); auto path = TRY(get_syscall_path_argument(user_path, path_length)); - TRY(VirtualFileSystem::the().mkdir(credentials(), path->view(), mode & ~umask(), current_directory())); + TRY(VirtualFileSystem::the().mkdir(credentials(), path->view(), mode & ~umask(), TRY(custody_for_dirfd(dirfd)))); return 0; } } diff --git a/Userland/Libraries/LibC/stat.cpp b/Userland/Libraries/LibC/stat.cpp index d1ce13ea902..10c95b1d260 100644 --- a/Userland/Libraries/LibC/stat.cpp +++ b/Userland/Libraries/LibC/stat.cpp @@ -23,12 +23,18 @@ mode_t umask(mode_t mask) // https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html int mkdir(char const* pathname, mode_t mode) +{ + return mkdirat(AT_FDCWD, pathname, mode); +} + +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdirat.html +int mkdirat(int dirfd, char const* pathname, mode_t mode) { if (!pathname) { errno = EFAULT; return -1; } - int rc = syscall(SC_mkdir, pathname, strlen(pathname), mode); + int rc = syscall(SC_mkdir, dirfd, pathname, strlen(pathname), mode); __RETURN_WITH_ERRNO(rc, rc, -1); } diff --git a/Userland/Libraries/LibC/sys/stat.h b/Userland/Libraries/LibC/sys/stat.h index 16b8a2c2e81..e9a4e9b0300 100644 --- a/Userland/Libraries/LibC/sys/stat.h +++ b/Userland/Libraries/LibC/sys/stat.h @@ -18,6 +18,7 @@ int chmod(char const* pathname, mode_t); int fchmodat(int fd, char const* path, mode_t mode, int flag); int fchmod(int fd, mode_t); int mkdir(char const* pathname, mode_t); +int mkdirat(int dirfd, char const* pathname, mode_t); int mkfifo(char const* pathname, mode_t); int fstat(int fd, struct stat* statbuf); int lstat(char const* path, struct stat* statbuf); diff --git a/Userland/Libraries/LibCore/System.cpp b/Userland/Libraries/LibCore/System.cpp index e4576c4f633..11c8ea9b02f 100644 --- a/Userland/Libraries/LibCore/System.cpp +++ b/Userland/Libraries/LibCore/System.cpp @@ -857,7 +857,7 @@ ErrorOr mkdir(StringView path, mode_t mode) if (path.is_null()) return Error::from_errno(EFAULT); #ifdef AK_OS_SERENITY - int rc = syscall(SC_mkdir, path.characters_without_null_termination(), path.length(), mode); + int rc = syscall(SC_mkdir, AT_FDCWD, path.characters_without_null_termination(), path.length(), mode); HANDLE_SYSCALL_RETURN_VALUE("mkdir", rc, {}); #else DeprecatedString path_string = path;