Luna/kernel/src/net/UnixSocket.h

58 lines
1.4 KiB
C
Raw Normal View History

#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();
}
Result<usize> send(const u8*, usize, int) override;
Result<usize> recv(u8*, usize, int) const override;
Result<void> bind(SharedPtr<Socket>, 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);
};