mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 18:25:06 +00:00
Kernel: More work on sockets. Getting there..
This commit is contained in:
parent
a63e8839da
commit
b12ab1270a
3 changed files with 22 additions and 7 deletions
|
@ -19,9 +19,9 @@ RetainPtr<FileDescriptor> FileDescriptor::create(RetainPtr<CharacterDevice>&& de
|
||||||
return adopt(*new FileDescriptor(move(device)));
|
return adopt(*new FileDescriptor(move(device)));
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr<FileDescriptor> FileDescriptor::create(RetainPtr<Socket>&& socket)
|
RetainPtr<FileDescriptor> FileDescriptor::create(RetainPtr<Socket>&& socket, SocketRole role)
|
||||||
{
|
{
|
||||||
return adopt(*new FileDescriptor(move(socket)));
|
return adopt(*new FileDescriptor(move(socket), role));
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr<FileDescriptor> FileDescriptor::create_pipe_writer(FIFO& fifo)
|
RetainPtr<FileDescriptor> FileDescriptor::create_pipe_writer(FIFO& fifo)
|
||||||
|
@ -44,8 +44,9 @@ FileDescriptor::FileDescriptor(RetainPtr<CharacterDevice>&& device)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
FileDescriptor::FileDescriptor(RetainPtr<Socket>&& socket)
|
FileDescriptor::FileDescriptor(RetainPtr<Socket>&& socket, SocketRole role)
|
||||||
: m_socket(move(socket))
|
: m_socket(move(socket))
|
||||||
|
, m_socket_role(role)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,12 @@ class MasterPTY;
|
||||||
class Process;
|
class Process;
|
||||||
class Socket;
|
class Socket;
|
||||||
|
|
||||||
|
enum class SocketRole { None, Accepted, Connected };
|
||||||
|
|
||||||
class FileDescriptor : public Retainable<FileDescriptor> {
|
class FileDescriptor : public Retainable<FileDescriptor> {
|
||||||
public:
|
public:
|
||||||
static RetainPtr<FileDescriptor> create(RetainPtr<Socket>&&);
|
|
||||||
|
static RetainPtr<FileDescriptor> create(RetainPtr<Socket>&&, SocketRole = SocketRole::None);
|
||||||
static RetainPtr<FileDescriptor> create(RetainPtr<Inode>&&);
|
static RetainPtr<FileDescriptor> create(RetainPtr<Inode>&&);
|
||||||
static RetainPtr<FileDescriptor> create(RetainPtr<CharacterDevice>&&);
|
static RetainPtr<FileDescriptor> create(RetainPtr<CharacterDevice>&&);
|
||||||
static RetainPtr<FileDescriptor> create_pipe_writer(FIFO&);
|
static RetainPtr<FileDescriptor> create_pipe_writer(FIFO&);
|
||||||
|
@ -79,7 +82,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class VFS;
|
friend class VFS;
|
||||||
explicit FileDescriptor(RetainPtr<Socket>&&);
|
FileDescriptor(RetainPtr<Socket>&&, SocketRole);
|
||||||
explicit FileDescriptor(RetainPtr<Inode>&&);
|
explicit FileDescriptor(RetainPtr<Inode>&&);
|
||||||
explicit FileDescriptor(RetainPtr<CharacterDevice>&&);
|
explicit FileDescriptor(RetainPtr<CharacterDevice>&&);
|
||||||
FileDescriptor(FIFO&, FIFO::Direction);
|
FileDescriptor(FIFO&, FIFO::Direction);
|
||||||
|
@ -95,6 +98,7 @@ private:
|
||||||
dword m_file_flags { 0 };
|
dword m_file_flags { 0 };
|
||||||
|
|
||||||
RetainPtr<Socket> m_socket;
|
RetainPtr<Socket> m_socket;
|
||||||
|
SocketRole m_socket_role { SocketRole::None };
|
||||||
|
|
||||||
RetainPtr<FIFO> m_fifo;
|
RetainPtr<FIFO> m_fifo;
|
||||||
FIFO::Direction m_fifo_direction { FIFO::Neither };
|
FIFO::Direction m_fifo_direction { FIFO::Neither };
|
||||||
|
|
|
@ -2303,6 +2303,13 @@ int Process::sys$accept(int sockfd, sockaddr* address, socklen_t* address_size)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!validate_write(address, *address_size))
|
if (!validate_write(address, *address_size))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
if (number_of_open_file_descriptors() >= m_max_open_file_descriptors)
|
||||||
|
return -EMFILE;
|
||||||
|
int fd = 0;
|
||||||
|
for (; fd < (int)m_max_open_file_descriptors; ++fd) {
|
||||||
|
if (!m_fds[fd])
|
||||||
|
break;
|
||||||
|
}
|
||||||
auto* descriptor = file_descriptor(sockfd);
|
auto* descriptor = file_descriptor(sockfd);
|
||||||
if (!descriptor)
|
if (!descriptor)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
@ -2315,8 +2322,11 @@ int Process::sys$accept(int sockfd, sockaddr* address, socklen_t* address_size)
|
||||||
}
|
}
|
||||||
auto client = socket.accept();
|
auto client = socket.accept();
|
||||||
ASSERT(client);
|
ASSERT(client);
|
||||||
client->get_address(address, address_size);
|
bool success = client->get_address(address, address_size);
|
||||||
return 0;
|
ASSERT(success);
|
||||||
|
auto client_descriptor = FileDescriptor::create(move(client), SocketRole::Accepted);
|
||||||
|
m_fds[fd].set(move(client_descriptor));
|
||||||
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::sys$connect(int sockfd, const sockaddr*, socklen_t)
|
int Process::sys$connect(int sockfd, const sockaddr*, socklen_t)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue