diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 04a146bf..f9c4fd4b 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -106,7 +106,8 @@ namespace Kernel BAN::ErrorOr sys_read(int fd, void* buffer, size_t count); BAN::ErrorOr sys_write(int fd, const void* buffer, size_t count); BAN::ErrorOr sys_access(const char* path, int amode); - BAN::ErrorOr sys_create_dir(const char*, mode_t); + BAN::ErrorOr sys_mkdirat(int fd, const char* path, mode_t); + BAN::ErrorOr sys_mkfifoat(int fd, const char* path, mode_t); BAN::ErrorOr sys_hardlinkat(int fd1, const char* path1, int fd2, const char* path2, int flag); BAN::ErrorOr sys_renameat(int oldfd, const char* old, int newfd, const char* _new); BAN::ErrorOr sys_unlinkat(int fd, const char* path, int flag); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index d2bcf4ed..8c5a856d 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -1302,7 +1302,7 @@ namespace Kernel return 0; } - BAN::ErrorOr Process::sys_create_dir(const char* user_path, mode_t mode) + BAN::ErrorOr Process::sys_mkdirat(int fd, const char* user_path, mode_t mode) { char path[PATH_MAX]; TRY(read_string_from_user(user_path, path, PATH_MAX)); @@ -1313,12 +1313,29 @@ namespace Kernel uid_gid_t { m_credentials.euid(), m_credentials.egid() }; }); - auto [parent, file_name] = TRY(find_parent_file(AT_FDCWD, path, O_WRONLY)); + auto [parent, file_name] = TRY(find_parent_file(fd, path, O_WRONLY)); TRY(parent.inode->create_directory(file_name, (mode & 0777) | Inode::Mode::IFDIR, uid, gid)); return 0; } + BAN::ErrorOr Process::sys_mkfifoat(int fd, const char* user_path, mode_t mode) + { + char path[PATH_MAX]; + TRY(read_string_from_user(user_path, path, PATH_MAX)); + + struct uid_gid_t { uid_t uid; gid_t gid; }; + const auto [uid, gid] = ({ + LockGuard _(m_process_lock); + uid_gid_t { m_credentials.euid(), m_credentials.egid() }; + }); + + auto [parent, file_name] = TRY(find_parent_file(fd, path, O_WRONLY)); + TRY(parent.inode->create_file(file_name, (mode & 0777) | Inode::Mode::IFIFO, uid, gid)); + + return 0; + } + BAN::ErrorOr Process::sys_hardlinkat(int fd1, const char* user_path1, int fd2, const char* user_path2, int flag) { char path1[PATH_MAX]; @@ -1415,12 +1432,11 @@ namespace Kernel TRY(read_string_from_user(user_path1, path1, PATH_MAX)); char path2[PATH_MAX]; - if (user_path2 != nullptr) - TRY(read_string_from_user(user_path2, path2, PATH_MAX)); + TRY(read_string_from_user(user_path2, path2, PATH_MAX)); - TRY(create_file(fd, user_path2 ? path2 : nullptr, 0777 | Inode::Mode::IFLNK)); + TRY(create_file(fd, path2, 0777 | Inode::Mode::IFLNK)); - auto symlink = TRY(find_file(fd, user_path2 ? path2 : nullptr, O_NOFOLLOW)); + auto symlink = TRY(find_file(fd, path2, O_NOFOLLOW)); TRY(symlink.inode->set_link_target(path1)); return 0; diff --git a/userspace/libraries/LibC/include/sys/syscall.h b/userspace/libraries/LibC/include/sys/syscall.h index 6b0906a0..72c0b602 100644 --- a/userspace/libraries/LibC/include/sys/syscall.h +++ b/userspace/libraries/LibC/include/sys/syscall.h @@ -52,7 +52,8 @@ __BEGIN_DECLS O(SYS_TTY_CTRL, tty_ctrl) \ O(SYS_POWEROFF, poweroff) \ O(SYS_FCHMODAT, fchmodat) \ - O(SYS_CREATE_DIR, create_dir) \ + O(SYS_MKDIRAT, mkdirat) \ + O(SYS_MKFIFOAT, mkfifoat) \ O(SYS_UNLINKAT, unlinkat) \ O(SYS_READLINKAT, readlinkat) \ O(SYS_MSYNC, msync) \ diff --git a/userspace/libraries/LibC/sys/stat.cpp b/userspace/libraries/LibC/sys/stat.cpp index 4a4f7c14..51ab92d0 100644 --- a/userspace/libraries/LibC/sys/stat.cpp +++ b/userspace/libraries/LibC/sys/stat.cpp @@ -52,28 +52,27 @@ mode_t umask(mode_t cmask) int mkdir(const char* path, mode_t mode) { - return syscall(SYS_CREATE_DIR, path, __UMASKED_MODE(mode)); + return mkdirat(AT_FDCWD, path, mode); +} + +int mkdirat(int fd, const char* path, mode_t mode) +{ + return syscall(SYS_MKDIRAT, fd, path, __UMASKED_MODE(mode)); } int mkfifo(const char* path, mode_t mode) { - (void)path; (void)mode; - dwarnln("TODO: mkfifo"); - return -1; + return mkfifoat(AT_FDCWD, path, mode); } int mkfifoat(int fd, const char* path, mode_t mode) { - (void)fd; (void)path; (void)mode; - dwarnln("TODO: mkfifoat"); - return -1; + return syscall(SYS_MKFIFOAT, fd, path, __UMASKED_MODE(mode)); } int mknod(const char* path, mode_t mode, dev_t dev) { - (void)path; (void)mode; (void)dev; - dwarnln("TODO: mknod"); - return -1; + return mknodat(AT_FDCWD, path, mode, dev); } int mknodat(int fd, const char* path, mode_t mode, dev_t dev)