forked from Bananymous/banan-os
Kernel/LibC: Implement dummy syscalls for accept, connect, listen
This commit is contained in:
@@ -116,6 +116,14 @@ namespace Kernel
|
||||
return link_target_impl();
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> Inode::accept(sockaddr* address, socklen_t* address_len)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
if (!mode().ifsock())
|
||||
return BAN::Error::from_errno(ENOTSOCK);
|
||||
return accept_impl(address, address_len);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> Inode::bind(const sockaddr* address, socklen_t address_len)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
@@ -124,7 +132,23 @@ namespace Kernel
|
||||
return bind_impl(address, address_len);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<ssize_t> Inode::sendto(const sys_sendto_t* arguments)
|
||||
BAN::ErrorOr<void> Inode::connect(const sockaddr* address, socklen_t address_len)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
if (!mode().ifsock())
|
||||
return BAN::Error::from_errno(ENOTSOCK);
|
||||
return connect_impl(address, address_len);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> Inode::listen(int backlog)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
if (!mode().ifsock())
|
||||
return BAN::Error::from_errno(ENOTSOCK);
|
||||
return listen_impl(backlog);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<size_t> Inode::sendto(const sys_sendto_t* arguments)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
if (!mode().ifsock())
|
||||
@@ -132,7 +156,7 @@ namespace Kernel
|
||||
return sendto_impl(arguments);
|
||||
};
|
||||
|
||||
BAN::ErrorOr<ssize_t> Inode::recvfrom(sys_recvfrom_t* arguments)
|
||||
BAN::ErrorOr<size_t> Inode::recvfrom(sys_recvfrom_t* arguments)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
if (!mode().ifsock())
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace Kernel
|
||||
return m_network_layer.bind_socket(dst_port, this);
|
||||
}
|
||||
|
||||
BAN::ErrorOr<ssize_t> NetworkSocket::sendto_impl(const sys_sendto_t* arguments)
|
||||
BAN::ErrorOr<size_t> NetworkSocket::sendto_impl(const sys_sendto_t* arguments)
|
||||
{
|
||||
if (arguments->flags)
|
||||
{
|
||||
@@ -52,7 +52,7 @@ namespace Kernel
|
||||
return TRY(m_network_layer.sendto(*this, arguments));
|
||||
}
|
||||
|
||||
BAN::ErrorOr<ssize_t> NetworkSocket::recvfrom_impl(sys_recvfrom_t* arguments)
|
||||
BAN::ErrorOr<size_t> NetworkSocket::recvfrom_impl(sys_recvfrom_t* arguments)
|
||||
{
|
||||
sockaddr_in* sender_addr = nullptr;
|
||||
if (arguments->address)
|
||||
|
||||
@@ -901,6 +901,27 @@ namespace Kernel
|
||||
return TRY(m_open_file_descriptors.socket(domain, type, protocol));
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_accept(int socket, sockaddr* address, socklen_t* address_len)
|
||||
{
|
||||
if (address && !address_len)
|
||||
return BAN::Error::from_errno(EINVAL);
|
||||
if (!address && address_len)
|
||||
return BAN::Error::from_errno(EINVAL);
|
||||
|
||||
LockGuard _(m_lock);
|
||||
if (address)
|
||||
{
|
||||
TRY(validate_pointer_access(address_len, sizeof(*address_len)));
|
||||
TRY(validate_pointer_access(address, *address_len));
|
||||
}
|
||||
|
||||
auto inode = TRY(m_open_file_descriptors.inode_of(socket));
|
||||
if (!inode->mode().ifsock())
|
||||
return BAN::Error::from_errno(ENOTSOCK);
|
||||
|
||||
TRY(inode->accept(address, address_len));
|
||||
return 0;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_bind(int socket, const sockaddr* address, socklen_t address_len)
|
||||
{
|
||||
@@ -915,6 +936,31 @@ namespace Kernel
|
||||
return 0;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_connect(int socket, const sockaddr* address, socklen_t address_len)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
TRY(validate_pointer_access(address, address_len));
|
||||
|
||||
auto inode = TRY(m_open_file_descriptors.inode_of(socket));
|
||||
if (!inode->mode().ifsock())
|
||||
return BAN::Error::from_errno(ENOTSOCK);
|
||||
|
||||
TRY(inode->connect(address, address_len));
|
||||
return 0;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_listen(int socket, int backlog)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
|
||||
auto inode = TRY(m_open_file_descriptors.inode_of(socket));
|
||||
if (!inode->mode().ifsock())
|
||||
return BAN::Error::from_errno(ENOTSOCK);
|
||||
|
||||
TRY(inode->listen(backlog));
|
||||
return 0;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<long> Process::sys_sendto(const sys_sendto_t* arguments)
|
||||
{
|
||||
LockGuard _(m_lock);
|
||||
|
||||
@@ -228,6 +228,15 @@ namespace Kernel
|
||||
case SYS_IOCTL:
|
||||
ret = Process::current().sys_ioctl((int)arg1, (int)arg2, (void*)arg3);
|
||||
break;
|
||||
case SYS_ACCEPT:
|
||||
ret = Process::current().sys_accept((int)arg1, (sockaddr*)arg2, (socklen_t*)arg3);
|
||||
break;
|
||||
case SYS_CONNECT:
|
||||
ret = Process::current().sys_connect((int)arg1, (const sockaddr*)arg2, (socklen_t)arg3);
|
||||
break;
|
||||
case SYS_LISTEN:
|
||||
ret = Process::current().sys_listen((int)arg1, (int)arg2);
|
||||
break;
|
||||
default:
|
||||
dwarnln("Unknown syscall {}", syscall);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user