47 lines
977 B
C
47 lines
977 B
C
|
#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;
|
||
|
|
||
|
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);
|
||
|
};
|