Kernel/LibC: add SYS_STAT and stat(), lstat()
This commit is contained in:
@@ -64,7 +64,7 @@ namespace Kernel
|
||||
BAN::ErrorOr<off_t> tell(int fd);
|
||||
|
||||
BAN::ErrorOr<void> fstat(int fd, struct stat*);
|
||||
BAN::ErrorOr<void> stat(BAN::StringView path, struct stat*);
|
||||
BAN::ErrorOr<void> stat(BAN::StringView path, struct stat*, int flags);
|
||||
|
||||
BAN::ErrorOr<void> mount(BAN::StringView source, BAN::StringView target);
|
||||
|
||||
|
||||
@@ -522,9 +522,9 @@ namespace Kernel
|
||||
return {};
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> Process::stat(BAN::StringView path, struct stat* out)
|
||||
BAN::ErrorOr<void> Process::stat(BAN::StringView path, struct stat* out, int flags)
|
||||
{
|
||||
int fd = TRY(open(path, O_RDONLY | O_NOFOLLOW));
|
||||
int fd = TRY(open(path, flags));
|
||||
auto ret = fstat(fd, out);
|
||||
MUST(close(fd));
|
||||
return ret;
|
||||
|
||||
@@ -534,7 +534,7 @@ argument_done:
|
||||
BAN::String entry_path;
|
||||
TRY(entry_path.append(entry_prefix));
|
||||
TRY(entry_path.append(entry));
|
||||
TRY(Process::current().stat(entry_path, &st));
|
||||
TRY(Process::current().stat(entry_path, &st, O_RDONLY | O_NOFOLLOW));
|
||||
|
||||
Inode::Mode mode { st.st_mode };
|
||||
|
||||
@@ -577,7 +577,7 @@ argument_done:
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
TRY(Process::current().stat(arguments[1], &st));
|
||||
TRY(Process::current().stat(arguments[1], &st, O_RDONLY | O_NOFOLLOW));
|
||||
|
||||
Inode::Mode mode { st.st_mode };
|
||||
|
||||
|
||||
@@ -128,6 +128,14 @@ namespace Kernel
|
||||
return ret.value();
|
||||
}
|
||||
|
||||
long sys_stat(const char* path, struct stat* buf, int flags)
|
||||
{
|
||||
auto ret = Process::current().stat(path, buf, flags);
|
||||
if (ret.is_error())
|
||||
return -ret.error().get_error_code();
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" long sys_fork_trampoline();
|
||||
|
||||
extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5)
|
||||
@@ -193,6 +201,9 @@ namespace Kernel
|
||||
case SYS_WAIT:
|
||||
ret = sys_wait((pid_t)arg1, (int*)arg2, (int)arg3);
|
||||
break;
|
||||
case SYS_STAT:
|
||||
ret = sys_stat((const char*)arg1, (struct stat*)arg2, (int)arg3);
|
||||
break;
|
||||
default:
|
||||
Kernel::panic("Unknown syscall {}", syscall);
|
||||
}
|
||||
|
||||
@@ -180,8 +180,8 @@ static void init2(void* tty1)
|
||||
|
||||
((TTY*)tty1)->initialize_device();
|
||||
|
||||
//MUST(Process::create_userspace("/usr/bin/test"sv));
|
||||
//return;
|
||||
MUST(Process::create_userspace("/usr/bin/Shell"sv));
|
||||
return;
|
||||
|
||||
Process::create_kernel(
|
||||
[](void*)
|
||||
|
||||
Reference in New Issue
Block a user