LibC/Kernel: Implement ttyname_r
This commit is contained in:
parent
e72e1e4e43
commit
cc04bd0f06
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue