1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 06:58:11 +00:00

Kernel: More work on sockets. Fleshing out connect().

This commit is contained in:
Andreas Kling 2019-02-14 15:55:19 +01:00
parent b12ab1270a
commit b20a7aca61
7 changed files with 90 additions and 4 deletions

View file

@ -31,11 +31,11 @@ bool LocalSocket::get_address(sockaddr* address, socklen_t* address_size)
bool LocalSocket::bind(const sockaddr* address, socklen_t address_size, int& error)
{
ASSERT(!m_connected);
if (address_size != sizeof(sockaddr_un)) {
error = -EINVAL;
return false;
}
if (address->sa_family != AF_LOCAL) {
error = -EINVAL;
return false;
@ -51,10 +51,46 @@ bool LocalSocket::bind(const sockaddr* address, socklen_t address_size, int& err
if (!m_file) {
if (error == -EEXIST)
error = -EADDRINUSE;
return error;
return false;
}
ASSERT(m_file->inode());
m_file->inode()->bind_socket(*this);
m_address = local_address;
m_bound = true;
return true;
}
RetainPtr<Socket> LocalSocket::connect(const sockaddr* address, socklen_t address_size, int& error)
{
ASSERT(!m_bound);
if (address_size != sizeof(sockaddr_un)) {
error = -EINVAL;
return nullptr;
}
if (address->sa_family != AF_LOCAL) {
error = -EINVAL;
return nullptr;
}
const sockaddr_un& local_address = *reinterpret_cast<const sockaddr_un*>(address);
char safe_address[sizeof(local_address.sun_path) + 1];
memcpy(safe_address, local_address.sun_path, sizeof(local_address.sun_path));
kprintf("%s(%u) LocalSocket{%p} connect(%s)\n", current->name().characters(), current->pid(), safe_address);
m_file = VFS::the().open(safe_address, error, 0, 0, *current->cwd_inode());
if (!m_file) {
error = -ECONNREFUSED;
return nullptr;
}
ASSERT(m_file->inode());
ASSERT(m_file->inode()->socket());
m_peer = m_file->inode()->socket();
m_address = local_address;
m_connected = true;
return m_peer;
}