2023-07-27 14:37:10 +00:00
|
|
|
#pragma once
|
|
|
|
#include "net/Socket.h"
|
|
|
|
#include <luna/Buffer.h>
|
|
|
|
#include <luna/String.h>
|
|
|
|
#include <sys/un.h>
|
|
|
|
|
|
|
|
class UnixSocket : public Socket
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
UnixSocket();
|
|
|
|
UnixSocket(UnixSocket* peer);
|
|
|
|
|
|
|
|
bool blocking() const override
|
|
|
|
{
|
|
|
|
return !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(struct sockaddr*, socklen_t) override;
|
|
|
|
|
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;
|
|
|
|
UnixSocket* m_peer;
|
|
|
|
|
|
|
|
mutable Buffer m_data;
|
|
|
|
|
|
|
|
struct sockaddr_un m_addr = { .sun_family = AF_UNIX, .sun_path = {} };
|
|
|
|
socklen_t m_addrlen = sizeof(sa_family_t);
|
|
|
|
};
|