73 lines
1.7 KiB
C++
73 lines
1.7 KiB
C++
#pragma once
|
|
#include "net/Socket.h"
|
|
#include "thread/Thread.h"
|
|
#include <luna/Buffer.h>
|
|
#include <luna/CircularQueue.h>
|
|
#include <luna/String.h>
|
|
#include <sys/un.h>
|
|
|
|
class UnixSocket : public Socket
|
|
{
|
|
public:
|
|
UnixSocket();
|
|
UnixSocket(UnixSocket* peer);
|
|
|
|
bool will_block_if_read() const override
|
|
{
|
|
return (m_state == Connected || m_state == Reset) && !m_data.size();
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
bool peer_disconnected() const override
|
|
{
|
|
return m_state == Reset;
|
|
}
|
|
|
|
Result<usize> send(const u8*, usize, int) override;
|
|
Result<usize> recv(u8*, usize, int) const override;
|
|
|
|
Result<void> bind(struct sockaddr*, socklen_t) override;
|
|
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;
|
|
|
|
void did_close() override;
|
|
|
|
void connect_to_peer(UnixSocket* peer);
|
|
|
|
virtual ~UnixSocket();
|
|
|
|
private:
|
|
enum State
|
|
{
|
|
Inactive,
|
|
Bound,
|
|
Listening,
|
|
Connecting,
|
|
Connected,
|
|
Reset,
|
|
};
|
|
|
|
State m_state = State::Inactive;
|
|
UnixSocket* m_peer = nullptr;
|
|
|
|
mutable Buffer m_data;
|
|
|
|
Thread* m_blocked_thread { nullptr };
|
|
|
|
DynamicCircularQueue<UnixSocket*> m_listen_queue;
|
|
|
|
struct sockaddr_un m_addr = { .sun_family = AF_UNIX, .sun_path = {} };
|
|
socklen_t m_addrlen = sizeof(sa_family_t);
|
|
};
|