LibC/Kernel: Implement ttyname_r

This commit is contained in:
Bananymous 2025-07-28 14:56:12 +03:00
parent e72e1e4e43
commit cc04bd0f06
3 changed files with 15 additions and 8 deletions

View File

@ -176,7 +176,7 @@ namespace Kernel
BAN::ErrorOr<long> sys_smo_delete(SharedMemoryObjectManager::Key); BAN::ErrorOr<long> sys_smo_delete(SharedMemoryObjectManager::Key);
BAN::ErrorOr<long> sys_smo_map(SharedMemoryObjectManager::Key); BAN::ErrorOr<long> sys_smo_map(SharedMemoryObjectManager::Key);
BAN::ErrorOr<long> sys_ttyname(int fildes, char* storage); BAN::ErrorOr<long> sys_ttyname(int fildes, char* name, size_t namesize);
BAN::ErrorOr<long> sys_isatty(int fildes); BAN::ErrorOr<long> sys_isatty(int fildes);
BAN::ErrorOr<long> sys_posix_openpt(int flags); BAN::ErrorOr<long> sys_posix_openpt(int flags);
BAN::ErrorOr<long> sys_ptsname(int fildes, char* buffer, size_t buffer_len); BAN::ErrorOr<long> sys_ptsname(int fildes, char* buffer, size_t buffer_len);

View File

@ -2275,17 +2275,17 @@ namespace Kernel
return m_mapped_regions.back()->vaddr(); return m_mapped_regions.back()->vaddr();
} }
BAN::ErrorOr<long> Process::sys_ttyname(int fildes, char* storage) BAN::ErrorOr<long> Process::sys_ttyname(int fildes, char* name, size_t namesize)
{ {
LockGuard _(m_process_lock); LockGuard _(m_process_lock);
TRY(validate_pointer_access(storage, TTY_NAME_MAX, true)); TRY(validate_pointer_access(name, namesize, true));
auto inode = TRY(m_open_file_descriptors.inode_of(fildes)); auto inode = TRY(m_open_file_descriptors.inode_of(fildes));
if (!inode->is_tty()) if (!inode->is_tty())
return BAN::Error::from_errno(ENOTTY); return BAN::Error::from_errno(ENOTTY);
auto path = TRY(m_open_file_descriptors.path_of(fildes)); auto path = TRY(m_open_file_descriptors.path_of(fildes));
ASSERT(path.size() < TTY_NAME_MAX); if (namesize < path.size() + 1)
strncpy(storage, path.data(), path.size()); return BAN::Error::from_errno(ERANGE);
storage[path.size()] = '\0'; strcpy(name, path.data());
return 0; return 0;
} }

View File

@ -787,12 +787,19 @@ char* getlogin(void)
char* ttyname(int fildes) char* ttyname(int fildes)
{ {
static char storage[_POSIX_TTY_NAME_MAX]; static char storage[TTY_NAME_MAX];
if (syscall(SYS_TTYNAME, fildes, storage) == -1) if (ttyname_r(fildes, storage, sizeof(storage)) != 0)
return nullptr; return nullptr;
return storage; return storage;
} }
int ttyname_r(int fildes, char* name, size_t namesize)
{
if (syscall(SYS_TTYNAME, fildes, name, namesize))
return errno;
return 0;
}
int access(const char* path, int amode) int access(const char* path, int amode)
{ {
return syscall(SYS_ACCESS, path, amode); return syscall(SYS_ACCESS, path, amode);