Kernel/LibC: Implement realpath
realpath is implemented as a syscall. This is not really required but it was the easiest way to get it working as there is already path canonicalization at kernel level.
This commit is contained in:
parent
3c57e05a65
commit
af4b138094
|
@ -149,6 +149,8 @@ namespace Kernel
|
||||||
BAN::ErrorOr<long> sys_fstatat(int fd, const char* path, struct stat* buf, int flag);
|
BAN::ErrorOr<long> sys_fstatat(int fd, const char* path, struct stat* buf, int flag);
|
||||||
BAN::ErrorOr<long> sys_stat(const char* path, struct stat* buf, int flag);
|
BAN::ErrorOr<long> sys_stat(const char* path, struct stat* buf, int flag);
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> sys_realpath(const char* path, char* buffer);
|
||||||
|
|
||||||
BAN::ErrorOr<long> sys_sync(bool should_block);
|
BAN::ErrorOr<long> sys_sync(bool should_block);
|
||||||
|
|
||||||
static BAN::ErrorOr<long> clean_poweroff(int command);
|
static BAN::ErrorOr<long> clean_poweroff(int command);
|
||||||
|
|
|
@ -1238,6 +1238,22 @@ namespace Kernel
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> Process::sys_realpath(const char* path, char* buffer)
|
||||||
|
{
|
||||||
|
LockGuard _(m_process_lock);
|
||||||
|
TRY(validate_string_access(path));
|
||||||
|
TRY(validate_pointer_access(buffer, PATH_MAX));
|
||||||
|
|
||||||
|
auto absolute_path = TRY(absolute_path_of(path));
|
||||||
|
|
||||||
|
auto file = TRY(VirtualFileSystem::get().file_from_absolute_path(m_credentials, absolute_path, O_SEARCH));
|
||||||
|
if (file.canonical_path.size() >= PATH_MAX)
|
||||||
|
return BAN::Error::from_errno(ENAMETOOLONG);
|
||||||
|
|
||||||
|
strcpy(buffer, file.canonical_path.data());
|
||||||
|
return file.canonical_path.size();
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> Process::sys_sync(bool should_block)
|
BAN::ErrorOr<long> Process::sys_sync(bool should_block)
|
||||||
{
|
{
|
||||||
DevFileSystem::get().initiate_sync(should_block);
|
DevFileSystem::get().initiate_sync(should_block);
|
||||||
|
|
|
@ -81,6 +81,7 @@ __BEGIN_DECLS
|
||||||
O(SYS_GETSOCKNAME, getsockname) \
|
O(SYS_GETSOCKNAME, getsockname) \
|
||||||
O(SYS_GETSOCKOPT, getsockopt) \
|
O(SYS_GETSOCKOPT, getsockopt) \
|
||||||
O(SYS_SETSOCKOPT, setsockopt) \
|
O(SYS_SETSOCKOPT, setsockopt) \
|
||||||
|
O(SYS_REALPATH, realpath) \
|
||||||
|
|
||||||
enum Syscall
|
enum Syscall
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <icxxabi.h>
|
#include <icxxabi.h>
|
||||||
|
@ -368,6 +369,22 @@ char* getenv(const char* name)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* realpath(const char* __restrict file_name, char* __restrict resolved_name)
|
||||||
|
{
|
||||||
|
char buffer[PATH_MAX] {};
|
||||||
|
long canonical_length = syscall(SYS_REALPATH, file_name, buffer);
|
||||||
|
if (canonical_length == -1)
|
||||||
|
return NULL;
|
||||||
|
if (resolved_name == NULL)
|
||||||
|
{
|
||||||
|
resolved_name = static_cast<char*>(malloc(canonical_length + 1));
|
||||||
|
if (resolved_name == NULL)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strcpy(resolved_name, buffer);
|
||||||
|
return resolved_name;
|
||||||
|
}
|
||||||
|
|
||||||
int system(const char* command)
|
int system(const char* command)
|
||||||
{
|
{
|
||||||
// FIXME
|
// FIXME
|
||||||
|
|
Loading…
Reference in New Issue