Kernel: Add support for mkfifo{,at} mkdir at
Opening FIFOs still dont work as expected but at least you can create them now :D
This commit is contained in:
@@ -106,7 +106,8 @@ namespace Kernel
|
|||||||
BAN::ErrorOr<long> sys_read(int fd, void* buffer, size_t count);
|
BAN::ErrorOr<long> sys_read(int fd, void* buffer, size_t count);
|
||||||
BAN::ErrorOr<long> sys_write(int fd, const void* buffer, size_t count);
|
BAN::ErrorOr<long> sys_write(int fd, const void* buffer, size_t count);
|
||||||
BAN::ErrorOr<long> sys_access(const char* path, int amode);
|
BAN::ErrorOr<long> sys_access(const char* path, int amode);
|
||||||
BAN::ErrorOr<long> sys_create_dir(const char*, mode_t);
|
BAN::ErrorOr<long> sys_mkdirat(int fd, const char* path, mode_t);
|
||||||
|
BAN::ErrorOr<long> sys_mkfifoat(int fd, const char* path, mode_t);
|
||||||
BAN::ErrorOr<long> sys_hardlinkat(int fd1, const char* path1, int fd2, const char* path2, int flag);
|
BAN::ErrorOr<long> sys_hardlinkat(int fd1, const char* path1, int fd2, const char* path2, int flag);
|
||||||
BAN::ErrorOr<long> sys_renameat(int oldfd, const char* old, int newfd, const char* _new);
|
BAN::ErrorOr<long> sys_renameat(int oldfd, const char* old, int newfd, const char* _new);
|
||||||
BAN::ErrorOr<long> sys_unlinkat(int fd, const char* path, int flag);
|
BAN::ErrorOr<long> sys_unlinkat(int fd, const char* path, int flag);
|
||||||
|
|||||||
@@ -1302,7 +1302,7 @@ namespace Kernel
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> Process::sys_create_dir(const char* user_path, mode_t mode)
|
BAN::ErrorOr<long> Process::sys_mkdirat(int fd, const char* user_path, mode_t mode)
|
||||||
{
|
{
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
TRY(read_string_from_user(user_path, 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() };
|
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));
|
TRY(parent.inode->create_directory(file_name, (mode & 0777) | Inode::Mode::IFDIR, uid, gid));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> 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<long> Process::sys_hardlinkat(int fd1, const char* user_path1, int fd2, const char* user_path2, int flag)
|
BAN::ErrorOr<long> Process::sys_hardlinkat(int fd1, const char* user_path1, int fd2, const char* user_path2, int flag)
|
||||||
{
|
{
|
||||||
char path1[PATH_MAX];
|
char path1[PATH_MAX];
|
||||||
@@ -1415,12 +1432,11 @@ namespace Kernel
|
|||||||
TRY(read_string_from_user(user_path1, path1, PATH_MAX));
|
TRY(read_string_from_user(user_path1, path1, PATH_MAX));
|
||||||
|
|
||||||
char path2[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));
|
TRY(symlink.inode->set_link_target(path1));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ __BEGIN_DECLS
|
|||||||
O(SYS_TTY_CTRL, tty_ctrl) \
|
O(SYS_TTY_CTRL, tty_ctrl) \
|
||||||
O(SYS_POWEROFF, poweroff) \
|
O(SYS_POWEROFF, poweroff) \
|
||||||
O(SYS_FCHMODAT, fchmodat) \
|
O(SYS_FCHMODAT, fchmodat) \
|
||||||
O(SYS_CREATE_DIR, create_dir) \
|
O(SYS_MKDIRAT, mkdirat) \
|
||||||
|
O(SYS_MKFIFOAT, mkfifoat) \
|
||||||
O(SYS_UNLINKAT, unlinkat) \
|
O(SYS_UNLINKAT, unlinkat) \
|
||||||
O(SYS_READLINKAT, readlinkat) \
|
O(SYS_READLINKAT, readlinkat) \
|
||||||
O(SYS_MSYNC, msync) \
|
O(SYS_MSYNC, msync) \
|
||||||
|
|||||||
@@ -52,28 +52,27 @@ mode_t umask(mode_t cmask)
|
|||||||
|
|
||||||
int mkdir(const char* path, mode_t mode)
|
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)
|
int mkfifo(const char* path, mode_t mode)
|
||||||
{
|
{
|
||||||
(void)path; (void)mode;
|
return mkfifoat(AT_FDCWD, path, mode);
|
||||||
dwarnln("TODO: mkfifo");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int mkfifoat(int fd, const char* path, mode_t mode)
|
int mkfifoat(int fd, const char* path, mode_t mode)
|
||||||
{
|
{
|
||||||
(void)fd; (void)path; (void)mode;
|
return syscall(SYS_MKFIFOAT, fd, path, __UMASKED_MODE(mode));
|
||||||
dwarnln("TODO: mkfifoat");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int mknod(const char* path, mode_t mode, dev_t dev)
|
int mknod(const char* path, mode_t mode, dev_t dev)
|
||||||
{
|
{
|
||||||
(void)path; (void)mode; (void)dev;
|
return mknodat(AT_FDCWD, path, mode, dev);
|
||||||
dwarnln("TODO: mknod");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int mknodat(int fd, const char* path, mode_t mode, dev_t dev)
|
int mknodat(int fd, const char* path, mode_t mode, dev_t dev)
|
||||||
|
|||||||
Reference in New Issue
Block a user