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

Kernel: More sockets work. Fleshing out accept().

This commit is contained in:
Andreas Kling 2019-02-14 15:17:30 +01:00
parent 1d66670ad7
commit 54b1d6f57f
7 changed files with 103 additions and 9 deletions

View file

@ -2258,7 +2258,12 @@ int Process::sys$socket(int domain, int type, int protocol)
if (!socket)
return error;
auto descriptor = FileDescriptor::create(move(socket));
m_fds[fd].set(move(descriptor));
unsigned flags = 0;
if (type & SOCK_CLOEXEC)
flags |= O_CLOEXEC;
if (type & SOCK_NONBLOCK)
descriptor->set_blocking(false);
m_fds[fd].set(move(descriptor), flags);
return fd;
}
@ -2280,12 +2285,38 @@ int Process::sys$bind(int sockfd, const sockaddr* address, socklen_t address_len
int Process::sys$listen(int sockfd, int backlog)
{
return -ENOTIMPL;
auto* descriptor = file_descriptor(sockfd);
if (!descriptor)
return -EBADF;
if (!descriptor->is_socket())
return -ENOTSOCK;
auto& socket = *descriptor->socket();
int error;
if (!socket.listen(backlog, error))
return error;
return 0;
}
int Process::sys$accept(int sockfd, sockaddr*, socklen_t)
int Process::sys$accept(int sockfd, sockaddr* address, socklen_t* address_size)
{
return -ENOTIMPL;
if (!validate_write_typed(address_size))
return -EFAULT;
if (!validate_write(address, *address_size))
return -EFAULT;
auto* descriptor = file_descriptor(sockfd);
if (!descriptor)
return -EBADF;
if (!descriptor->is_socket())
return -ENOTSOCK;
auto& socket = *descriptor->socket();
if (!socket.can_accept()) {
ASSERT(!descriptor->is_blocking());
return -EAGAIN;
}
auto client = socket.accept();
ASSERT(client);
client->get_address(address, address_size);
return 0;
}
int Process::sys$connect(int sockfd, const sockaddr*, socklen_t)