2023-07-27 14:37:10 +00:00
|
|
|
#pragma once
|
|
|
|
#include "net/Socket.h"
|
2023-07-28 15:30:20 +00:00
|
|
|
#include "thread/Thread.h"
|
2023-07-27 14:37:10 +00:00
|
|
|
#include <luna/Buffer.h>
|
2023-07-28 15:30:20 +00:00
|
|
|
#include <luna/CircularQueue.h>
|
2023-07-27 14:37:10 +00:00
|
|
|
#include <luna/String.h>
|
|
|
|
#include <sys/un.h>
|
|
|
|
|
|
|
|
class UnixSocket : public Socket
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
UnixSocket();
|
|
|
|
UnixSocket(UnixSocket* peer);
|
|
|
|
|
2023-07-30 09:41:53 +00:00
|
|
|
bool will_block_if_read() const override
|
2023-07-27 14:37:10 +00:00
|
|
|
{
|
2023-07-28 15:30:20 +00:00
|
|
|
return (m_state == Connected || m_state == Reset) && !m_data.size();
|
2023-07-27 14:37:10 +00:00
|
|
|
}
|
|
|
|
|
2023-08-03 14:28:14 +00:00
|
|
|
bool can_read_data() const override
|
|
|
|
{
|
|
|
|
return (m_state == Connected || m_state == Reset) && m_data.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool can_accept_connections() const override
|
|
|
|
{
|
|
|
|
return !m_listen_queue.is_empty();
|
|
|
|
}
|
|
|
|
|
2023-07-27 14:37:10 +00:00
|
|
|
Result<usize> send(const u8*, usize, int) override;
|
|
|
|
Result<usize> recv(u8*, usize, int) const override;
|
|
|
|
|
2023-08-01 15:20:28 +00:00
|
|
|
Result<void> bind(struct sockaddr*, socklen_t) override;
|
2023-07-28 15:30:20 +00:00
|
|
|
Result<void> connect(Registers*, int, struct sockaddr*, socklen_t) override;
|
|
|
|
Result<SharedPtr<OpenFileDescription>> accept(Registers*, int, struct sockaddr**, socklen_t*) override;
|
|
|
|
|
|
|
|
Result<void> listen(int backlog) override;
|
2023-07-27 14:37:10 +00:00
|
|
|
|
2023-07-27 17:21:46 +00:00
|
|
|
void did_close() override;
|
|
|
|
|
2023-07-27 14:37:10 +00:00
|
|
|
void connect_to_peer(UnixSocket* peer);
|
|
|
|
|
|
|
|
virtual ~UnixSocket();
|
|
|
|
|
|
|
|
private:
|
|
|
|
enum State
|
|
|
|
{
|
|
|
|
Inactive,
|
|
|
|
Bound,
|
|
|
|
Listening,
|
|
|
|
Connecting,
|
|
|
|
Connected,
|
|
|
|
Reset,
|
|
|
|
};
|
|
|
|
|
|
|
|
State m_state = State::Inactive;
|
2023-07-28 15:30:20 +00:00
|
|
|
UnixSocket* m_peer = nullptr;
|
2023-07-27 14:37:10 +00:00
|
|
|
|
|
|
|
mutable Buffer m_data;
|
|
|
|
|
2023-07-28 15:30:20 +00:00
|
|
|
Thread* m_blocked_thread { nullptr };
|
|
|
|
|
|
|
|
DynamicCircularQueue<UnixSocket*> m_listen_queue;
|
|
|
|
|
2023-07-27 14:37:10 +00:00
|
|
|
struct sockaddr_un m_addr = { .sun_family = AF_UNIX, .sun_path = {} };
|
|
|
|
socklen_t m_addrlen = sizeof(sa_family_t);
|
|
|
|
};
|