1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker
6*89c4ff92SAndroid Build Coastguard Worker #include <server/include/basePipeServer/ConnectionHandler.hpp>
7*89c4ff92SAndroid Build Coastguard Worker
8*89c4ff92SAndroid Build Coastguard Worker #include <string>
9*89c4ff92SAndroid Build Coastguard Worker
10*89c4ff92SAndroid Build Coastguard Worker namespace arm
11*89c4ff92SAndroid Build Coastguard Worker {
12*89c4ff92SAndroid Build Coastguard Worker
13*89c4ff92SAndroid Build Coastguard Worker namespace pipe
14*89c4ff92SAndroid Build Coastguard Worker {
15*89c4ff92SAndroid Build Coastguard Worker
ConnectionHandler(const std::string & udsNamespace,const bool setNonBlocking)16*89c4ff92SAndroid Build Coastguard Worker ConnectionHandler::ConnectionHandler(const std::string& udsNamespace, const bool setNonBlocking)
17*89c4ff92SAndroid Build Coastguard Worker {
18*89c4ff92SAndroid Build Coastguard Worker arm::pipe::Initialize();
19*89c4ff92SAndroid Build Coastguard Worker m_ListeningSocket = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
20*89c4ff92SAndroid Build Coastguard Worker
21*89c4ff92SAndroid Build Coastguard Worker if (-1 == m_ListeningSocket)
22*89c4ff92SAndroid Build Coastguard Worker {
23*89c4ff92SAndroid Build Coastguard Worker throw SocketConnectionException(": Socket construction failed: ", 1, 1);
24*89c4ff92SAndroid Build Coastguard Worker }
25*89c4ff92SAndroid Build Coastguard Worker
26*89c4ff92SAndroid Build Coastguard Worker sockaddr_un udsAddress;
27*89c4ff92SAndroid Build Coastguard Worker memset(&udsAddress, 0, sizeof(sockaddr_un));
28*89c4ff92SAndroid Build Coastguard Worker // We've set the first element of sun_path to be 0, skip over it and copy the namespace after it.
29*89c4ff92SAndroid Build Coastguard Worker memcpy(udsAddress.sun_path + 1, udsNamespace.c_str(), strlen(udsNamespace.c_str()));
30*89c4ff92SAndroid Build Coastguard Worker udsAddress.sun_family = AF_UNIX;
31*89c4ff92SAndroid Build Coastguard Worker
32*89c4ff92SAndroid Build Coastguard Worker // Bind the socket to the UDS namespace.
33*89c4ff92SAndroid Build Coastguard Worker if (-1 == bind(m_ListeningSocket, reinterpret_cast<const sockaddr*>(&udsAddress), sizeof(sockaddr_un)))
34*89c4ff92SAndroid Build Coastguard Worker {
35*89c4ff92SAndroid Build Coastguard Worker throw SocketConnectionException(": Binding on socket failed: ", m_ListeningSocket, errno);
36*89c4ff92SAndroid Build Coastguard Worker }
37*89c4ff92SAndroid Build Coastguard Worker // Listen for connections.
38*89c4ff92SAndroid Build Coastguard Worker if (-1 == listen(m_ListeningSocket, 1))
39*89c4ff92SAndroid Build Coastguard Worker {
40*89c4ff92SAndroid Build Coastguard Worker throw SocketConnectionException(": Listen call on socket failed: ", m_ListeningSocket, errno);
41*89c4ff92SAndroid Build Coastguard Worker }
42*89c4ff92SAndroid Build Coastguard Worker
43*89c4ff92SAndroid Build Coastguard Worker if (setNonBlocking)
44*89c4ff92SAndroid Build Coastguard Worker {
45*89c4ff92SAndroid Build Coastguard Worker arm::pipe::SetNonBlocking(m_ListeningSocket);
46*89c4ff92SAndroid Build Coastguard Worker }
47*89c4ff92SAndroid Build Coastguard Worker }
48*89c4ff92SAndroid Build Coastguard Worker
GetNewBasePipeServer(const bool echoPackets)49*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<BasePipeServer> ConnectionHandler::GetNewBasePipeServer(const bool echoPackets)
50*89c4ff92SAndroid Build Coastguard Worker {
51*89c4ff92SAndroid Build Coastguard Worker arm::pipe::Socket clientConnection = arm::pipe::Accept(m_ListeningSocket, nullptr, nullptr, SOCK_CLOEXEC);
52*89c4ff92SAndroid Build Coastguard Worker if (clientConnection < 1)
53*89c4ff92SAndroid Build Coastguard Worker {
54*89c4ff92SAndroid Build Coastguard Worker return nullptr;
55*89c4ff92SAndroid Build Coastguard Worker }
56*89c4ff92SAndroid Build Coastguard Worker return std::make_unique<BasePipeServer>(clientConnection, echoPackets);
57*89c4ff92SAndroid Build Coastguard Worker }
58*89c4ff92SAndroid Build Coastguard Worker
59*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
60*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
61