mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-29 14:14:45 +03:00
Kernel+LibC+LibCore: Implement mkdirat(2)
This commit is contained in:
parent
6445a706cf
commit
eb5389e933
Notes:
sideshowbarker
2024-07-17 03:24:00 +09:00
Author: https://github.com/sin-ack Commit: https://github.com/SerenityOS/serenity/commit/eb5389e933 Pull-request: https://github.com/SerenityOS/serenity/pull/15428 Reviewed-by: https://github.com/ADKaster ✅ Reviewed-by: https://github.com/AtkinsSJ Reviewed-by: https://github.com/BertalanD Reviewed-by: https://github.com/linusg Reviewed-by: https://github.com/timschumi
@ -374,7 +374,7 @@ public:
|
||||
ErrorOr<FlatPtr> sys$access(Userspace<char const*> pathname, size_t path_length, int mode);
|
||||
ErrorOr<FlatPtr> sys$fcntl(int fd, int cmd, uintptr_t extra_arg);
|
||||
ErrorOr<FlatPtr> sys$ioctl(int fd, unsigned request, FlatPtr arg);
|
||||
ErrorOr<FlatPtr> sys$mkdir(Userspace<char const*> pathname, size_t path_length, mode_t mode);
|
||||
ErrorOr<FlatPtr> sys$mkdir(int dirfd, Userspace<char const*> pathname, size_t path_length, mode_t mode);
|
||||
ErrorOr<FlatPtr> sys$times(Userspace<tms*>);
|
||||
ErrorOr<FlatPtr> sys$utime(Userspace<char const*> pathname, size_t path_length, Userspace<const struct utimbuf*>);
|
||||
ErrorOr<FlatPtr> sys$utimensat(Userspace<Syscall::SC_utimensat_params const*>);
|
||||
|
@ -10,12 +10,12 @@
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
ErrorOr<FlatPtr> Process::sys$mkdir(Userspace<char const*> user_path, size_t path_length, mode_t mode)
|
||||
ErrorOr<FlatPtr> Process::sys$mkdir(int dirfd, Userspace<char const*> 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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -857,7 +857,7 @@ ErrorOr<void> 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;
|
||||
|
Loading…
Reference in New Issue
Block a user