22 memset(m_Socket, 0,
sizeof(m_Socket));
24 m_Socket[0].fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
25 if (m_Socket[0].fd == -1)
32 memset(&server, 0,
sizeof(sockaddr_un));
34 memcpy(server.sun_path, m_GatorNamespace, strlen(m_GatorNamespace + 1) + 1);
35 server.sun_family = AF_UNIX;
36 if (0 != connect(m_Socket[0].fd, reinterpret_cast<const sockaddr*>(&server),
sizeof(sockaddr_un)))
43 m_Socket[0].events = POLLIN;
55 return m_Socket[0].fd > 0;
65 memset(m_Socket, 0,
sizeof(m_Socket));
70 if (buffer ==
nullptr || length == 0)
81 int bytes_available = 0;
83 if (bytes_available >= 8)
86 return ReceivePacket();
90 int pollResult =
Sockets::Poll(&m_Socket[0], 1, static_cast<int>(timeout));
102 if (m_Socket[0].revents & (POLLNVAL | POLLERR | POLLHUP))
104 if (m_Socket[0].revents == POLLNVAL)
110 if (m_Socket[0].revents == POLLERR)
115 if (m_Socket[0].revents == POLLHUP)
124 if (!(m_Socket[0].revents & (POLLIN)))
131 return ReceivePacket();
135 Packet SocketProfilingConnection::ReceivePacket()
138 long receiveResult =
Sockets::Read(m_Socket[0].fd, &header,
sizeof(header));
140 switch( receiveResult )
151 if (receiveResult < 8)
159 uint32_t metadataIdentifier = 0;
160 std::memcpy(&metadataIdentifier, header,
sizeof(metadataIdentifier));
163 uint32_t dataLength = 0;
164 std::memcpy(&dataLength, header + 4u,
sizeof(dataLength));
166 std::unique_ptr<unsigned char[]> packetData;
169 packetData = std::make_unique<unsigned char[]>(dataLength);
170 long receivedLength =
Sockets::Read(m_Socket[0].fd, packetData.get(), dataLength);
171 if (receivedLength < 0)
175 if (dataLength != static_cast<uint32_t>(receivedLength))
182 return Packet(metadataIdentifier, dataLength, packetData);
long Write(Socket s, const void *buf, size_t len)
bool IsOpen() const final
bool WritePacket(const unsigned char *buffer, uint32_t length) final
bool Initialize()
Performs any required one-time setup.
long Read(Socket s, void *buf, size_t len)
int Poll(PollFd *fds, nfds_t numFds, int timeout)
SocketProfilingConnection()
int Ioctl(Socket s, unsigned long int cmd, void *arg)
Packet ReadPacket(uint32_t timeout) final
bool SetNonBlocking(Socket s)